我想在循环中运行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表中的行,其中传输状态被批准。然后我将这些行放在临时表中。对于临时表中的每一行,我想运行存储过程。
答案 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