2012-01-11 1 views
3

SYS_REFCURSORを使用して選択した結果が表示されない場合はどうすればよいですか?SYS_REFCURSORを使用してNO DATA FOUNDを処理する方法 - ORACLE

私がこれまでにしようとしていること= 1

コードとして私を返す保つNO_DATA_FOUNDを使用して、その動作していない、私のSTATUSさ:

... 
MYVARIABLE IN OUT SYS_REFCURSOR 
... 

OPEN MYVARIABLE FOR 
    SELECT NAME FROM TABLE WHERE COD = 1; 
    STATUS := 1; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     STATUS := 0; 

任意のideias?

ありがとうございました!


実際のSQLはこのようなものである:あなたのコードで

編集

V_SQL := 'SELECT SUM(T1.VLRLIQ) VALOR,T1.CODCLI,T1.NOMCLI 
    ,(SELECT METCLI FROM WEB_CRM_CLIVEN T2 
    WHERE T2.CODCLI = T1.CODCLI AND T2.CODVEN = '|| P_CODVEN ||' 
     AND T2.MES = '|| V_MES ||' AND T2.ANO = '|| V_ANO ||') META 
     FROM SAPIENS.USU_VRESNFV T1,SAPIENS.E085CLI T2 
    WHERE T1.CODVEN = '|| P_CODVEN ||' 
    AND TO_CHAR(T1.DATEMI,''YYYY'') = '|| V_ANO ||' 
    AND TO_CHAR(T1.DATEMI,''MM'') = '|| V_MES ||' 
    AND T1.VENFAT = ''S'' 
    '|| V_CGCCPF ||' 
    '|| V_NOMCLI ||' 
    AND T2.CODCLI = T1.CODCLI 
    AND T1.CODEMP = 1 
    GROUP BY T1.CODCLI,T1.NOMCLI 
    UNION 
    SELECT SUM(''0'') VALOR,CODCLI,NOMCLI,(SELECT METCLI FROM WEB_CRM_CLIVEN T3 
     WHERE T3.CODCLI = T2.CODCLI AND T3.CODVEN = '|| P_CODVEN ||' 
     AND T3.MES = '|| V_MES ||' AND T3.ANO = '|| V_ANO ||') META 
     FROM SAPIENS.E085CLI T2 
    WHERE 
    CODCLI IN (SELECT CODCLI FROM WEB_CRM_VEN_CARTEIRA 
     WHERE CODVEN = '|| P_CODVEN ||' AND MES = '|| V_MES ||' AND ANO = '|| V_ANO ||') 
     '|| V_CGCCPF ||' 
     '|| V_NOMCLI ||' 
    GROUP BY CODCLI,NOMCLI 
    ORDER BY VALOR DESC'; 

    STATUS := 1; 

    OPEN RESULTADO FOR V_SQL; 
+0

通常、カーソルを使用しているときは、何かがうまくやっていません。あなたは何をしようとしているのですか?また、行が存在するかどうかをテストするために 'if exists(テーブルからの名前の選択= cod = 1)'を実行するだけで済みます。 – Eric

+0

@エリック:コードそのちょっとした例ですが、編集してあなたのことをすべて表示します –

+0

@エリック:アップデートをチェックしてください。これはウェブサーバphp –

答えて

7

、あなただけのカーソルを開いたが、それからのフェッチされていません。カーソルを開くと、PL/SQLはそのカーソルの問合せを実行します。また、WHERE句の条件を満たす行と結合条件を識別します。 OPENは実際にこれらの行を検索しません。そのアクションはFETCHステートメントによって実行されます。次に、カーソル属性を使用して、結果セットが空であるかどうかを確認します。それがある場合は、次のカーソルの属性は、これらの値を持っているでしょう。ここでTRUE = FALSE、%のNOTFOUND =をFOUNDおよび%ROWCOUNT = 0

%は一例です:

 SQL> DECLARE 
     2  l_cur SYS_REFCURSOR; 
     3  l_col VARCHAR2 (10); 
     4 BEGIN 
     5  OPEN l_cur FOR 
     6  SELECT 'Hi there' col 
     7   FROM DUAL 
     8   WHERE 1 = 0; 
     9 
     10  DBMS_OUTPUT.put_line ('Opened cursor'); 
     11 
     12  FETCH l_cur INTO l_col; 
     13 
     14  DBMS_OUTPUT.put_line ('Fetched from cursor'); 
     15 
     16  IF l_cur%NOTFOUND 
     17  THEN 
     18  DBMS_OUTPUT.put_line ('Oops! No data found. Raising exception...'); 
     19  RAISE NO_DATA_FOUND; 
     20  END IF; 
     21 
     22  CLOSE l_cur; 
     23 EXCEPTION 
     24  WHEN NO_DATA_FOUND 
     25  THEN 
     26  DBMS_OUTPUT.put_line ('Exception raised.'); 
     27 END; 
     28/
    Opened cursor 
    Fetched from cursor 
    Oops! No data found. Raising exception... 
    Exception raised. 

    PL/SQL procedure successfully completed. 
+0

で動作するストア手順です。 –

2

多少変更するには@エディ・アワドの答えは、私はカーソル変数からのフェッチに使用する通常のコードパターンは次のとおりです。アイデアは、すべての行までループ、その後、カーソル変数を開く(またはプロシージャからそれを取り戻す)することである

DECLARE 
    l_cur SYS_REFCURSOR; 
    l_col VARCHAR2 (10); 
BEGIN 
    OPEN l_cur FOR 
    SELECT 'Hi there' col 
     FROM DUAL 
     WHERE 1 = 0; 

    DBMS_OUTPUT.PUT_LINE('Opened cursor'); 

    <<cursor_loop>> 
    LOOP 
    FETCH l_cur INTO l_col; 

    DBMS_OUTPUT.PUT_LINE('Fetched from cursor'); 

    EXIT cursor_loop WHEN l_cur%NOTFOUND; 

    DBMS_OUTPUT.PUT_LINE('Process data fetched from cursor');  
    END LOOP; -- cursor_loop 

    CLOSE l_cur; 
    DBMS_OUTPUT.PUT_LINE('Closed cursor'); 
END; 

カーソルからフェッチされています。

共有して楽しんでください。

関連する問題