Oracle Sql:可以在其中创建临时表的过程

时间:2013-09-19 18:26:16

标签: sql oracle stored-procedures

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

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

LIKE:

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

但是这给了我一个错误

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

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

3 个答案:

答案 0 :(得分:8)

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

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

以编程方式,您可以使用动态SQL

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

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

答案 1 :(得分:3)

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

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

编辑:显然,您必须确保在EXECUTE IMMEDIATE语句中语法正确。

希望它有所帮助。

答案 2 :(得分: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;