PL / SQL UPDATE / INSERT与表的变量

时间:2015-03-27 23:21:18

标签: oracle plsql

可以使用表名变量构建语句而无需创建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;
/

1 个答案:

答案 0 :(得分:1)

  

" [是否]可以使用表的变量构建语句   名称没有创建VARCHAR并使用EXECUTE IMMEDIATE?"

没有

SQL是一种强类型语言。编译器需要实际的表名,以便验证SQL语句的各种组件(投影,过滤器等)。

动态SQL(EXECUTE IMMEDIATE和DBMS_SQL)是缩短编译时验证所必需的。从本质上讲,它是一种机制,可以减轻编译器验证SQL并将其带到自己身上的负担(因为人类在这些工作上比机器更好。不是)。

或者,它是一种生成运行时错误而不是编译错误的机制。

无论哪种方式,知道过滤器中COLUMN的名称而不是要更新的TABLE的名称都很奇怪。