@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