📄 sql存储过程中执行动态sql语句.txt
字号:
>> ChinaUnix.net > DB2
怎样SQL存储过程中执行动态SQL语句,急急急!!
作者:zhouhaiming 发表时间:2003/01/07 11:29am
create procedure referesh(in odd_table_name varchar(100), in ods_table_name varchar(100))
language sql
begin
我想实现如下逻辑
create table ods_table_name as
select * from odd_table_name
因为ods_table_name和odd_table_name都需要在运行时确定,所以需要使用动态SQL技术,请问如何实现??
end @
--------------------------------------------------------------------------------
此文章相关评论:
该文章有19个相关评论如下:(点这儿可以发表评论)
ddmmdd 发表于: 2003/01/07 11:54am
最好用c写。
zhouhaiming 发表于: 2003/01/07 12:06pm
能在SQL存储过程中实现此种功能吗?哪位高手知道的话请答复一下,先谢了。
vlife 发表于: 2003/01/07 05:05pm
1、db2根据一个表的机构创建另外的一个表是:create table table1 like table2,create table table1 as select * from table2可以用吗?我记得用过不可以的啊。2、纯sql的好象不能动态表名,列名等这种功能。
zhouhaiming 发表于: 2003/01/07 08:48pm
vlife你说的非常对(1、db2根据一个表的机构创建另外的一个表是:create table table1 like table2,create table table1 as select * from table2可以用吗?我记得用过不可以的啊。),你说的第二点(2、纯sql的好象不能动态表名,列名等这种功能)不知道有没有高手清楚请给一个准确的回答
zhouhaiming 发表于: 2003/01/07 09:03pm
(转贴)
你试试下面的代码
create procedure referesh(in odd_table_name varchar(100), in ods_table_name varchar(100))
language sql
begin
declare sSql varchar(1000) ;
sSql = 'create table ' || ods_table_name ||
' as select * from ' || odd_table_name ;
prepare s1 from sSql;
execute s1;
end @
zhouhaiming 发表于: 2003/01/07 09:04pm
(转贴)
sorry 刚才有个地方写错了
sSql = 之前要加上 Set
应该是
Set sSql = ......
zhouhaiming 发表于: 2003/01/07 09:05pm
(转贴)
mcf你好,你所说的我都试了,我的代码如下
--文件名称:refresh.db2
--目 标:以刷新的方式把odd(Operational Data Definition )中的数据整理到ODS(Operational
-- Data Store)中
--摘 要:
--当前版本:1.0
--作 者:周海明
--完成日期:
--取代版本:
--原作者 :
--完成日期:
create procedure refresh(in odd_table varchar(100), in ods_table varchar(100), out errorCode integer, out errorLabel varchar(255))
language sql
P1 begin
declare SQLCODE integer default 0;
declare stmt varchar(1024);
declare EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
set errorCode = SQLCODE;
set errorCode = 0;
set stmt = 'delete from ?';
set errorLabel = 'refresh:The line number is 28.';
--使用prepare语句为这个语句生成存取方案
prepare prep_stmt from stmt;
set errorLabel = 'rerresh:The line number is 31.';
--使用execute语句执行动态sql语句
execute prep_stmt using ods_table;
set stmt = 'insert into ? '||
'select * from ?';
set errorLabel = 'refresh:The line number is 38.';
--使用prepare语句为这个语句生成存取方案
prepare prep_stmt from stmt;
set errorLabel = 'refresh:The line number is 41.';
--使用execute语句执行动态sql语句
execute prep_stmt using ods_table, odd_table;
set errorLable = ''; --当全部sql语句都正确执行时把errorLable变量赋值为空串
end P1
但我在DB2 8.1版本的开发中心编译它的时候系统报错,报错信息如下
TEST.refresh ― 构建已启动。
创建 存储过程 返回 -198。
[IBM][CLI Driver][DB2/NT] SQL0198N PREPARE 或 EXECUTE IMMEDIATE 语句的语句字符串为空白或空。 SQLSTATE=42617
TEST.refresh ― 构建失败。
TEST.refresh ― 回滚成功完成。
我查了查SQL0198N错误信息的内容,如下
sqlcode: -197
sqlstate: 42877
SQL0198N The statement string of the PREPARE or EXECUTE IMMEDIATE statement is blank or empty.
Explanation: The host variable that was the object of the PREPARE or EXECUTE IMMEDIATE statement either contained all blanks or was an empty string.
The PREPARE or EXECUTE IMMEDIATE could not be completed.
User Response: Correct the logic of the program to ensure that a valid SQL statement is provided in the operand of the PREPARE or EXECUTE IMMEDIATE statement before it is executed.
我编译其它不含动态SQL的SQL过程都能通过,不知道这有什么问题,请高手帮忙回答一下!
zhouhaiming 发表于: 2003/01/07 09:11pm
vlife所说的“纯sql的好象不能动态表名,列名”,但下面的代码(我没用动态表名、列名)
create procedure refresh(in id integer)
language sql
P1: begin
declare SQLCODE integer default 0;
declare stmt varchar(1024);
declare EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
set errorCode = SQLCODE;
set errorCode = 0;
set stmt = 'insert into t_login(F_ID) '||
'values(?)';
set errorLabel = 'refresh:The line number is 28.';
--使用prepare语句为这个语句生成存取方案
prepare ps from stmt;
set errorLabel = 'rerresh:The line number is 31.';
--使用execute语句执行动态sql语句
execute ps using id;
set errorLable = ''; --当全部sql语句都正确执行时把errorLable变量赋值为空串
end P1
编译后出现跟上面一样的错误SQL0198N,所以我认为不是“纯sql的好象不能动态表名,列名”而是有其它的问题
Law 发表于: 2003/01/08 10:25am
你用变量来代替?试试,比如
set stmt='select * from ?' --你以前的语句
prepare s1 from stmt;
execute s1 using inout_tablename;
换成
set your_table=input_tablename;
set stmt='select * from '||your_table;
prepare s1 from stme;
execute s1;
zhouhaiming 发表于: 2003/01/08 12:57pm
Law老兄,你的方法我已经试了,不好使啊,有没有知道这个问题的请赶快赐教啊!!
Law 发表于: 2003/01/08 01:04pm
你怎么试的?把源代码帖出了来啊!
不可能啊,我写动态都是用这种方法的啊,都是可以的啊!!
zhouhaiming 发表于: 2003/01/08 01:05pm
我查了一下资料,我以为是没有写allowed-SQL语句的原因后来把代码改为
create procedure refresh(in id integer, out errorCode integer, out errorLabel varchar(255))
DYNAMIC RESULT SETS 0
MODIFIES SQL DATA
language sql
P1: begin
declare SQLCODE integer default 0;
declare stmt varchar(1024);
declare EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND
set errorCode = SQLCODE;
set errorCode = 0;
set stmt = 'insert into t_login(F_ID) '||
'values('||cast(id as char(8))||')';
set errorLabel = 'refresh:The line number is 28.';
--使用prepare语句为这个语句生成存取方案
prepare ps from stmt;
set errorLabel = 'rerresh:The line number is 31.';
--使用execute语句执行动态sql语句
execute ps using id;
set errorLable = ''; --当全部sql语句都正确执行时把errorLable变量赋值为空串
end P1
多了一条allowed-SQL语句
我再编译,还出现相同的问题SQL0198N,怎么回事呢?
zhouhaiming 发表于: 2003/01/08 01:11pm
SQL过程的结构如下
CREATE PROCEDURE procedure-name
(parameter-list)
DYNAMIC RESULT SETS number-of-result-sets
allowed-SQL
LANGUAGE SQL
P1: BEGIN
SQL-procedure-body
END P1
zhouhaiming 发表于: 2003/01/08 01:19pm
Law老兄,我按照你的方法编译下面的代码,仍出现相同的问题SQL0198N
create procedure referesh(in odd_table_name varchar(100), in ods_table_name varchar(100))
language sql
P1: begin
declare sSql varchar(1000) ;
sSql = 'create table '|| ods_table_name||' like'||' odd_table_name';
' as select * from ' || odd_table_name ;
prepare s1 from sSql;
execute s1;
end P1
zhouhaiming 发表于: 2003/01/08 01:58pm
作一个总结:
我知道是怎么回事了,8.1版本的DB2还不完善,相同的代码我在7.1版本下就可以编译通过可在8.1版本下却不行。我跟北京IBM公司的技术人员联系了,他们告诉我他们还没有使用DB2 8.1版本呢,市场上稳定运行的版本为DB2 7.2版本。下面的代码我在DB2 7.1版本下编译通过可在DB2 8.1版本下却不行
create procedure referesh(in odd_table_name varchar(100), in ods_table_name varchar(100))
language sql
P1: begin
declare sSql varchar(1000) ;
set sSql = 'create table '|| ods_table_name||' like'||' odd_table_name';
prepare s1 from sSql;
execute s1;
end P1
Law 发表于: 2003/01/08 02:10pm
[这个贴子最后由Law在 2003/01/08 02:14pm 编辑]
你那个create and insert 是不能在db2 v7下面运行的,这个只能在oracle下面用,只能先创建好了,然后再用第二条insert 语句插入进入,不能写在一起!!!
还有,你写错了
sSql = 'create table '|| ods_table_name||' like'||' odd_table_name';
' as select * from ' || odd_table_name ;
prepare s1 from sSql;
没有set 多了一个;号
zhouhaiming 发表于: 2003/01/08 02:24pm
Law老兄你很细心啊,我在你回的贴子的上边已经改正了那两个问题,你再看一看
Law 发表于: 2003/01/08 10:24pm
[quote][b]下面引用由[u]zhouhaiming[/u]在 [i]2003/01/08 01:58pm[/i] 发表的内容:[/b]
作一个总结:
我知道是怎么回事了,8.1版本的DB2还不完善,相同的代码我在7.1版本下就可以编译通过可在8.1版本下却不行。我跟北京IBM公司的技术人员联系了,他们告诉我他们还没有使用DB2 8.1版本呢,市场上稳定 ...
[/quote]
你不是说编译通过了么?问题解决了啊!
superjj 发表于: 2003/01/10 05:10pm
我认为可以实现
--------------------------------------------------------------------------------
Copyright ? ChinaUnix.net * 转载请注明出处及作者
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -