VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

@variable变量

功能描述

Vastbase在SQL Server兼容模式下支持@variable变量,用于兼容PL/pgSQL、普通SQL中的变量,也可以作为普通变量使用,可以达到和普通变量相同的使用效果。

注意事项

  • 该功能仅在数据库兼容模式为SQL Server时支持(即数据库实例初始化时指定DBCOMPATIBILITY='MSSQL')。

  • 使用此功能需要设置参数enable_set_variable_mssql_format,表示允许数据库在SQL Server兼容模式下使用@variable变量语法。具体设置如下:

     set enable_set_variable_mssql_format=1; 
    
  • 当前暂时不支持@variable类型的表变量,如:select ... from @var_table

  • 匿名块中使用了@variable变量,匿名块开启第一句不支持declare @variable,后面的变量支持@variable变量用法。

  • 当变量已经被赋值,此时如果使用SELECT @var_name = expression,expression的值来自表的字段引用且无返回值则保持原值。

  • 当变量已经被赋值,此时如果使用SELECT @var_name = expression,expression的值来自子查询且无返回值则置为NULL。

  • 使用@variable变量时,需要在@前加空格。

示例

示例1: 使用declare给变量赋值。

1、设置GUC参数。

set enable_set_variable_mssql_format=1; 

2、使用declare给变量赋值。

declare @b_1140655 int=3+8;

3、查询变量内容。

select @b_1140655;

返回结果为:

 @b_1140655
------------
         11
(1 row)

示例2: 在insert语句中使用@变量。

1、设置GUC参数。

set enable_set_variable_mssql_format=1; 

2、创建测试表。

create table tab1_1140770(id int,a1 varchar(8));
create table tab2_1140770(id int,a1 varchar(8));
create table tab3_1140770(id int,a1 varchar(8));
create table tab4_1140770(id int,a1 varchar(8));

3、声明变量。

declare @a_1140770 int=1;
declare @b_1140770 varchar(8)='a';

4、执行insert语句。

insert all
into tab1_1140770 values(@a_1140770,@b_1140770 || 1)
into tab2_1140770 values(@a_1140770*2,@b_1140770 || 2)
into tab3_1140770 values(@a_1140770*3,@b_1140770 || 3)
into tab4_1140770 values(@a_1140770*4,@b_1140770 || 4)
select 1 from dual;

5、执行select语句查询表中数据。

select * from tab1_1140770 order by id;
select * from tab2_1140770 order by id;
select * from tab3_1140770 order by id;
select * from tab4_1140770 order by id;

返回结果依次为:

 id | a1
----+----
  1 | a1
(1 row)

 id | a1
----+----
  2 | a2
(1 row)

 id | a1
----+----
  3 | a3
(1 row)

 id | a1
----+----
  4 | a4
(1 row)

示例3: 存储过程支持@variable形式的出入参。

1、设置GUC参数。

set enable_set_variable_mssql_format=1; 

2、创建表并插入数据。

create table t1(a int,b int);
create table t2(a int);
insert into t1 values(1,2),(3,4);
insert into t2 values(123),(789);

3、创建存储过程,出入参inout使用@variable变量。

create or replace procedure proc_1172769(aa int, inout @re1 int, inout @re2 int) as
declare i int default 1;
begin
@re1 = aa + 2;
@re2 = aa + 122;
select a,b from t1 where a = @re1;
select * from t2 where a != @re2;
end;
/

4、调用存储过程。

call proc_1172769(1,@a,@b);

返回结果如下:

 a | b
---+---
 3 | 4
(1 row)

  a
-----
 789
(1 row)

CALL

示例4: 存储过程的过程外层使用declare @variable,过程内部使用set @variable和select @variable。

1、设置GUC参数。

set enable_set_variable_mssql_format=1; 

2、创建表并插入数据。

create table t1(a int,b int);
create table t2(a int,b varchar(10));
insert into t1 values(1,2),(3,4);
insert into t2 values(123,'test1'),(456,'test2');

3、创建存储过程,外层使用declare @variable,内部使用set @variable和select @variable。

create or replace procedure proc_1172792(aa int, inout re1 int, out re2 int) as
declare @aa as int;
result1 int;
result2 varchar(10);
begin
set @aa=1;
aa := @aa;
re1 := @aa + 2;
re2 := @aa + 122;
insert into t1 values(re1,re2);
insert into t2 values(re2,'test'||re1);
select a,b from t1 where a = re1;
select a,b into result1,result2 from t2 where b = 'test'||re1;
select @aa;
select aa;
select re1;
select re2;
end;
/

4、调用存储过程。

call proc_1172792(@a,@b,@c);

返回结果如下:

 a |  b
---+-----
 3 |   4
 3 | 123
(2 rows)

 @aa
-----
   1
(1 row)

 aa
----
  1
(1 row)

 re1
-----
   3
(1 row)

 re2
-----
 123
(1 row)

CALL