错误:具有错误A值的DB2存储过程与其赋值目标的数据类型不兼容。目标名称为;C1";

错误:具有错误A值的DB2存储过程与其赋值目标的数据类型不兼容。目标名称为;C1";,db2,db2-luw,Db2,Db2 Luw,在创建存储过程时,我遇到了错误 值与其赋值目标的数据类型不兼容。目标名称为“C1”。.SQLCODE=-408,SQLSTATE=42821,DRIVER=4.19.56 帮助我创建带有游标变量的存储过程 CREATE OR REPLACE TYPE DE_ROW_T as row ( C1 INTEGER,C2 VARCHAR(100),C2 CHAR(1)); CREATE OR REPLACE TYPE C_ID_CURSOR_T as DE_ROW_T CURSOR; CREATE

在创建存储过程时,我遇到了错误

值与其赋值目标的数据类型不兼容。目标名称为“C1”。.SQLCODE=-408,SQLSTATE=42821,DRIVER=4.19.56

帮助我创建带有游标变量的存储过程

CREATE OR REPLACE TYPE DE_ROW_T as row ( C1 INTEGER,C2 VARCHAR(100),C2 CHAR(1));

CREATE OR REPLACE TYPE C_ID_CURSOR_T as DE_ROW_T CURSOR;

CREATE OR REPLACE PROCEDURE  "SP_CURTEST" 
LANGUAGE SQL 
BEGIN
    
DECLARE V_ROW DE_ROW_T;
DECLARE C1  C_ID_CURSOR_T;

SET C1 = CURSOR FOR 
        SELECT DISTINCT 
           COL1,COL2,COL3
          FROM    
            MYTABLE
          WHERE COL1=101;

OPEN C1;
FETCH C1 INTO V_ROW;

END;

表DDL必须与数据类型和长度中的行类型相匹配,否则,试图将错误数据放入rowtype变量时会出现异常

下面的脚本显示了如何通过将进度打印为调试工具来查看在Linux上使用DB2LUV11.5.4.0运行的存储过程。您还可以使用其他GUI工具(包括IBM Data Studio)调试存储过程

--#SET TERMINATOR ;

CREATE OR REPLACE TYPE DE_ROW_T as row ( C1 INTEGER,C2 VARCHAR(100),C3 CHAR(1));

CREATE OR REPLACE TYPE C_ID_CURSOR_T as DE_ROW_T CURSOR;

drop table if exists mytable;

create table mytable(col1 integer, col2 varchar(100), col3 char(1));
insert into mytable(col1,col2,col3) values(101,'abcd','a');


--#SET TERMINATOR @

set serveroutput on@

CREATE OR REPLACE PROCEDURE  "SP_CURTEST" 
LANGUAGE SQL 
specific curtest
BEGIN
    DECLARE V_ROW DE_ROW_T;
    DECLARE C1  C_ID_CURSOR_T;

    SET C1 = CURSOR FOR SELECT DISTINCT COL1,COL2,COL3 FROM MYTABLE WHERE COL1=101;

    call dbms_output.put_line('opening c1');
    OPEN C1;
    call dbms_output.put_line('opened c1');
    FETCH C1 INTO V_ROW;
    call dbms_output.put_line('fetched c1: '||varchar(v_row.c1)||' , '||trim(v_row.c2)||' , '||v_row.c3);
END
@

call sp_curtest()@
如果在命令行通过db2 CLP运行上述脚本,它将显示以下输出:

    $ db2 -tvf sp_so_8.sql

CREATE OR REPLACE TYPE DE_ROW_T as row ( C1 INTEGER,C2 VARCHAR(100),C3 CHAR(1))
DB20000I  The SQL command completed successfully.

CREATE OR REPLACE TYPE C_ID_CURSOR_T as DE_ROW_T CURSOR
DB20000I  The SQL command completed successfully.

drop table if exists mytable
DB20000I  The SQL command completed successfully.

create table mytable(col1 integer, col2 varchar(100), col3 char(1))
DB20000I  The SQL command completed successfully.

insert into mytable(col1,col2,col3) values(101,'abcd','a')
DB20000I  The SQL command completed successfully.

set serveroutput on
DB20000I  The SET SERVEROUTPUT command completed successfully.

CREATE OR REPLACE PROCEDURE  "SP_CURTEST" 
LANGUAGE SQL 
specific curtest
BEGIN
    DECLARE V_ROW DE_ROW_T;
    DECLARE C1  C_ID_CURSOR_T;

    SET C1 = CURSOR FOR SELECT DISTINCT COL1,COL2,COL3 FROM MYTABLE WHERE COL1=101;

    call dbms_output.put_line('opening c1');
    OPEN C1;
    call dbms_output.put_line('opened c1');
    FETCH C1 INTO V_ROW;
    call dbms_output.put_line('fetched c1: '||varchar(v_row.c1)||' , '||trim(v_row.c2)||' , '||v_row.c3);
END

DB20000I  The SQL command completed successfully.

call sp_curtest()

  Return Status = 0

opening c1
opened c1
fetched c1: 101 , abcd , a

$

MYTABLE的定义是什么?如果表
MYTABLE
的列定义与
DE_ROW\T
相同,那么当前版本的Db2 LUW将正确地获取第一个符合条件的行。如果
mytable
列与行类型/长度不同,则结果可能是SQLCODE=-408。