【问题标题】:Oracle EXECUTE immediate UPDATE [duplicate]Oracle EXECUTE 立即更新 [重复]
【发布时间】:2018-04-15 12:19:10
【问题描述】:

我刚开始学习Oracle。当我执行以下语句时

DECLARE
  sql_stmt VARCHAR2(200);
  table_obj user_tables.table_name%type;
begin
    for l_i in (select table_name from results) loop

      table_obj := dbms_assert.sql_object_name(l_i.table_name);

      sql_stmt :=  'update results set cnt_record = ( select count(*) from :1) where table_name = UPPER(:2)'; 

      EXECUTE IMMEDIATE sql_stmt 
      USING table_obj, l_i.table_name;          
    end loop;
end;

我收到一个错误:

错误报告-

ORA-00903: 无效的表名
ORA-06512:在第 11 行
00903. 00000 - “无效的表名”
*原因:
*行动:

【问题讨论】:

    标签: sql oracle dynamic-sql


    【解决方案1】:

    您只能将常量名称传递给表达式。不允许传递表名、列名、运算符、函数名等。

    因此,您必须在执行之前“修改”查询字符串:

          table_obj := dbms_assert.sql_object_name(l_i.table_name);
    
          sql_stmt :=  'update results set cnt_record = ( select count(*) from <tablename>) where table_name = UPPER(:1)'; 
    
          sql_stmt := replace(sql_stmt, '<tablename>', table_obj);
    
          EXECUTE IMMEDIATE sql_stmt 
          USING l_i.table_name;          
        end loop;
    end;
    

    您可以使用replace() 替换这两个匹配项,但upper() 中的参数可以用作参数。

    【讨论】:

    • 谢谢!并且您可以更详细地了解“您可以使用 replace() 替换这两个事件,但 upper() 中的参数可以作为参数。”
    • @GPlat 。 . .我正在区分用作比较名称的表和from 子句中使用的表。第一个可以使用参数,尽管第二个不能。
    猜你喜欢
    • 2020-10-09
    • 2021-01-15
    • 2018-08-12
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2019-11-30
    相关资源
    最近更新 更多