Stored procedures Teradata—存储过程中的While循环不';行不通
我在存储过程中针对动态SQL使用while循环编写了下面的脚本,但没有产生预期的结果。顺序表中的代码是水平的,而查找参考代码表显示垂直的Rsn代码。有什么解决办法吗?代码没有错误;但是,返回一个结果(3333150) 预期结果:Stored procedures Teradata—存储过程中的While循环不';行不通,stored-procedures,while-loop,teradata,Stored Procedures,While Loop,Teradata,我在存储过程中针对动态SQL使用while循环编写了下面的脚本,但没有产生预期的结果。顺序表中的代码是水平的,而查找参考代码表显示垂直的Rsn代码。有什么解决办法吗?代码没有错误;但是,返回一个结果(3333150) 预期结果: OrderID MAIN_ID 1111 3 1111 104 2222 67 2222 162 3333 150 3333 67 4444 67 4444 48 4444 7 代码: 创建过程mydb.sp_te
OrderID MAIN_ID
1111 3
1111 104
2222 67
2222 162
3333 150
3333 67
4444 67
4444 48
4444 7
代码:
创建过程mydb.sp_test()SQL安全创建者
开始
以货币申报;
以_currenrrefid int声明;
在_MaxSK int中声明;
以小写形式声明;
以_Rsn2 smallint声明;
以3小整数声明;
以货币smallint声明;
以_nummatchessmallint声明;
在类型varchar(50)中声明;
在代码varchar(3)中声明;
以小写字母声明;
设置为_currsnsk=1;
设置在\u curerrrefid=1;
在迭代中设置=1;
---------------------------------------------------------
下表临时订单;
删除表格临时代码;
下降表温度匹配;
下降工作台温度;
---------------------------------------------------------
创建多集易失性表临时顺序
(OrderID int,SubID int,代码varchar(2)
,Rsn smallint,RsnMatchFlag varchar(1)
)在提交保存行上;
---------------------
将值(1111,1,'A7',116)插入临时订单(订单ID,子ID,代码,Rsn);
将值(1111,2,'A8',496)插入临时订单(订单ID,子ID,代码,Rsn);
将值(1111,3,'A8',562)插入临时订单(订单ID,子ID,代码,Rsn);
将值(2222,1,'A3',247)插入临时订单(订单ID,子ID,代码,Rsn);
插入临时订单(订单ID、子ID、代码、Rsn)值(2222108、'A8',455);
插入临时订单(订单ID、子ID、代码、Rsn)值(2222109、'A8',255);
插入临时订单(订单ID、子ID、代码、Rsn)值(2222110、'A8',507);
插入临时订单(订单ID、子ID、代码、Rsn)值(222111、'A8',455);
插入临时订单(订单ID、子ID、代码、Rsn)值(22221112、'A8',255);
将值(2222113,'A8',507)插入临时订单(订单ID,子ID,代码,Rsn);
将值(3333,1,'A3',247)插入临时订单(订单ID,子ID,代码,Rsn);
将值(3333,2,'A8',228)插入临时订单(订单ID,子ID,代码,Rsn);
将值(3333,3,'A8',455)插入临时订单(订单ID,子ID,代码,Rsn);
将值(3333,4,'A8',507)插入临时订单(订单ID,子ID,代码,Rsn);
将值(4444,1,'A3',247)插入临时订单(订单ID,子ID,代码,Rsn);
将值(4444,2,'A6',145)插入临时订单(订单ID,子ID,代码,Rsn);
将值(4444,3,'A8',189)插入临时订单(订单ID,子ID,代码,Rsn);
将值(4444,4,'A8',249)插入临时订单(订单ID,子ID,代码,Rsn);
更新临时订单集RsnMatchFlag=Null;
--------------------------
创建多集易失性表临时代码
(SK int,Main_id int,代码varchar(2),Rsn1 smallint,Rsn2 smallint,Rsn3 smallint
)在提交保存行上;
插入临时代码(SK、主id、代码、Rsn1、Rsn2、Rsn3)值(1150、'A8',228455507);
将值(2162,'A8',255455507)插入临时代码(SK,主id,代码,Rsn1,Rsn2,Rsn3);
插入临时代码(SK、主id、代码、Rsn1、Rsn2、Rsn3)值(3,48、'A8',189249',);
在临时代码(SK、主id、代码、Rsn1、Rsn2、Rsn3)中插入值(4104、'A8',496562',);
插入临时代码(SK、主id、代码、Rsn1、Rsn2、Rsn3)值(5,3、'A7',116','';
插入临时代码(SK、主id、代码、Rsn1、Rsn2、Rsn3)值(6,7、'A6',145','';
在临时代码(SK、主id、代码、Rsn1、Rsn2、Rsn3)中插入值(7,67、'A3',247','';
--检查每个原因的OrderID
/***************************************************************/
创建多集易失性表临时匹配
(OrderID int)在提交保留行上;
-------------------带有订单ID和代码主ID的最终表格
创建多组易失性表格temp\U Final
(OrderID int,Main_id int)在提交保留行上;
从temp_代码中选择MAX(sk)进入in_MaxSK;
--循环开始
当处于\u currsnsk0时,则为1,否则为0结束)+
(情况为当in_Rsn2>0时,则为1,否则为0结束)+
(当in_Rsn3>0时,则为1,否则为0结束);
--查找匹配状态
设置在\u CurrRsn=在\u Rsn1;
而在当前迭代0中
开始
更新任务大纲
来自临时订单
,(选择S1.OrderID,MIN(S1.Subid)作为序号
从临时订单到S1
其中S1.Code=in_Code
和S1.Rsn=in_CurrRsn
并且S1.RsnMatchFlag为空
按S1.OrderID)SQ分组
设置RsnMatchFlag='Y'
其中SQ.OrderID=TOr.OrderID
SQ.SeqNo=TOr.Subid;
--下一个原因
设置in\u CurrIteration=in\u CurrIteration+1;
设置在\u CurrRsn=(如果在\u currriteration=2,则在\u Rsn2中
当in\u curr迭代=3时,则in\Rsn3
否则(完),;
结束;
结束时;
--查找匹配的索赔
从临时匹配中删除;
插入临时匹配(订单ID)
选择OrderID
从临时订单
其中RsnMatchFlag='Y'
按医嘱ID分组
计数(*)等于整数;
如果活动计数>0,则---任何匹配项/
开始
--插入最终表格-订单/主id列表
插入临时最终(订单id、主订单id)
在\u currenrrefid中选择MATCH.OrderID
来自临时匹配
左连接临时接头最终FN
在FN.OrderID=MATCH.OrderID上
create PROCEDURE mydb.sp_test() SQL SECURITY CREATOR
BEGIN
DECLARE in_CurrRsnSK int;
DECLARE in_CurrErrDefID int;
DECLARE in_MaxSK int;
DECLARE in_Rsn1 smallint;
DECLARE in_Rsn2 smallint;
DECLARE in_Rsn3 smallint;
DECLARE in_CurrRsn smallint;
DECLARE in_NumMatches smallint;
DECLARE in_Type varchar(50);
DECLARE in_Code varchar(3);
DECLARE in_CurrIteration smallint ;
SET in_CurrRsnSK=1;
SET in_CurrErrDefID=1;
SET in_CurrIteration=1;
---------------------------------------------------------
drop table temp_order;
drop table temp_code;
drop table temp_Match;
drop table temp_Final;
---------------------------------------------------------
CREATE MULTISET VOLATILE TABLE temp_order
(OrderID int ,SubID int ,Code varchar(2)
,Rsn smallint ,RsnMatchFlag varchar(1)
) ON COMMIT PRESERVE ROWS;
---------------------
insert into temp_order (OrderID,SubID,Code,Rsn) values (1111,1,'A7',116);
insert into temp_order (OrderID,SubID,Code,Rsn) values (1111,2,'A8',496);
insert into temp_order (OrderID,SubID,Code,Rsn) values (1111,3,'A8',562);
insert into temp_order (OrderID,SubID,Code,Rsn) values (2222,1,'A3',247);
insert into temp_order (OrderID,SubID,Code,Rsn) values (2222,108,'A8',455);
insert into temp_order (OrderID,SubID,Code,Rsn) values (2222,109,'A8',255);
insert into temp_order (OrderID,SubID,Code,Rsn) values (2222,110,'A8',507);
insert into temp_order (OrderID,SubID,Code,Rsn) values (2222,111,'A8',455);
insert into temp_order (OrderID,SubID,Code,Rsn) values (2222,112,'A8',255);
insert into temp_order (OrderID,SubID,Code,Rsn) values (2222,113,'A8',507);
insert into temp_order (OrderID,SubID,Code,Rsn) values (3333,1,'A3',247);
insert into temp_order (OrderID,SubID,Code,Rsn) values (3333,2,'A8',228);
insert into temp_order (OrderID,SubID,Code,Rsn) values (3333,3,'A8',455);
insert into temp_order (OrderID,SubID,Code,Rsn) values (3333,4,'A8',507);
insert into temp_order (OrderID,SubID,Code,Rsn) values (4444,1,'A3',247);
insert into temp_order (OrderID,SubID,Code,Rsn) values (4444,2,'A6',145);
insert into temp_order (OrderID,SubID,Code,Rsn) values (4444,3,'A8',189);
insert into temp_order (OrderID,SubID,Code,Rsn) values (4444,4,'A8',249);
update temp_order set RsnMatchFlag=Null;
--------------------------
CREATE MULTISET VOLATILE TABLE temp_code
( SK int, Main_id int, Code varchar(2), Rsn1 smallint,Rsn2 smallint,Rsn3 smallint
) ON COMMIT PRESERVE ROWS;
insert into temp_code (SK,Main_id,Code,Rsn1,Rsn2,Rsn3) values (1,150,'A8',228,455,507);
insert into temp_code (SK,Main_id,Code,Rsn1,Rsn2,Rsn3) values (2,162,'A8',255,455,507);
insert into temp_code (SK,Main_id,Code,Rsn1,Rsn2,Rsn3) values (3,48,'A8',189,249,'');
insert into temp_code (SK,Main_id,Code,Rsn1,Rsn2,Rsn3) values (4,104,'A8',496,562,'');
insert into temp_code (SK,Main_id,Code,Rsn1,Rsn2,Rsn3) values (5,3,'A7',116,'','');
insert into temp_code (SK,Main_id,Code,Rsn1,Rsn2,Rsn3) values (6,7,'A6',145,'','');
insert into temp_code (SK,Main_id,Code,Rsn1,Rsn2,Rsn3) values (7,67,'A3',247,'','');
-- Check OrderID for each reason
/***************************************************************/
CREATE MULTISET VOLATILE TABLE temp_Match
( OrderID int ) ON COMMIT PRESERVE ROWS;
-------------------Final table with Order ID & Code Main id
CREATE MULTISET VOLATILE TABLE temp_Final
( OrderID int ,Main_id int ) ON COMMIT PRESERVE ROWS;
select MAX(sk) into in_MaxSK from temp_Code;
--loop starts
WHILE in_CurrRsnSK<= in_MaxSK
DO
BEGIN
-- Get Rsn
select (case when Rsn1=0 then -1 else Rsn1 end) into :in_Rsn1 from temp_Code where SK=in_CurrRsnSK ;
select (case when Rsn2=0 then -1 else Rsn2 end) into :in_Rsn2 from temp_Code where SK=in_CurrRsnSK ;
select (case when Rsn3=0 then -1 else Rsn3 end) into :in_Rsn3 from temp_Code where SK=in_CurrRsnSK ;
select Code into :in_Code from temp_Code where SK=in_CurrRsnSK ;
select Main_ID into :in_CurrErrDefID from temp_Code where SK=in_CurrRsnSK ;
SET in_NumMatches=((CASE WHEN in_Rsn1>0 THEN 1 ELSE 0 END) +
(CASE WHEN in_Rsn2>0 THEN 1 ELSE 0 END) +
(CASE WHEN in_Rsn3>0 THEN 1 ELSE 0 END));
-- Find Matching Status
SET in_CurrRsn=in_Rsn1;
WHILE in_CurrIteration<= 3 AND in_CurrRsn>0 DO
BEGIN
UPDATE TOr
FROM temp_order TOr
,( SELECT S1.OrderID, MIN(S1.Subid) AS SeqNo
FROM temp_order As S1
WHERE S1.Code=in_Code
AND S1.Rsn=in_CurrRsn
AND S1.RsnMatchFlag is null
GROUP BY S1.OrderID ) SQ
SET RsnMatchFlag='Y'
WHERE SQ.OrderID=TOr.OrderID
and SQ.SeqNo=TOr.Subid;
-- next reason
SET in_CurrIteration=in_CurrIteration + 1;
SET in_CurrRsn=(CASE WHEN in_CurrIteration=2 THEN in_Rsn2
WHEN in_CurrIteration=3 THEN in_Rsn3
ELSE -1 END);
END;
END WHILE;
-- Find Matching Claims
DELETE FROM temp_Match;
INSERT INTO temp_Match (OrderID)
SELECT OrderID
FROM temp_order
WHERE RsnMatchFlag='Y'
GROUP BY OrderID
HAVING COUNT(*)=in_NumMatches;
IF ACTIVITY_COUNT>0 THEN ---any matches/
BEGIN
-- Insert into the Final Table - Order / Main_id List
INSERT INTO temp_Final (OrderID, Main_id)
SELECT MATCH.OrderID ,in_CurrErrDefID
FROM temp_Match MATCH
LEFT JOIN temp_Final FN
ON FN.OrderID=MATCH.OrderID
aND FN.Main_id=in_CurrErrDefID
WHERE (FN.OrderID IS NULL or FN.OrderID = ' ');
-- Remove Code records that were used
DELETE FROM temp_order
WHERE temp_order.OrderID in (SELECT OrderID FROM temp_MATCH)
and temp_order.RsnMatchFlag='Y';
END; -- matches
END IF;
-- Clear any partial matches
UPDATE temp_order
SET RsnMatchFlag=NULL
WHERE RsnMatchFlag='Y';
-- Next reason
SET in_CurrRsnSK=in_CurrRsnSK + 1;
END;
END WHILE;
END ;
CALL mydb.sp_test();