хранимая процедура oracle для получения суммы (баланса) по заданному параметру - PullRequest
0 голосов
/ 15 марта 2012

У меня есть таблица supplier_product (supp_id, prod_id, invoice_id, price) и таблица счетов-фактур (invoice_id, balance).Я попробовал сохраненный процесс.учитывая (supp_id), он должен все существующие invoice_id и отображать баланс.вот мой код:

set serverouput on;
create or replace
Procedure SUP_loop
(v_SUPPLIER_ID int   )
AS
  CURSOR c_SUP IS
    select  SUPPLIER_ID , SUPP_INVOICE_ID, balance 
      from SUPPLIER_PRODUCT, supplier_invoice
     where SUPPLIER_ID=v_SUPPLIER_ID 
       and supp_invoice_id.supplier_product=supp_invoice_id.supplier_invoice;
BEGIN
  --LOOP WITH IMPLICIT VARIABLE DECLARED 
  --AUTOMATIC, OPEN FETCH, CLOSE

  FOR v_SUP_data IN c_SUP LOOP
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_SUP_data.SUPPLIER_ID) || '   ' || 
                             TO_CHAR(v_SUP_data.SUPP_INVOICE_ID) || '   ' || 
                             TO_CHAR(v_SUP_data.balance)  );
  END LOOP;
END;
/

ошибка, которую я получаю: v_sup_data Ошибка (20,31): PLS-00364: недопустимо использование индексной переменной цикла V_SUP_DATA

Error(9,74): PL/SQL: ORA-00904: "SUPP_INVOICE_ID"."SUPPLIER_INVOICE": invalid identifier

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Поле и имена таблиц поменялись местами не так

У вас есть ...

supp_invoice_id.supplier_invoice

... где вы должны иметь ...

supplier_invoice.supp_invoice_id

: D

0 голосов
/ 15 марта 2012

Синтаксис для ссылки на столбец: <>. <>.Таким образом, ваш запрос курсора требует, чтобы условие соединения было supplier_produce.supp_invoice_id = supplier_invoice.supp_invoice_id, то есть

create or replace
Procedure SUP_loop
(v_SUPPLIER_ID int   )
AS
  CURSOR c_SUP IS
    select  SUPPLIER_ID , SUPP_INVOICE_ID, balance 
      from SUPPLIER_PRODUCT, supplier_invoice
     where SUPPLIER_ID=v_SUPPLIER_ID 
       and supplier_product.supp_invoice_id = supplier_invoice.supp_invoice_id;
BEGIN
  --LOOP WITH IMPLICIT VARIABLE DECLARED 
  --AUTOMATIC, OPEN FETCH, CLOSE

  FOR v_SUP_data IN c_SUP LOOP
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_SUP_data.SUPPLIER_ID) || '   ' || 
                             TO_CHAR(v_SUP_data.SUPP_INVOICE_ID) || '   ' || 
                             TO_CHAR(v_SUP_data.balance)  );
  END LOOP;
END;
/
...