我在DB2中定义了一个简单的存储过程,如下所示,但它给出了语法错误
CREATE OR REPLACE PROCEDURE Schema1.TESTSP1 ()
DYNAMIC RESULT SETS 1
P1: BEGIN
if( exists(
select 1 from syscat.tables where tabschema = 'Schema' and tabname = 'SPTEST'
)) then
drop table Schema.SPTEST ;
create table Schema.SPTEST as
(select * from Schema.XYZ) WITH DATA ;
end if;
END P1
这里有什么问题?
答案 0 :(得分:0)
您需要来研究SQL PL的IBM示例存储过程。 获取在您的环境中工作的示例程序,以建立知识和技能。
您需要了解dynamic-sql和static-SQL之间的区别以及何时使用其中任何一个。
您需要为任何异常添加异常处理程序。
如您指定它返回一个结果集,您需要在最终结果集上打开一个光标。
以下示例适用于Db2-LUW版本11.1.3.3 CLP(命令行处理器),即在Microsoft Windows上运行时打开db2cwadmin.bat,在Linux / Unix上运行bash / ksh shell:
注意:WITH DATA需要Db2-LUW 11.1.3.3,旧版本仅支持WITH NO DATA。如果你无法升级,那么请改用“创建表...喜欢......”#39;然后是单独的语句INSERT INTO ... SELECT ... FROM ...
这是一个类似于你的例子的骨架,在Db2-LUW V11.1.3.3上使用静态SQL:
--#SET TERMINATOR @
CREATE OR REPLACE PROCEDURE Schema1.TESTSP1 ()
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE SQLCODE integer;
DECLARE table_exists integer default 0;
select 1 into table_exists from syscat.tables where tabschema = 'SOMESCHEMA' and tabname = 'SPTEST';
if table_exists = 1
then
drop table SOMESCHEMA.SPTEST ;
create table SOMESCHEMA.SPTEST as (select * from SCHEMA.SPTEST ) with data ;
end if;
END P1
@
这是一个类似于您的示例的骨架,但在Db2-LUW V11.1.3.3上使用动态SQL,如果您事先不知道表/列名称并且它们可用于存储过程的参数(未显示),在这种情况下,您可以动态构建SQL并执行它:
--#SET TERMINATOR @
CREATE OR REPLACE PROCEDURE Schema1.TESTSP1 ()
DYNAMIC RESULT SETS 1
P1: BEGIN
DECLARE SQLCODE integer;
DECLARE table_exists integer default 0;
select 1 into table_exists from syscat.tables where tabschema = 'SOMESCHEMA' and tabname = 'SPTEST';
if table_exists = 1
then
execute immediate('drop table SOMESCHEMA.SPTEST') ;
execute immediate('create table SOMESCHEMA.SPTEST as (select * from SCHEMA.SPTEST ) with data') ;
end if;
END P1
@