需要通过传递过程参数而不是声明表行类型来声明表类型

问题描述 投票:0回答:1

我在过程中传递一个参数(source_table_name),它实际上是一个table_name。 另外,我声明了一个集合类型并使用 source_table_name%rwtype 而不是actual_table_name%rowtype。它抛出一个错误。请建议是否有任何解决方法。

CREATE OR REPLACE PROCEDURE PRM_BKUP_TRNSACTION_TABLE_PROC
(
source_table_name                 IN VARCHAR2,
archive_date_col      IN  VARCHAR2,
archive_form_date          IN VARCHAR2,
archive_to_date            IN VARCHAR2

)

AS
--Collection

TYPE source_table_collection IS TABLE OF source_table_name%ROWTYPE; <----(passing proc parameter)
source_data source_table_collection;
sql oracle plsql
1个回答
0
投票

您不能使用变量进行输入。类型必须在编译时解析,而不是在执行时解析。在这种情况下,请使用动态 SQL 将编译推迟到执行时发生。将整个 PL/SQL 匿名块提交到

EXECUTE IMMEDIATE
,在其声明部分中您可以使用您需要的任何集合类型:

CREATE OR REPLACE PROCEDURE PRM_BKUP_TRNSACTION_TABLE_PROC
(
source_table_name                 IN VARCHAR2,
archive_date_col      IN  VARCHAR2,
archive_form_date          IN VARCHAR2,
archive_to_date            IN VARCHAR2

)

AS
BEGIN
  EXECUTE IMMEDIATE '
    DECLARE  
      TYPE source_table_collection IS TABLE OF '||source_table_name||'%ROWTYPE;
      source_data source_table_collection; 
      archive_date_col varchar2(128) := :archive_date_col;
      archive_form_date varchar2(30) := :archive_form_date;
      archive_to_date varchar2(30) := :archive_to_date;
    BEGIN
      NULL;
      -- do stuff
    END;
  ' USING IN archive_date_col,archive_form_date,archive_to_date;

END;
© www.soinside.com 2019 - 2024. All rights reserved.