GBase 8s
适配迁移
问答
存储过程含大量sql语句
发表于2024-11-20 09:30:02120次浏览9个评论
在一个sqlserver的存储过程中,需要接收参数,并用这些参数构建sql语句,同时还用某些参数进行判断来决定sql语句中某些内容是否该有,最后EXEC sp_executesql @sql;
sql语句是NVARCHAR类型,构建完成后包含比较复杂且大量的联表查询,如果转成gbase,用什么方式实现比较好?
评论
登录后才可以发表评论
liaosnet发表于 1年前
GBase 8s中有动态SQL。拼接好字符串后,使用execute immediate 来执行。
GBase用户24232发表于 1年前
@liaosnet:我参照官网上的指南:教程,如下写了一个例子,bigquery的值写什么,以及这个存储过程的外部调用语句该怎么写?
DROP PROCEDURE IF EXISTS P_GenerateCode;
CREATE PROCEDURE P_GenerateCode
(
tabid int,
tabname NVARCHAR(100)
)
EXEC SQL BEGIN DECLARE SECTION;
char bigquery[270] = "begin work;";
EXEC SQL END DECLARE SECTION;
stcat ("SELECT * from systables WHERE tabid = ? and ", bigquery);
stcat ("tabname = ?;', bigquery);
EXEC SQL prepare bigq from :bigquery;
EXEC SQL execute bigq using :tabid, :tabname;
EXEC SQL commit work;
END PROCEDURE
DROP PROCEDURE IF EXISTS P_GenerateCode;
CREATE PROCEDURE P_GenerateCode
(
tabid int,
tabname NVARCHAR(100)
)
EXEC SQL BEGIN DECLARE SECTION;
char bigquery[270] = "begin work;";
EXEC SQL END DECLARE SECTION;
stcat ("SELECT * from systables WHERE tabid = ? and ", bigquery);
stcat ("tabname = ?;', bigquery);
EXEC SQL prepare bigq from :bigquery;
EXEC SQL execute bigq using :tabid, :tabname;
EXEC SQL commit work;
END PROCEDURE
GBase用户24232发表于 1年前
@liaosnet:

GBase用户24232发表于 1年前

liaosnet发表于 1年前
@GBase用户24232:drop function if exists proc_execsql(int);
create function proc_execsql(p_id int)
returns int as rc;
define v_sql_err int;
define v_sqlstr lvarchar(16384);
on exception set v_sql_err
return v_sql_err;
end exception;
let v_sqlstr = '';
let v_sqlstr = 'delete from user1 where id = ' || p_id;
execute immediate v_sqlstr;
return 0;
end function;
call proc_execsql(1);
create function proc_execsql(p_id int)
returns int as rc;
define v_sql_err int;
define v_sqlstr lvarchar(16384);
on exception set v_sql_err
return v_sql_err;
end exception;
let v_sqlstr = '';
let v_sqlstr = 'delete from user1 where id = ' || p_id;
execute immediate v_sqlstr;
return 0;
end function;
call proc_execsql(1);
最佳回答
GBase用户24232发表于 1年前
@liaosnet:但是用查询的话,这种方式给出的是错误的值,有什么解决办法吗
GBase用户24232发表于 1年前
@liaosnet:

崔哥发表于 8个月前
一树春风千万枝,嫩于金色软于丝。永丰西角荒园里,尽日无人属阿谁?
levvel发表于 5个月前
评论是对发帖人的一种尊重
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526