0

我是 Oracle Sql 的新手并面临一个问题:

我想在过程中创建一个临时表。

喜欢:

CREATE PROCEDURE P
  AS
  BEGIN
    CREATE TEMPORARY TABLE A(ID int);
  END P;

但这给了我一个错误

如何在过程中创建临时表。

我在stackoverflow上看到了其他答案,但这并不能正确回答我的问题,您能帮帮我吗?

4

3 回答 3

8

为什么要首先在存储过程中创建临时表?

在其他数据库(例如 SQL Server 和 MySQL)中创建临时表是相对常见的。在 Oracle 中做同样的事情是非常非常罕见的。几乎在所有你想在 Oracle 中创建临时表的情况下,都有更好的架构方法。DBA 堆栈上有一个线程讨论临时表的替代方案以及为什么它们在 Oracle 中不常用。

以编程方式,您可以使用动态 SQL 创建对象

CREATE OR REPLACE PROCEDURE dont_do_this
AS
BEGIN
  EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE a( id INTEGER )';
END;

但是,如果您动态创建一个临时表,则对该表的每个引用也需要通过动态 SQL 进行——您将无法SELECT针对该表编写简单的语句。Oracle 中临时表的定义是全局的,因此它对每个会话都是可见的。如果您有两个不同的会话都试图创建同一个表,则第二个会话将出错。如果您希望该表在不同的会话中具有不同的定义,那么您将遇到更多问题。

于 2013-09-19T18:32:31.483 回答
4

您可以将 Dynamic SQL 与EXECUTE IMMEDIATE一起使用:

CREATE OR REPLACE
PROCEDURE p
AS
BEGIN
   EXECUTE IMMEDIATE 'CREATE TEMPORARY TABLE A(id NUMBER)...etc';
END p;

编辑:显然你必须确保你的语法在 EXECUTE IMMEDIATE 语句中是正确的。

希望能帮助到你。

于 2013-09-19T18:30:55.913 回答
1

您必须将您的程序声明为:

create or replace PROCEDURE MYPROCEDURE AUTHID CURRENT_USER IS

script varchar(4000);

BEGIN

script:= 'CREATE GLOBAL TEMPORARY TABLE BNMCODIAGNOSTICASSOCIE_TEMP
ON COMMIT PRESERVE ROWS
as select ........';

EXECUTE IMMEDIATE script;

commit;

END;
于 2014-02-07T10:30:44.107 回答