【问题标题】:anonymous block in 11g11g 中的匿名块
【发布时间】:2013-03-09 06:20:48
【问题描述】:

我需要这方面的帮助。

我正在尝试创建一个 pl/sql 匿名块,当我运行它时它显示它已完成但它不运行代码。它应该给我一个错误,说名称已被现有对象使用。有人可以帮我解决这个问题。 我实际上是在创建程序,但只是尝试将此代码作为示例。

DECLARE 

    V_REF_TBL                       VARCHAR2(100);
    V_SQL                           LONG;

begin
    V_REF_TBL :='My_TABLE';
    v_SQL :='truncate table '||V_REF_TBL ;
    EXECUTE IMMEDIATE V_SQL;

    EXECUTE IMMEDIATE 'CREATE TABLE '|| V_REF_TBL ||' parallel 9 nologging pctfree 0 as 
    select * from dual';  
End;

【问题讨论】:

  • 对不起,我无法重现这个。如果表存在,我在运行代码时会收到“名称已被现有对象使用”错误。如果表不存在,我会收到“表或视图不存在”错误。
  • 为什么需要使用动态sql?
  • 为什么要截断一个不存在的表?你为什么要创建一个已经存在的表?您是否尝试实现临时表?如果是这样,oracle 有更好的解决方案。 stackoverflow.com/a/2042029/146325
  • 还有parallel 9 是Teh Suck!平行度数应始终为 2 的幂。

标签: oracle stored-procedures plsql dynamic-sql


【解决方案1】:

您可能正在寻找这个:

  <<my_block>>
  Declare
    table_name varchar2(30);
    counter    number;
  Begin
    table_name := 'my_table';

    select count(*)
    into   counter
    from   user_tables
    where  table_name = Upper(Trim(my_block.table_name)) and
           dropped = 'NO';

    if counter = 0
    then
      execute immediate 'create table '||table_name||' as ... etc';
    else
      execute immediate 'truncate table '||table_name;
      execute immediate 'insert into '||table_name' select ... etc';
    end if;
  end my_block;

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 2014-09-30
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多