Oracle,并发和全局临时表

时间:2019-08-08 17:58:30

标签: ruby oracle plsql concurrency

我有一个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;
  /

1 个答案:

答案 0 :(得分:2)

仅创建一次(全局临时)表,然后再执行其他操作。它将是“永久的”,意思是:其描述将保持不变; 不要删除该表(然后一次又一次创建它)。

让任何人(通过您编写的过程)根据需要使用它多次。每个人只会看到自己的数据;他们将无法影响其他任何人的行。

因为,似乎您正在尝试为每个正在运行该进程的用户创建它-这是错误的。


顺便说一句,为什么要使用动态SQL?为什么不只是将这些值插入到表中?