2016-09-30 3 views
-2

IF() 안에 커서를 사용할 수 있습니까? 그렇다면 조건? 나는 아래의 코드를 시도했다 하지만 그것은 ..이 문제를 해결하는 데 도움 누군가가?커서 내부 IF() Then

내 코드는 다음과 같습니다

BEGIN 
IF EXISTS 
((select '1' 
    from cttest c 
where not exists( 
select 1 from cof o where c.createddate > add_months(sysdate,-6) and c.ctid not in (
o.ctid , o.bctid, o.lc1, o.lc2, o.sslc1,o.sslc2) 
) and c.lastupdated is null and c.lastupdatedcof is null)) THEN 
begin 
cursor ctdelete 
IS 
select ctid,ctname from cttest c 
where not exists( 
select 1 from cof o where c.createddate > add_months(sysdate,-6) and c.ctid not in (
o.ctid , o.bctid, o.lc1, o.lc2, o.sslc1,o.sslc2) 
) and c.lastupdated is null and c.lastupdatedcof is null 
end; 
FOR reDel_audit IN ctdelete 
    LOOP 
insert into ctaudit (ctid,ctname,v_IsDeleted,null,sysdate); 
COMMIT; 
END LOOP; 
END; 

오류는 다음과 같습니다 : =

오류 (22,8)는 PLS-00103는 다음 중 하나를 예상 할 때 심볼 "ctdelete을"가 발생했습니다. (% @;

+1

를 시도? FOR LOOP는 레코드의 존재를 평가합니다. – Drumbeg

+0

@Drumbeg 커서 결과에 따라 각 행을 반복하고 ctaudit 테이블에 삽입해야합니다. –

+1

글쎄, 커서는 나에게 거의 똑같이 보입니다. 동일한 기준에 따라 루프를 수행하기 전에 레코드가 있는지 확인해야한다고 생각하지 마십시오. – Drumbeg

답변

0

당신은 그런 식으로 기록의 존재를 평가할 수 없습니다

한 가지 방법은 쿼리의 결과를 저장 한 다음 IF에서 변수를 평가하기 위해 변수를 사용 될 수 있습니다,.에 대한 예 : 당신은 단지 다른 테이블에서 데이터를 삽입해야하는 경우, IF, loop 어떤 검사가 필요하지 않습니다

create table test(a) as (
    select 1 from dual union all 
    select 2 from dual 
)  

declare 
    vCount number; 
begin 
    select count(1) 
    into vCount 
    from test; 
    -- 
    if vCount > 0 then 
     dbms_output.put_line(vCount || ' rows found'); 
    else 
     dbms_output.put_line('No rows found'); 
    end if; 
    -- 
    for i in ( 
       select a 
       from test 
      ) 
    loop 
     dbms_output.put_line('Value: ' || i.a); 
    end loop; 
end; 

... 당신은 간단하게 수행 할 수 있습니다

insert into table2(a, b, c) 
select a, b, c 
from table1 
where ... 
+0

for 루프 내에서 커서를 사용하는 방법을 알아야합니다. –

+0

커서가 필요 없으므로 루프를보다 간단한 방법으로 사용할 수 있습니다. 예제를 보여주기 위해 단지 편집 됨 – Aleksej

0

이렇게 작성하는 것이 어떻습니까? 커서를 반복하고 발견 된 각 행을 삭제 된 것으로 표시하십시오. 대신 내가이 좋아했다 커서를 사용

BEGIN 
    CURSOR ctdelete IS 
     SELECT ctid, ctname 
     FROM cttest c 
     WHERE NOT EXISTS 
     (SELECT 1 
       FROM cof o 
       WHERE c.createddate > add_months(SYSDATE, -6) 
       AND c.ctid NOT IN 
        (o.ctid, o.bctid, o.lc1, o.lc2, o.sslc1, o.sslc2)) 
     AND c.lastupdated IS NULL 
     AND c.lastupdatedcof IS NULL; 

    FOR redel_audit IN ctdelete 
    LOOP 
     INSERT INTO ctaudit 
     (redel_audit.ctid, redel_audit.ctname, 'Y', NULL, SYSDATE); 
     COMMIT; 
    END LOOP; 
END; 
0

: 그것은 잘 당신의 소중한 답변에 .. 감사 일하고 ... 난 당신도 처음 커서가 필요하십니까 많은 .. 감사

BEGIN 
    DBMS_OUTPUT.PUT_LINE('Contact Delete'); 
    SELECT COUNT(ctid) 
    INTO v_count 
    FROM cttest c 
    WHERE NOT EXISTS 
     (SELECT 1 
     FROM cof o 
     WHERE c.createddate > add_months(sysdate,-6) 
     AND c.ctid NOT       IN (o.ctid , o.bctid, o.lc1, o.lc2, o.sslc1,o.sslc2) 
    ) 
    AND c.lastupdated IS NULL 
    AND c.lastupdatedcof IS NULL; 
    IF v_count   >0 THEN 
     DBMS_OUTPUT.PUT_LINE('Count==>'||v_count); 
     DBMS_OUTPUT.PUT_LINE('Deleted Status==>'||v_IsDeleted); 
     INSERT 
     INTO ctaudit 
     (
      ctid, 
      ctname, 
      isdeleted, 
      ismasked, 
      updatedon 
     ) 
     (SELECT ctid, 
      ctname, 
      'Y'  AS isdeleted, 
      NULL AS ismasked, 
      SYSDATE AS updatedon 
      FROM cttest c 
      WHERE NOT EXISTS 
      (SELECT 1 
      FROM cof o 
      WHERE c.createddate > add_months(sysdate,-6) 
      AND c.ctid NOT       IN (o.ctid , o.bctid, o.lc1, o.lc2, o.sslc1,o.sslc2) 
      ) 
      AND C.Lastupdated IS NULL 
      AND C.Lastupdatedcof IS NULL 
     ); 
    END IF; 
    DELETE 
    FROM cttest c 
    WHERE NOT EXISTS 
     (SELECT 1 
     FROM cof o 
     WHERE c.createddate > add_months(sysdate,-6) 
     AND c.ctid NOT       IN (o.ctid , o.bctid, o.lc1, o.lc2, o.sslc1,o.sslc2) 
     AND c.lastupdated IS NULL 
     AND c.lastupdatedcof IS NULL 
    ); 
    COMMIT; 
    DBMS_OUTPUT.PUT_LINE('Compelted.......'); 
    END;