【问题标题】:Dynamic SQL and Cursor related issue动态 SQL 和游标相关问题
【发布时间】: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 语句、预期输出),说明您要完成的工作?这听起来你根本不需要临时表(只需要一个带有动态生成语句的游标)

标签: plsql oracle11g


【解决方案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 小时开始尝试。
猜你喜欢
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多