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

在DB2中定义存储过程时出现语法错误,db2,db2-luw,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 ; crea

我在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
这里出了什么问题?

您需要研究用于SQL PL的IBM示例存储过程。 让示例程序在您的环境中运行,以构建知识和技能

您需要了解动态sql和静态sql之间的区别,以及何时使用它们

您需要为任何异常添加异常处理程序

当您指定它返回一个结果集时,您需要在该最终结果集上打开一个光标

以下示例适用于Db2 LUW版本11.1.3.3 CLP(命令行处理器),即在打开db2cwadmin.bat时运行的Microsoft Windows上,以及在Linux/Unix上运行的bash/ksh shell:

注意:有数据的版本需要DB2LUW11.1.3.3,旧版本只支持没有数据的版本。如果无法升级,请改用“创建表…”。。。“LIKE…”后接一个单独的语句插入到。。。从…中选择

下面是一个与您的示例类似的框架,在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
@

返回的是哪个错误?它说“在使用后预期为否”,当我输入“否”(没有数据)时,错误消失了,但我需要使用数据创建表当使用您为静态SQL提供的代码时,我得到的关于“使用数据”的相同错误对我来说很好,在您的操作系统上,
db2level
命令的输出是什么?我正在使用DataStudio,它显示了错误消息,但没有部署。请回答以下问题:Db2服务器上,
db2level
命令的输出是什么。另外,请始终提供准确的错误号(sqlcode,sqlstate)。DB21085I此实例或安装(实例名称,如适用:“TEST1”)使用“64”位,DB2代码版本“SQL11012”使用级别标识符“0203010F”。信息令牌是“DB2V11.1.2020.1393”、“s1706091900”、“DYN170310100Win64”和修复包“2”。产品安装在“C:\PROGRA~1\IBM\SQLLIB”上,DB2副本名为“DB2COPY1”。