Теперь, когда вы знаете, как выполнить процедуру без аргумента, я также хотел бы указать на проблемы с вашей процедурой.
Нет необходимости определять переменную записи для циклического перемещения курсора.
invoice_archive_text paid%rowtype
Pl / SQL автоматически создает его, когда вы используете его для цикла for. Я сделаю еще один шаг и попрошу вас избегать циклов для запуска INSERT
. Просто используйте обычный INSERT INTO target_table select * from source_table
и явно укажите имена столбцов, чтобы быть безопасными.
Если вы хотите отобразить идентификаторы, которые вставляются через DBMS_OUTPUT.PUT_LINE
, сохраните их в коллекции и зациклите отдельно для целей отображения (только если вы считаете, что отображение необходимо).
Я также хотел показать вам, как передать аргумент даты для выполнения, поэтому я передам payment_date. В вашей процедуре вы ошибочно сравниваете ее с литеральной строкой, а не с датой. Обязательно произойдет сбой, если NLS_DATE_
параметры не совпадают со строкой.
CREATE OR REPLACE PROCEDURE paid_invoice_transfer ( p_payment_date DATE ) AS
TYPE tab_inv IS TABLE OF paid_invoices.invoice_id%type;
t_tab tab_inv;
BEGIN
SELECT invoice_id BULK COLLECT INTO t_tab
FROM paid_invoices
WHERE invoice_total = credit_total + payment_total
AND payment_date <= p_payment_date;
FOR i IN t_tab.FIRST..t_tab.LAST LOOP
dbms_output.put_line(t_tab(i));
END LOOP;
INSERT INTO invoice_archive ( column1,column2,column3) select col1,col2,col3
FROM paid_invoices
WHERE invoice_total = credit_total + payment_total
AND payment_date <= p_payment_date;
END;
/
set serveroutput on
execute paid_invoice_transfer(DATE '2014-05-31' )