在Oracle存储过程
中查找将表名作为参数传递的建议例如:
CREATE OR REPLACE PROCEDURE <procedure name>
(
<table name> IN VARCHAR2
) IS
BEGIN
INSERT INTO table1
(
SELECT * FROM schema.<table name from parameter>
MINUS
SELECT * FROM table2);
END;
答案 0 :(得分:1)
如果您想这样做,则需要使用动态SQL
CREATE OR REPLACE PROCEDURE sample_procedure( p_table_name IN VARCHAR2 )
IS
l_sql_stmt VARCHAR2(1000);
BEGIN
l_sql_stmt :=
'INSERT INTO table1 ' ||
' (SELECT * FROM schema.' || p_table_name ||
' MINUS ' ||
' SELECT * FROM table2) ';
EXECUTE IMMEDIATE l_sql_stmt;
END;
当然,您有许多表的结构与table1
和table2
的结构完全匹配且其数据可以有意义地用于此类MINUS
操作的事实强烈暗示您有一个应该修复的基础数据模型问题。使用动态SQL可能只是在这个基本问题上加上绷带。
答案 1 :(得分:0)
请注意,每次调用动态SQL时都会对其进行重新解析,而存储过程中的静态,已编译和参数化SQL可能只会被解析一次,对于许多(可能是数千次)执行。因此,如果您的SQL经常或大量执行,则使用动态SQL可能会对性能造成危害。