Oracle EXECUTE立即更新

时间:2018-04-15 12:19:11

标签: sql oracle dynamic-sql

我刚开始学习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 - “无效的表名”
  *原因:
  *操作:

1 个答案:

答案 0 :(得分:0)

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

所以,你必须" munge"执行它之前的查询字符串:

      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()中的参数适用于参数。