在DB2中定义存储过程时出现语法错误

时间:2018-04-16 17:40:27

标签: db2 db2-luw

我在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

这里有什么问题?

1 个答案:

答案 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
@