2016-09-30 3 views
-2

Es ist möglich, Cursor innerhalb IF zu verwenden() Dann Bedingung? Ich versuchte den folgenden Code Aber es funktioniert .. jemand hilft mir, dies zu lösen?Cursor innerhalb IF() Dann

mein Code:

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; 

Fehler ist:

Fehler (22,8): PLS-00103: Fand das Symbol "ctdelete", wenn eines der folgenden erwartet: =. (@%;

+1

Haben Sie auch den ersten Cursor müssen? Ihr FOR LOOP wird das Vorhandensein eines Datensatzes bewerten. – Drumbeg

+0

@Drumbeg Basierend auf dem Cursor-Ergebnis muss ich jede Zeile wiederholen und in Ctaudit-Tabelle einfügen. –

+1

Nun, die Cursor sehen für mich ziemlich gleich aus. Denken Sie nicht, dass Sie die Existenz eines Datensatzes überprüfen müssen, bevor Sie eine Schleife basierend auf denselben Kriterien durchführen. – Drumbeg

Antwort

0

Sie können nicht die Existenz eines Datensatzes auf diese Weise bewerten

Eine Möglichkeit könnte eine Variable mit dem Ergebnis einer Abfrage zu speichern und auszuwerten dann die Variable in einem IF, z. Beispiel:

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; 

Wenn Sie nur Daten aus einer Tabelle in eine andere einfügen müssen, müssen Sie alle Prüfungen nicht brauchen, IF, loop ... können Sie einfach tun:

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

ich muss wissen, wie man den Cursor innerhalb der for-Schleife verwendet –

+0

Sie brauchen keinen Cursor, Sie können eine Schleife auf eine einfachere Weise verwenden. Gerade bearbeitet, um ein Beispiel zu zeigen – Aleksej

0

Wie wäre es, es so zu schreiben? Iterieren Sie einfach über Ihren Cursor und markieren Sie jede gefundene Zeile als gelöscht.

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

Statt Cursor verwenden ich so tat es funktioniert gut .. Vielen Dank an Alle für Ihre wertvollen Antworten .. Ich habe versucht, viel .. Dank

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;