Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stored procedures Teradata—存储过程中的While循环不';行不通_Stored Procedures_While Loop_Teradata - Fatal编程技术网

Stored procedures Teradata—存储过程中的While循环不';行不通

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

我在存储过程中针对动态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_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();