我刚开始学习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 - “无效的表名”
*原因:
*操作:
答案 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()
中的参数适用于参数。