我想在循环中运行存储过程

时间:2015-08-17 10:09:44

标签: db2

我想在循环中运行sp。 我正在使用db2。 例如,如果我的表中有10行,并且8行包含已批准的状态,我希望通过我的sp逐步执行这8行。

我使用过这种方法

declare @v_count INT;
declare @row_count INT;

declare @v_actorCNUM      CHAR(10); 
declare @v_sessID      CHAR(32);
declare @v_taskID      SMALLINT;
declare @v_dest_citrusSCID   INTEGER;  
declare @v_src_citrusSCID  INTEGER;
declare @v_CtrCnum         CHAR(10);
declare @v_dest_security_grp_nm  varchar(100);  
declare @v_src_security_grp_nm  varchar(100);

SET @v_count=1;
 DECLARE GLOBAL TEMPORARY TABLE csc_trfr
(   
  Row_id INT GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
 CNTRCTR_CNUM CHAR(10) NOT NULL ,
              DEST_CSC_NM CHAR(30) ,
              SRC_CSC_NM CHAR(30) ,
              DEST_GRP_NM VARCHAR(100) ,
              SRC_GRP_NM VARCHAR(100) ,
              USR_LST_UPDT_ID CHAR(10) 
  ) WITH REPLACE ON COMMIT PRESERVE ROWS NOT lOGGED;
 insert into       session.csc_trfr                                                 (cntrctr_cnum,dest_csc_nm,src_csc_nm,dest_grp_nm,src_grp_nm,usr_lst_updt_id)
  select    cntrctr_cnum,dest_csc_nm,source_csc_nm,dest_grp_nm,src_grp_nm,usr_lst_updt_id from citrus.cntrctr_csc_trfr where trfr_status='Approved';

    select count(*) into @row_count from citrus.cntrctr_csc_trfr where  trfr_status='Approved';

while @v_count<=@row_count

  BEGIN


 SET @v_actorCNUM=select usr_lst_updt_id from session.csc_trfr order by    row_id offset @v_count rows fetch next 1 rows only;
 SET @v_taskID=166;
  set @v_dest_citrusSCID =select citrus_suprt_id from citrus.citrus_suprt_cntr where citrus_suprt_nm=(select DEST_CSC_NM from session.csc_trfr order by row_id offset @v_count rows fetch next 1 rows only );
set @v_src_citrusSCID=select citrus_suprt_id from citrus.citrus_suprt_cntr where citrus_suprt_nm=(select SRC_CSC_NM from session.csc_trfr order by row_id offset @v_count rows fetch next 1 rows only );
 set @v_CtrCnum=select cntrctr_cnum from session.csc_trfr order by row_id offset @v_count rows fetch next 1 rows only;
 set @v_dest_security_grp_nm =select  DEST_GRP_NM from session.csc_trfr order by row_id offset @v_count rows fetch next 1 rows only;
set @v_src_security_grp_nm=select  DEST_GRP_NM from session.csc_trfr order by row_id offset @v_count rows fetch next 1 rows only;
 call citrus.BAC020_cntrctrCSCTrfr(@v_actorCNUM,'',@v_taskID,@v_dest_citrusSCID,@v_src_citrusSCID,@v_CtrCnum,@v_dest_security_grp_nm,@v_src_security_grp_nm,?,?,?);
  @v_count=@v_count+1;
 end

我将名称脚本作为test.sql并执行脚本,如: db2 -tvf test.sql 但我收到sql错误。 DB21034E该命令作为SQL语句处理,因为它不是 有效的命令行处理器命令。在SQL处理期间,它返回: SQL0104N一个意外的令牌&#34;声明@v_actorCNUM CHAR&#34;被找到 以下&#34; BEGIN-OF-STATEMENT&#34;。预期的代币可能包括:&#34;&#34;。 LINE NUMBER = 1。 SQLSTATE = 42601

所有变量的

错误都相同。

我的代码计算cntctr_csc_trfr表中的行,其中传输状态被批准。然后我将这些行放在临时表中。对于临时表中的每一行,我想运行存储过程。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题 这是一个例子:

use database1

去 DECLARE @RC int DECLARE @RequestCode nvarchar(50) 声明column_cursor Cursor For     从table_name中选择columnName OPEN column_cursor     从column_cursor获取Next到@RequestCode     而@@ Fetch_Status = 0开始 EXECUTE @RC = [dbo]。[stored_procedure_name] @RequestCode 从column_cursor获取Next到@RequestCode     结束     关闭column_cursor     取消分配column_cursor