PLS-00357.表、视图或序列参考'JANUARY_2020'是不允许的。在此上下文中不允许引用 "JANUARY_2020 "表、视图或序列。

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

我正在使用这段代码,看看它是否适用于一个过程。我想做一个过程,在这个过程中,我可以通过输入时间('jan-2020')来决定提取什么数据,也可以决定将数据放在哪个表中(january_2020)。我必须在代码中改变什么才能在正确的上下文中使用?

是因為我在一個循環中使用了動態SQL,而這個循環需要被執行才能把數據放到表中嗎? 還是因為我使用%rowtype作為表ALL_DATA的屬性來創建它自己的列?如果是这些原因,我应该怎么做才能改变它?

DECLARE
time_v varchar2(9);
table_v varchar2(200);
sql_code varchar2(300);

TYPE Copied_Table IS TABLE OF Gastos%ROWTYPE;

All_Data    Copied_Table;

BEGIN

time_v := 'jan-2020';

SELECT *
BULK COLLECT INTO All_Data FROM Gastos
Where TO_CHAR(DATE_, 'MON-YYYY') = UPPER(time_v);


FOR I in All_Data.First .. All_Data.Last LOOP

sql_code := 'INSERT INTO :table_v ( DATE_, DESCRIPTION, ORIGINAL_DESCRIPTION, AMOUNT,             
TRANSACTION_TYPE, CATEGORY, ACCOUNT_NAME)
Values ( ALL_Data(i).date_, ALL_Data(i).description, ALL_Data(i).original_description,                             
ALL_Data(i).amount, ALL_Data(i).transaction_type, ALL_Data(i).category, ALL_Data(i).account_name)';

table_v := january_2020;

execute immediate sql_code 
using table_v;

END LOOP;

END upload_monthly_expenses;
sql plsql oracle-sqldeveloper oracle-apex plsqldeveloper
1个回答
0
投票

传递表名作为输入参数,并将表名的绑定变量替换为普通变量,并将其连接到DML语句中,修改你的代码如下。

CREATE OR REPLACE PROCEDURE upload_monthly_expenses(table_v IN VARCHAR2,time_v IN VARCHAR2) AS
    DECLARE
    sql_code varchar2(300);

    TYPE Copied_Table IS TABLE OF Gastos%ROWTYPE;

    All_Data    Copied_Table;

    BEGIN


    SELECT *
    BULK COLLECT INTO All_Data FROM Gastos
    Where TO_CHAR(DATE_, 'MON-YYYY') = UPPER(time_v);


    FOR I in All_Data.First .. All_Data.Last LOOP        

    sql_code := 'INSERT INTO '||table_v||' ( DATE_, DESCRIPTION, ORIGINAL_DESCRIPTION, AMOUNT,             
    TRANSACTION_TYPE, CATEGORY, ACCOUNT_NAME)
    Values ( ALL_Data(i).date_, ALL_Data(i).description, ALL_Data(i).original_description,                             
    ALL_Data(i).amount, ALL_Data(i).transaction_type, ALL_Data(i).category, ALL_Data(i).account_name)';

    execute immediate sql_code;

    END LOOP;

    END;

从PLSQL块中可以执行如下过程。

BEGIN
upload_monthly_expenses('jan-2020','january_2020');
END;
© www.soinside.com 2019 - 2024. All rights reserved.