GBase 8s存储过程通过table(set)实现投影列绑定变量
从Oracle迁移到GBase 8s数据库时,存储过程中有使用游标绑定投影列的语法:
open cursor1 for 'select ? as username, ? usertext from dual' using p_username, p_usertext;
这个语法(投影列绑定变量)在GBase 8s中暂时还是不支持的。由于使用的是dual表,实际上只是需要返回这两个值到游标上。我们可以通过如下改造,达到类似的效果。示例存储过程如下:
-- 转换后的存储过程(缩减)
drop procedure if exists proc_table_set;
create procedure proc_table_set(p_username varchar(40), p_usertext varchar(128), out cursor1 sys_refcursor);
-- 每个字段均需要一个 table(set{?}),
-- table(set{?}) as t1(username) 对应一个内部表t1及字段名username
-- table(set{?}) 不允许null,故需要强制 nvl()转换成''
open cursor1 for 'select username,usertext from table(set{?}) as t1(username),table(set{?}) as t2(usertext)' using nvl(p_username,''),nvl(p_usertext,'');
end procedure;
-- 调用proc_table_set,返回值。
drop procedure if exists proc_table_set_call;
create procedure proc_table_set_call() returns varchar(128);
define cursor1 sys_refcursor;
define v_name varchar(128);
define v_text varchar(128);
let cursor1 = null;
-- call proc_table_set, 获取游标cursor1
call proc_table_set("myusername",null,cursor1);
fetch cursor1 into v_name, v_text;
return v_name || "-" || v_text;
end procedure;
执行结果正常
> call proc_table_set_call();
(expression) myusername-
1 row(s) retrieved.
其实也可以改成不绑定变量,而使用拼接的方式,也是可行的。
-- proc_table_set改成proc_concat
drop procedure if exists proc_concat;
create procedure proc_concat(p_username varchar(40), p_usertext varchar(128), out cursor1 sys_refcursor);
define query_sql lvarchar(1024);
let query_sql = "select '" || nvl(p_username,'') || "' as username, '" || nvl(p_usertext,'') || "' as usertext from dual";
open cursor1 for query_sql;
-- 不能直接使用下面这行(两语句合并),而应分步实现。
-- open cursor1 for "select '" || nvl(p_username,'') || "' as username, '" || nvl(p_usertext,'') || "' as usertext from dual";
end procedure;
总结:
可以使用两种方式实现:
1,table(set)方式绑定变量
open cursor1 for 'select username,usertext from table(set{?}) as t1(username),table(set{?}) as t2(usertext)' using nvl(p_username,''),nvl(p_usertext,'');
2,字符串拼接
define query_sql lvarchar(1024);
let query_sql = "select '" || nvl(p_username,'') || "' as username, '" || nvl(p_usertext,'') || "' as usertext from dual";
open cursor1 for query_sql;
- 上一篇: GBase 8s数据库安装常见问题解析
- 下一篇: Hibernate操作GBase 8s数据库示例