2

SYS_REFCURSOR を返すオラクル関数を作成しました。問題は、返す必要があるデータが 2 つの異なるクエリによって生成される可能性があることです。基本的に、最初のクエリがデータを返さない場合は、別のクエリを実行してから refcursor を返す必要があります。

これが私の大きなアイデアです

    FUNCTION F_RETURN_RECORD(
              P_VAL in NUMBER)  
                RETURN SYS_REFCURSOR AS TYPE R_CURSOR IS REF CURSOR;
                my_record_1 R_CURSOR;
                processed_record R_CURSOR;
         BEGIN
          OPEN my_record_1 FOR select e.COL1, e.COL2,a.COL1,e.COL3, e.COL4, 
                                         e.COL5, e.COL6, e.COL7, e.COL8, e.COL9,
                                         e.COL10, e.COL11
                                  from table1 e
                                  inner join table2 a on e.COL2=a.COL2
                                  where e.COL1=P_VAL;

          if my_record_1%notfound
            then
                close my_record_1;
                OPEN processed_record for select e.COL1, e.COL2,a.COL1,e.COL3, e.COL4, 
                                         e.COL5, e.COL6, e.COL7, e.COL8, e.COL9,
                                         e.COL10, e.COL11, e.COL12, e.COL13, e.COL14
                                  from table3 e
                                  inner join table2 a on e.COL2=a.COL2
                                  inner join table 4 b on a.col1=b.col2
                                  where e.COL1=P_VAL;                                   
                return processed_record;
          end if;
          DBMS_OUTPUT.PUT_LINE('Returning data.................');

          return my_record_1;       
 END F_RETURN_RECORD;

何らかの理由でif my_record_1%notfoundチェックが機能しません。私の質問は、my_record_1カーソルにデータが含まれていないかどうかを確認するにはどうすればよいですか?

ありがとうございました

4

2 に答える 2

0

%NOTFOUND を使用する代わりに FOR ループを使用するだけで、コード全体を簡素化できると思います。これは、試すことができるこのサンプル コードの例です。

CREATE OR REPLACE FUNCTION F_RETURN_RECORD(
    P_VAL IN NUMBER)
  RETURN SYS_REFCURSOR
AS
TYPE R_CURSOR
IS
  REF
  CURSOR;
    my_record_1 R_CURSOR;
    processed_record R_CURSOR;
    cur_count NUMBER;
  BEGIN
    cur_count:=0;
    --OPEN my_record_1 FOR select * FROM AVRAJIT;
    FOR rec IN
    (SELECT query
    )
  LOOP
    cur_count:=cur_count+1;
  END LOOP;
  --if my_record_1%notfound
  --then
  -- close my_record_1;
  IF cur_count <> 1 THEN
    OPEN processed_record FOR SELECT query;
    RETURN processed_record;
  END IF;
  DBMS_OUTPUT.PUT_LINE('Returning data.................');
  RETURN my_record_1;
END F_RETURN_RECORD;
于 2014-03-27T07:37:25.820 に答える