Stored procedures 在下面的db2存储过程中。我想设置id fetch from db的值,并在第二次插入查询中使用

Stored procedures 在下面的db2存储过程中。我想设置id fetch from db的值,并在第二次插入查询中使用,stored-procedures,db2,Stored Procedures,Db2,我无法将数据存储在db中,因为select query无法从db中设置值,以便在另一个查询中使用。有人能帮助编写这个存储过程吗?我无法找到它为什么不存储在db2 for stock and Roadway表中。只存储在cabinet表中的数据。以下是一个示例案例,供您参考 将下面另存为proc001作为纯文本文件 将下面另存为repo.sh,运行“chmod 777 repo.sh”,然后执行它 Repo.sh的三条select语句返回如下: 如上所述,可以从列中设置值,并在第二次插入时使用它

我无法将数据存储在db中,因为select query无法从db中设置值,以便在另一个查询中使用。有人能帮助编写这个存储过程吗?我无法找到它为什么不存储在db2 for stock and Roadway表中。只存储在cabinet表中的数据。

以下是一个示例案例,供您参考

  • 将下面另存为proc001作为纯文本文件
  • 将下面另存为repo.sh,运行“chmod 777 repo.sh”,然后执行它
  • Repo.sh的三条select语句返回如下:
  • 如上所述,可以从列中设置值,并在第二次插入时使用它


    希望这能有所帮助。

    “无法存储数据”或“无法从db设置值”不是对问题的正确描述。您收到的完整错误消息是什么?无法存储在库存和过道表@MarkBarinstein中。我没有得到任何错误,只有CAB数据得到了存储的数据,这表明问题出在表列和参数名称的相同名称中。如果您不记得例程中使用的标识符解释规则,请为参数名称使用一些前缀,例如
    p_mypar
    ,而不是
    mypar
    CREATE OR REPLACE PROCEDURE INSERT_LOCATION(
    IN stockId VARCHAR (36),
    IN locationName VARCHAR (50),
    IN createdBy VARCHAR (25),
    IN createdTstamp TIMESTAMP,
    IN shipTo BIGINT,
    IN aisleId VARCHAR (36),
    IN aisleName VARCHAR(25),
    IN cabinetId VARCHAR(36),
    IN cabinetName VARCHAR(25),
    IN shelfStart SMALLINT,
    IN shelfEnd SMALLINT,
    IN columnStart SMALLINT,
    IN columnEnd SMALLINT
    ) 
    BEGIN
    
        IF NOT EXISTS (SELECT STOCKLOCATIONID
                       FROM EVMIDB.CI_STOCKLOC
                       WHERE SHIPTO = shipTo
                       and LOCATIONNAME= locationName ) THEN
               INSERT INTO EVMIDB.CI_STOCKLOC
                                  (STOCKLOCATIONID
                                  ,SHIPTO
                                  ,LOCATIONNAME
                                  ,CREATEDBY
                                  ,CREATEDTIMESTAMP)
                              VALUES (stockId
                                     ,shipTo
                                     ,locationName
                                     ,createdBy
                                     ,createdTstamp);
        ELSE
             SET stockId=(SELECT STOCKLOCATIONID
                          FROM EVMIDB.CI_STOCKLOC
                          WHERE SHIPTO = shipTo
                          AND LOCATIONNAME= locationName
                          FETCH FIRST 1 ROWS ONLY);
        END IF;
        IF(aisleId !='') THEN
           IF NOT EXISTS (SELECT AISLEID
                          FROM EVMIDB.CI_AISLE
                          WHERE SHIPTO = shipTo
                          AND AISLENAME= aisleName ) THEN
                  INSERT INTO EVMIDB.CI_AISLE(
                                     AISLEID
                                    ,SHIPTO
                                    ,AISLENAME
                                    ,STOCKLOCATIONID)
                              values (aisleId
                                     ,shipTo
                                     ,aisleName
                                     ,stockId);
           ELSE
               SET aisleId=(SELECT AISLEID
                            FROM EVMIDB.CI_AISLE
                            WHERE SHIPTO = shipTo
                            and AISLENAME= aisleName
                            FETCH FIRST 1 ROWS ONLY);
           END IF;
        END IF;
    
        IF(cabinetId !='') THEN
            INSERT INTO EVMIDB.CI_CABINET
                              (CABINETID
                              ,SHIPTO
                              ,CABINETNAME
                              ,SHELFSTARTRANGE
                              ,SHELFENDRANGE
                              ,COLUMNSTARTRANGE
                              ,COLUMNENDRANGE
                              ,AISLEID)
                       values cabinetId,
                              shipTo,
                              cabinetName,
                              shelfStart,
                              shelfEnd,
                              columnStart,
                              columnEnd,
                              aisleId);
        END IF; 
    END
    
    drop procedure s1.p001@
    create procedure s1.p001(
      IN num smallint default null
    )
    language sql
    begin
      if not exists (select c1 from s1.t2) then
        set num=(select c1 from s1.t1);
      end if;
    
      if not exists (select c1 from s1.t2) then
        insert into s1.t2 (c1) values (num);
      end if;
    
      if not exists (select c1 from s1.t3) then
        insert into s1.t3 (c1) values (3);
      end if;
    end
    @
    
    #!/bin/sh
    
    db2 -v "drop db db1"
    db2 -v "create db db1"
    db2 -v "connect to db1"
    db2 -v "create table s1.t1 (c1 int)"
    db2 -v "create table s1.t2 (c1 int)"
    db2 -v "create table s1.t3 (c1 int)"
    db2 -v "insert into s1.t1 values (1)"
    
    # create stored procedure
    db2 -td@ -vf proc001
    
    # execute it
    db2 -v "call S1.P001()"
    
    db2 -v "select * from s1.t1"
    db2 -v "select * from s1.t2"
    db2 -v "select * from s1.t3"
    db2 -v "terminate"
    
    select * from s1.t1
       ==>    1
    select * from s1.t2
       ==>    1
    select * from s1.t3
       ==>    3