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;

标签: 投影列绑定变量, 投影列, table set

添加新评论