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;

但这两张表中的数据很多,每张大约有 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 为空的左外连接来实现

此致。

于 2012-06-07T10:26:33.023 回答