1

次と同じ動作をするOracleプロシージャがあります。

create or replace
PROCEDURE My_TEST_PROCEDURE
(
   cur out sys_refcursor
)
AS
BEGIN
  open cur for
   SELECT * FROM MYTABLE1
   WHERE MYTABLE1.SOMEROWNAME NOT IN 
        (SELECT SOMEROWNAME FROM MYTABLE2);
END My_TEST_PROCEDURE;

しかし、この2つのテーブルには多くのデータがあり、それぞれに約300000行あります。そのため、完了するまでにかなりの時間がかかります。その時間を減らすために私は何ができますか。sys_refcursorを宣言し、次のようにこのカーソルにデータを読み込んでみました。

create or replace
PROCEDURE My_TEST_PROCEDURE
(
   cur out sys_refcursor
)
IS
DECLARE EXISTING_ITEMS SYS_REFCURSOR;
BEGIN
  OPEN EXISTING_ITEMS FOR
    SELECT SOMEROWNAME FROM MYTABLE2;
  open cur for
   SELECT * FROM MYTABLE1
   WHERE MYTABLE1.SOMEROWNAME NOT IN 
        EXISTING_ITEMS;
END My_TEST_PROCEDURE;

ただし、今回はORA-00932エラーが発生します。私に何ができる?

前もって感謝します。

4

2 に答える 2

3

以下のような結合でクエリを使用します。

SELECT MYTABLE1.* 
FROM   MYTABLE1 
       left join MYTABLE2 
              ON MYTABLE1.SOMEROWNAME = MYTABLE2.SOMEROWNAME 
WHERE  MYTABLE2.SOMEROWNAME IS NULL 
于 2012-06-07T10:25:54.400 に答える
1

*の使用は避け、列名を指定してください。

なぜカーソルを使用しているのですか?あなたがしていることは、b.mycolumnがnullである左外部結合を使用して達成できます。

よろしくお願いします。

于 2012-06-07T10:26:33.023 に答える