oracle 游标:无退出命令的无限循环

ddhy6vgd  于 2023-05-06  发布在  Oracle
关注(0)|答案(1)|浏览(167)

我正在处理嵌套游标,我有一个场景,如果游标输出不返回任何数据,我需要将数据插入到表中,如果它存在,那么我需要插入到另一个表,比如日志表。

DECLARE
            CURSOR emp_details IS
            SELECT
                empname,
                lastname
            FROM
                emp
            WHERE
                empname = 'xxx';
        
            v_is_active    VARCHAR2(50 BYTE);
            v_is_include   VARCHAR2(50 BYTE);
            lv_emp_name    emp.empname%TYPE;
            lv_lastname    emp.lastname%TYPE;
        BEGIN
            OPEN emp_details;
            
            LOOP
                FETCH emp_details INTO
                    lv_emp_name,
                    lv_lastname;
                **IF emp_details%notfound** THEN
                    IF v_is_active = 'A' THEN

执行一些活动,如插入表T1

END IF;
        
                    IF v_is_include = 'I' THEN

执行一些活动,如插入表T2

END IF;
        
                ELSE
                
                    INSERT INTO emp (
                        empname,
                        isnew
                    ) VALUES (
                        lv_emp_name,
                        0
                    );
        
                
                
                END IF;
            -----exit : if i add here this will terminate the loop and will execute only once ie the loop will not go for next iteration. If i didnt use exit it is going on infinite loop.
        
        -- IF IF emp_details%FOUND - IF CURSOR HAS A RCORD 
            END LOOP;
        
            CLOSE emp_details;
        END;

使用Notfound方法检查值是否存在并插入数据。这里我的问题是我不能退出该方法。如果我存在使用EXIT命令的方法,它只运行一行,不会执行游标的第二行。如何退出游标而不进行无限循环

4szc88ey

4szc88ey1#

希望下面的一个帮助光标不需要

BEGIN
  INSERT INTO emp(empname,isnew) 
  SELECT 'xxx',0 FROM DUAL
  WHERE NOT EXISTS (
     SELECT 1 FROM emp WHERE empName = 'xxx'
  );
  IF sql%Rowcount > 0 THEN
     INSERT INTO log_table values(...);
  END IF;
  COMMIT;
END;

相关问题