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()
中的参数对于参数来说是好的。
我刚开始学习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()
中的参数对于参数来说是好的。