我是Oracle Sql的新手,面临一个问题:
我想在程序中创建一个临时表。
LIKE:
CREATE PROCEDURE P
AS
BEGIN
CREATE TEMPORARY TABLE A(ID int);
END P;
但是这给了我一个错误
如何在程序中创建临时表。
我在stackoverflow上看到了其他答案,但这并没有正确回答我的问题 你能帮帮我吗?
答案 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;