2016-09-30 6 views
-2

IF()の中でCursorを使用できますか?条件?私は以下のコードを試しました しかし、それは..誰も私はこれを解決するのを助ける?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で変数を評価することができ;のため例:あなたが唯一の別のテーブルからデータを挿入する必要がある場合、あなたは、IFloopを任意のチェックを必要としない

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;