将变量从DB2返回到结果集

本文关键字:结果 返回 DB2 变量 | 更新日期: 2023-09-27 18:04:26

从我的c#应用程序中,我想从数据库中获得一个shipmentnumber,如果记录不存在,那么我将创建它并返回新的shipmentnumber。现在,我已经在DB2中创建了一个存储过程,在这个过程中,我将一个名为SHIPNR的变量声明为十进制。现在我想要这个变量作为结果集返回。我有这部分代码:

BEGIN
DECLARE SHIPMENTNR DECIMAL ( 6 , 0 ) ;
    DECLARE C1 CURSOR FOR
        SELECT PHSHIP
        FROM THEPRDDTA . WSHP010
        WHERE PHORD = ORDNR AND
            PHID = 'PH' ;
    OPEN C1 ;
    FETCH FROM C1 INTO SHIPMENTNR ;
    CLOSE C1 ;
    IF ( SHIPMENTNR IS NULL ) THEN
    //do something
    END IF ;
    BEGIN
    DECLARE C_OUT CURSOR FOR
        SELECT DATA
        FROM BPCSF . ZPAL01
        WHERE PKEY = 'THETSHIP' ;
    OPEN C_OUT ;
    END ;
END 

这工作完美,并返回我选择的'DATA'。所以代码是工作的(好吧,if语句还没有测试,但这取决于我:)所以我没有把它括起来),我不想把它作为一个参数。

那么问题是:我如何将十进制'SHIPMENTNR'作为结果集返回给我的应用程序?

将变量从DB2返回到结果集

就我个人而言,我将使用函数(UDF)

,而不是使用返回一行只有一列的结果集的存储过程。
CREATE OR REPLACE GET_SHIPMENT_NUMBER(
  ORDNR INTEGER
  ) RETURNS DECIMAL(6, 0)
BEGIN
  DECLARE SHIPMENTNR DECIMAL(6, 0) ;
  SET SHIPMENTNR = (
    SELECT PHSHIP
    FROM THEPRDDTA.WSHP010
    WHERE PHORD = ORDNR AND
        PHID = 'PH');
  IF (SHIPMENTNR IS NULL) THEN
  //do something
  END IF ;
  RETURN SHIPMENTNR;
END 

为了返回一个打开的游标,您需要使用选项'with return'定义游标,并将其定义为调用者或客户端。

您还可以使用"动态结果集X"限制返回的结果集

CREATE OR REPLACE PROCEDURE GET_SHIPMENT_NUMBER(
  ORDNR INTEGER
  )
  DYNAMIC RESULT SETS 1
BEGIN
  DECLARE SHIPMENTNR DECIMAL(6, 0) ;
  DECLARE C_OUT CURSOR
    WITH RETURN TO CALLER
    FOR
    SELECT DATA
    FROM BPCSF.ZPAL01
    WHERE PKEY = 'THETSHIP' ;
  SET SHIPMENTNR = (
    SELECT PHSHIP
    FROM THEPRDDTA.WSHP010
    WHERE PHORD = ORDNR AND
        PHID = 'PH');
  IF (SHIPMENTNR IS NULL) THEN
  //do something
  END IF ;
  OPEN C_OUT ;
END 

引用:

  • 声明游标:http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0000937.html
  • 创建过程:http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0008329.html