TABLE_NAME作为Oracle存储过程中的参数

时间:2014-11-07 19:47:21

标签: oracle stored-procedures

在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;

2 个答案:

答案 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;

当然,您有许多表的结构与table1table2的结构完全匹配且其数据可以有意义地用于此类MINUS操作的事实强烈暗示您有一个应该修复的基础数据模型问题。使用动态SQL可能只是在这个基本问题上加上绷带。

答案 1 :(得分:0)

请注意,每次调用动态SQL时都会对其进行重新解析,而存储过程中的静态,已编译和参数化SQL可能只会被解析一次,对于许多(可能是数千次)执行。因此,如果您的SQL经常或大量执行,则使用动态SQL可能会对性能造成危害。