PL/SQL UPDATE/INSERT 与 table 的变量
PL/SQL UPDATE/INSERT with table's variable
是否可以在不创建 VARCHAR 和使用 EXECUTE IMMEDIATE 的情况下为 table 名称使用变量来构建语句?
例如:
@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;
/
"[Is it] possible to build a statement using variables for the table
name without creating a VARCHAR and using EXECUTE IMMEDIATE?"
没有
SQL 是一种强类型语言。编译器需要实际的 table 名称来验证 SQL 语句的各个组件(投影、过滤器等)。
动态SQL(立即执行和DBMS_SQL)对于缩短编译时验证是必要的。从本质上讲,它是一种机制,可以减轻编译器验证 SQL 并由我们自己承担的负担(因为人类比机器更擅长此类工作。不是)。
或者,它是一种生成运行时错误而不是编译错误的机制。
无论哪种方式,知道过滤器中的 COLUMN 的名称但不知道正在更新的 TABLE 的名称是很奇怪的。
是否可以在不创建 VARCHAR 和使用 EXECUTE IMMEDIATE 的情况下为 table 名称使用变量来构建语句?
例如:
@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;
/
"[Is it] possible to build a statement using variables for the table name without creating a VARCHAR and using EXECUTE IMMEDIATE?"
没有
SQL 是一种强类型语言。编译器需要实际的 table 名称来验证 SQL 语句的各个组件(投影、过滤器等)。
动态SQL(立即执行和DBMS_SQL)对于缩短编译时验证是必要的。从本质上讲,它是一种机制,可以减轻编译器验证 SQL 并由我们自己承担的负担(因为人类比机器更擅长此类工作。不是)。
或者,它是一种生成运行时错误而不是编译错误的机制。
无论哪种方式,知道过滤器中的 COLUMN 的名称但不知道正在更新的 TABLE 的名称是很奇怪的。