Oracle EXECUTE 立即更新

Oracle EXECUTE immediate UPDATE

我刚开始学习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: invalid table name
ORA-06512: at line 11
00903. 00000 - "invalid table name"
*Cause:
*Action:

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

因此,您必须在执行之前 "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() 中的参数对于参数来说是好的。