Выполнение процедуры в Oracle - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь написать процедуру, которая вставляет оплаченные счета из таблицы paid_invoices в таблицу invoice_archive. Только те оплаченные счета, которые старше или равны 31-05-2014, должны быть переданы.

Вот моя процедура:

SQL> create or replace procedure paid_invoice_transfer as
  cursor paid is
    select *
      from paid_invoices
     where invoice_total = credit_total + payment_total
       and payment_date <= '2014-05-31';
  invoice_archive_text paid%rowtype;
begin
  for invoice_archive_text in paid loop
    dbms_output.put_line(invoice_archive_text.invoice_id);
    insert into invoice_archive values invoice_archive_text;
  end loop;
end;
/

Я не уверен, что выполнить в этот момент:

SQL> set serveroutput on;
SQL> execute paid_invoice_transfer(???);

1 Ответ

0 голосов
/ 09 ноября 2018

Теперь, когда вы знаете, как выполнить процедуру без аргумента, я также хотел бы указать на проблемы с вашей процедурой.

Нет необходимости определять переменную записи для циклического перемещения курсора.

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' )
...