0

selectステートメントが行を返すかどうかを最初に確認してからループする必要がある状況があります。その下に、私がやっている高レベル。

CURSOR euip_info
IS
SELECT
e.TRANS_ID
from
EQUIPINFO e
where
and e.ORD_NO = s_no;

euip_info_t  euip_info%ROWTYPE;

BEGIN
       OPEN euip_info;
       FETCH euip_info INTO euip_info_t;

        IF euip_info%FOUND THEN

         FOR i in euip_info
           LOOP
           //Do something
           END LOOP;       
        ELSE
          //Do otherthing       
        END IF; 
END

しかし、カーソルにループセクションに移動する値があると、エラーが発生します。

ORA-06511: PL/SQL: カーソルはすでにオープンしています

カーソルに値があるかどうかを確認し、ループも実行するにはどうすればよいですか?

4

2 に答える 2

1

次のように実行できます。

CURSOR euip_info
  IS
    SELECT e.TRANS_ID
      FROM EQUIPINFO e
    WHERE e.ORD_NO = s_no;

  euip_info_t  euip_info%ROWTYPE;

BEGIN
  OPEN euip_info;
  FETCH euip_info INTO euip_info_t;

  IF euip_info%FOUND THEN
    LOOP
      EXIT WHEN euip_info%NOTFOUND;
      -- do something with euip_info_t

      -- fetch next record
      FETCH euip_info INTO euip_info_t;
    END LOOP;       
  ELSE
    --Do other thing       
  END IF; 

  CLOSE euip_info;
END;

FOR問題は、ループ内でカーソルを使用して再度カーソルを開こうとしたことです。

于 2013-11-05T16:20:46.330 に答える
0

これを行うだけで、カーソルを反復できます。

declare
  cursor my_cur is 
  select col1, col2
  from my_table;

  l_cnt number := 0;

begin
  for rec in my_cur
  loop
    l_cnt := l_cnt + 1;
    -- do something with rec.col1, rec.col2 

  end loop;
  if (l_cnt = 0) then
    -- the cursor was empty

  end if;
end;
于 2013-11-05T16:24:51.460 に答える