PLS-00357: ссылка на таблицу, представление или последовательность "JANUARY_2020" не разрешена в этом контексте - PullRequest
0 голосов
/ 09 мая 2020

Я использую этот код, чтобы посмотреть, подойдет ли он для процедуры. Я хочу иметь возможность создать процедуру, в которой я могу решить, какие данные извлекать, введя время ('jan-2020'), в которое они записаны, а также решить, в какую таблицу я хочу поместить данные (january_2020 ). я получаю сообщение об ошибке, что таблица не может использоваться в этом контексте. Что мне нужно изменить в коде, чтобы он находился в правильном контексте?

Это потому, что я использую динамический c sql в al oop, который требует выполнения l oop положить данные в таблицу? или это потому, что я использую% 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;

1 Ответ

0 голосов
/ 09 мая 2020

Передайте имя таблицы в качестве входного параметра и замените переменную связывания обычной переменной для имени таблицы и объедините ее с оператором 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;

Из PL / SQL Процедура блока может быть выполнена следующим образом:

BEGIN
upload_monthly_expenses('jan-2020','january_2020');
END;
...