我在过程中传递一个参数(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 将编译推迟到执行时发生。将整个 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;