动态 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 和游标相关问题的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中使用动态 SQL 创建游标

游标和动态SQL

Oracle动态游标实现动态SQL循环遍历,和静态游标的比较。

游标内的动态 SQL

oracle动态查询通过sql获取游标变量

oracle 动态游标 传参的问题