可以使用表名变量构建语句而无需创建VARCHAR并使用EXECUTE IMMEDIATE吗?
例如:
@table_name := test_table
UPDATE @table_name
SET col1 = val1
WHERE condition...;
这是我的实际解决方法:
DECLARE
sql_stmt VARCHAR2(1000);
table_name VARCHAR2(30) := 'test_table';
BEGIN
sql_stmt := 'UPDATE ' || table_name || ' SET col1 = val1...';
EXECUTE IMMEDIATE sql_stmt;
END;
/
答案 0 :(得分:1)
" [是否]可以使用表的变量构建语句 名称没有创建VARCHAR并使用EXECUTE IMMEDIATE?"
没有
SQL是一种强类型语言。编译器需要实际的表名,以便验证SQL语句的各种组件(投影,过滤器等)。
动态SQL(EXECUTE IMMEDIATE和DBMS_SQL)是缩短编译时验证所必需的。从本质上讲,它是一种机制,可以减轻编译器验证SQL并将其带到自己身上的负担(因为人类在这些工作上比机器更好。不是)。
或者,它是一种生成运行时错误而不是编译错误的机制。
无论哪种方式,知道过滤器中COLUMN的名称而不是要更新的TABLE的名称都很奇怪。