我有一个ruby应用程序,可以从不同的角度从oracle加载数据。每个查询都有一个大的IN子句(数千个ID),我遇到了PGA限制错误。我通过创建一个包来解决此问题,该包将id插入到全局临时表中,并对该表运行带有exist子句的sql。当不是并发但可以并发执行时,它运行良好,我得到一个(ORA-00955:名称已被现有对象使用)。
CREATE GLOBAL TEMPORARY TABLE temp_ids_table (
id NUMBER
)
on commit preserve rows;
/
-
CREATE OR REPLACE PACKAGE test.bulk_query
IS
TYPE temp_ids IS TABLE OF NUMBER;
FUNCTION run_query(ids IN temp_ids, query IN VARCHAR2) RETURN sys_refcursor;
END bulk_query;
/
CREATE OR REPLACE PACKAGE BODY test.bulk_query
IS
FUNCTION run_query(ids IN temp_ids, query IN VARCHAR2) RETURN sys_refcursor
IS
dataset SYS_REFCURSOR;
BEGIN
FOR i IN 1 .. ids.count LOOP
execute immediate 'INSERT INTO TEMP_IDS_TABLE (ID) VALUES (:id)' using ids(i);
END LOOP;
OPEN dataset FOR query;
commit;
RETURN dataset;
END;
END bulk_query;
/
答案 0 :(得分:2)
仅创建一次(全局临时)表,然后再执行其他操作。它将是“永久的”,意思是:其描述将保持不变; 不要删除该表(然后一次又一次创建它)。
让任何人(通过您编写的过程)根据需要使用它多次。每个人只会看到自己的数据;他们将无法影响其他任何人的行。
因为,似乎您正在尝试为每个正在运行该进程的用户创建它-这是错误的。
顺便说一句,为什么要使用动态SQL?为什么不只是将这些值插入到表中?