PL / SQL:如何根据列值插入

问题描述 投票:2回答:1

我是PL / SQL的新手。我已经尝试了各种方法来使用游标插入临时表,具体取决于临时表中的值是否已经存在。我要么行太多,要么什么都不插入。这是我最后的伪代码方法,是我要完成的工作的基本内容:DB:Oracle 12使用SQL Developer目标:从table1获取重复的accountno信息,并在temptable中合并/合并为单行1.如果临时表中尚不存在初始帐号信息,请添加2.如果临时表中没有accountno,则将其他信息添加到accountno行中

非常感谢您提出建议。

伪代码

Declare
V_cnt number (20);
CURSOR c1 is select * from table1;
C1d c1%rowtype;
BEGIN
--
OPEN C1; 
        LOOP           
            FETCH C1 INTO c1d;
            EXIT WHEN C1%NOTFOUND;
--    Limit attempts
            IF LINE > 5 THEN EXIT; END IF;

 select accountno INTO v_cnt from table1 where Exists(select 1 from temptable where accountno <> c1d.accountno);                

           IF v_cnt is NULL THEN
            INSERT INTO temptable (accountno)
                values(c1d.accountno);
           END IF;

            LINE:= LINE + 1;

            END LOOP;

CLOSE C1;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
    dbms_output.put_line ('NO DATA');   
END;
oracle plsql oracle-sqldeveloper sql-insert
1个回答
0
投票

如果您严格要更正伪代码,则可以尝试-

Declare
       V_cnt number (20);
       CURSOR c1 is  select * from table1;
       C1d c1%rowtype;
BEGIN
--
     OPEN C1; 
          LOOP           
              FETCH C1 INTO c1d;
              EXIT WHEN C1%NOTFOUND;
--    Limit attempts
              IF LINE > 5 THEN
                 EXIT;
              END IF;
              BEGIN
                   SELECT accountno
                     INTO V_cnt
                     FROM temptable
                    WHERE accountno = c1d.accountno
                      AND ROWNUM = 1;
              EXCEPTION
                       WHEN NO_DATA_FOUND THEN
                            V_cnt := NULL;
              END;

              IF V_cnt is NULL THEN
                 INSERT INTO temptable (accountno)
                                 values(c1d.accountno);
              END IF;

              LINE:= LINE + 1;

          END LOOP;
     CLOSE C1;
EXCEPTION
         WHEN NO_DATA_FOUND THEN
              dbms_output.put_line ('NO DATA');   
END;

我强烈建议使用下面的伪代码-

Declare
       V_cnt number (20);
       CURSOR c1 is  select * from table1;
       C1d c1%rowtype;
BEGIN
--
     OPEN C1; 
          LOOP           
              FETCH C1 INTO c1d;
              EXIT WHEN C1%NOTFOUND;
--    Limit attempts
              IF LINE > 5 THEN
                 EXIT;
              END IF;
              MERGE INTO temptable
              USING table1
              ON (accountno = c1d.accountno)
              WHEN NOT MATCHED THEN
                               INSERT (accountno)
                               values(c1d.accountno);
              LINE:= LINE + 1;

          END LOOP;
     CLOSE C1;
EXCEPTION
         WHEN NO_DATA_FOUND THEN
              dbms_output.put_line ('NO DATA');   
END;
© www.soinside.com 2019 - 2024. All rights reserved.