动态 SQL 和游标相关问题
Posted
技术标签:
【中文标题】动态 SQL 和游标相关问题【英文标题】:Dynamic SQL and Cursor related issue 【发布时间】:2013-04-18 12:04:53 【问题描述】:我已经声明游标并在过程主体中使用,然后我有动态 sql 语句,它可以动态创建一个表。之后我需要访问我声明的同一个游标。
当我尝试在执行动态 sql 语句之前打开游标时,它工作正常。
当我在执行动态 sql 语句后尝试打开游标时,它没有打开和游标。
请帮帮我。
谢谢。
create or replace procedure(columns varchar2)
is
column_names varchar2(100);
sql_query varchar2(200);
begin
select pk_cols into column_names
from rules where rule_column=columns;
sql_query:='create global temporary table ('||column_names||')';
execute immediate sql_query;
end;
【问题讨论】:
为什么需要动态创建表?通常,在 Oracle 中,您不必这样做,而是使用临时表。 是的,我正在创建一个临时表。 通常,在 Oracle 中,您只创建一次临时表并重新使用它(与 SQL Server 不同,在 SQL Server 中,动态创建和删除表很常见)。为什么需要动态创建表?在运行时这些列是否未知? @Frank Schmitt - 是的,在朗姆酒时间之前,列名是未知的。但是,当其他用户运行存储过程时,它会出现错误,例如表已经存在。那么,我们应该怎么做呢? 您能否发布一个示例(过程输入、您为创建表而生成的 DDL 语句、预期输出),说明您要完成的工作?这听起来你根本不需要临时表(只需要一个带有动态生成语句的游标) 【参考方案1】:创建表是 DDL,它在 Oracle 中会导致隐式提交,从而结束您的事务。
要解决这个问题,您可以在自治事务中创建表:
-- open cursor
declare
pragma autonomous_transaction;
begin
execute immediate 'create table ...';
end;
-- do more with your cursor
有关自主交易的更多信息,请参阅 Tim Hall 优秀网站上的 this overview。
【讨论】:
t Hart - 它不起作用,正如你所说,我在声明部分保留了自主事务。但同样的问题。我想知道为什么它不打开光标。请帮忙,从 7 小时开始尝试。以上是关于动态 SQL 和游标相关问题的主要内容,如果未能解决你的问题,请参考以下文章