【发布时间】:2019-08-08 17:58:30
【问题描述】:
我有一个 ruby 应用程序,可以从不同的视图从 oracle 加载数据。每个查询都有一个很大的 IN 子句(数千个 id),我遇到了 PGA 限制错误。我通过创建一个包来解决这个问题,将 ID 插入到全局临时表中,并针对该表运行带有 exists 子句的 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;
/
【问题讨论】:
-
ORA-00955 的堆栈跟踪指向您发布的代码中的哪一行?
-
为什么在这种情况下根本需要
GLOBAL TEMPORARY TABLE。可以使用简单的IN子句来完成。
标签: ruby oracle plsql concurrency