我是 Oracle Sql 的新手并面临一个问题:
我想在过程中创建一个临时表。
喜欢:
CREATE PROCEDURE P
AS
BEGIN
CREATE TEMPORARY TABLE A(ID int);
END P;
但这给了我一个错误
如何在过程中创建临时表。
我在stackoverflow上看到了其他答案,但这并不能正确回答我的问题,您能帮帮我吗?
我是 Oracle Sql 的新手并面临一个问题:
我想在过程中创建一个临时表。
喜欢:
CREATE PROCEDURE P
AS
BEGIN
CREATE TEMPORARY TABLE A(ID int);
END P;
但这给了我一个错误
如何在过程中创建临时表。
我在stackoverflow上看到了其他答案,但这并不能正确回答我的问题,您能帮帮我吗?
为什么要首先在存储过程中创建临时表?
在其他数据库(例如 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 中临时表的定义是全局的,因此它对每个会话都是可见的。如果您有两个不同的会话都试图创建同一个表,则第二个会话将出错。如果您希望该表在不同的会话中具有不同的定义,那么您将遇到更多问题。
您可以将 Dynamic SQL 与EXECUTE IMMEDIATE一起使用:
CREATE OR REPLACE
PROCEDURE p
AS
BEGIN
EXECUTE IMMEDIATE 'CREATE TEMPORARY TABLE A(id NUMBER)...etc';
END p;
编辑:显然你必须确保你的语法在 EXECUTE IMMEDIATE 语句中是正确的。
希望能帮助到你。
您必须将您的程序声明为:
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;