我有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错误。我该怎么办?
提前致谢。
答案 0 :(得分:3)
使用如下所示的连接查询:
SELECT MYTABLE1.*
FROM MYTABLE1
left join MYTABLE2
ON MYTABLE1.SOMEROWNAME = MYTABLE2.SOMEROWNAME
WHERE MYTABLE2.SOMEROWNAME IS NULL
答案 1 :(得分:1)
避免使用*,指定列名。
为什么你要使用光标?使用左外连接可以实现您正在做的事情,其中b.mycolumn为空
最好的问候。