Как решить проблему с объявлением курсора в процедуре / пакете? - PullRequest
1 голос
/ 26 апреля 2011

Я новичок в Oracle, и у меня возникают проблемы с объявлением курсора в моем пакете.Может кто-нибудь сказать мне, что я делаю не так?

Спасибо

CREATE OR REPLACE PACKAGE CHECK_STOCK_LEVELS AS
 PROCEDURE CHECK_PAYMTS_AGAINST_INVOICES;
 FUNCTION CHECK_PROD_PRICE RETURN NUMBER;
 END;

/

CREATE OR REPLACE PACKAGE BODY CHECK_STOCK_LEVELS AS
FUNCTION CHECK_PROD_PRICE (INP_PROD_NAME VARCHAR2)
RETURN NUMBER
IS
PROD_CNT PRODUCT.PROD_NAME%TYPE;
BEGIN
  SELECT PROD_PRICE INTO PROD_CNT
  FROM PRODUCT WHERE PROD_PRICE = INP_PROD_NAME;
  RETURN (PROD_CNT);
END CHECK_PROD_PRICE;

/

SELECT CHECK_STOCK_LEVELS.CHECK_PROD_PRICE(3.5mm Jack) FROM DUAL;

PROCEDURE CHECK_PAYMTS_AGAINST_INVOICES
 DECLARE CURSOR SEL_PAYMTS_AND_INVS
 IS
SELECT P.INVOICE_ID, P.PAYMENT_AMOUNT, I.INVOICE_AMOUNT
 FROM PAYMENT P
INNER JOIN INVOICE I ON P.INVOICE_ID = I.INVOICE_ID;
    V_TEMP_RESULTS_ROW SEL_PAYMTS_AND_INVS%ROWTYPE;
    PAYMT_INVOICE_MISMATCH EXCEPTION;
BEGIN
  OPEN SEL_PAYMTS_AND_INVS;
  FETCH SEL_PAYMTS_AND_INVS INTO V_TEMP_RESULTS_ROW;
  WHILE SEL_PAYMTS_AND_INVS%FOUND LOOP
  IF V_TEMP_RESULTS_ROW.PAYMENT_AMOUNT != V_TEMP_RESULTS_ROW.INVOICE_AMOUNT THEN
      DBMS_OUTPUT.PUT_LINE('EMPLOYEE ID : ' || V_EMPLOYEE_ROW.EMPID || ' HAS A SALARY   OF : ' || V_EMPLOYEE_ROW.SALARY);
      RAISE PAYMT_INVOICE_MISMATCH;
  END IF;
  FETCH SEL_PAYMTS_AND_INVS INTO V_TEMP_RESULTS_ROW;
END LOOP;
CLOSE SEL_PAYMTS_AND_INVS;
EXCEPTION
  WHEN PAYMT_INVOICE_MISMATCH THEN
     DBMS_OUTPUT.PUT_LINE('PAYMENT AMOUNT DOES NOT MATCH INVOICE AMOUNT');
     RAISE;
END;
END;

1 Ответ

3 голосов
/ 26 апреля 2011

Это:

SELECT CHECK_STOCK_LEVELS.CHECK_PROD_PRICE(3.5mm Jack) FROM DUAL;

должно быть:

SELECT CHECK_STOCK_LEVELS.CHECK_PROD_PRICE('3.5mm Jack') FROM DUAL;

А это:

PROCEDURE CHECK_PAYMTS_AGAINST_INVOICES
 DECLARE CURSOR SEL_PAYMTS_AND_INVS
 IS
SELECT P.INVOICE_ID, P.PAYMENT_AMOUNT, I.INVOICE_AMOUNT
 FROM PAYMENT P
INNER JOIN INVOICE I ON P.INVOICE_ID = I.INVOICE_ID;
    V_TEMP_RESULTS_ROW SEL_PAYMTS_AND_INVS%ROWTYPE;
    PAYMT_INVOICE_MISMATCH EXCEPTION;
BEGIN
...

должно быть:

PROCEDURE CHECK_PAYMTS_AGAINST_INVOICES
IS -- not DECLARE
 CURSOR SEL_PAYMTS_AND_INVS
 IS
  SELECT P.INVOICE_ID, P.PAYMENT_AMOUNT, I.INVOICE_AMOUNT
   FROM PAYMENT P
   INNER JOIN INVOICE I ON P.INVOICE_ID = I.INVOICE_ID;
  V_TEMP_RESULTS_ROW SEL_PAYMTS_AND_INVS%ROWTYPE;
  PAYMT_INVOICE_MISMATCH EXCEPTION;
BEGIN
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...