2011-04-26 67 views
1

我是Oracle新手,在我的包中聲明一個遊標問題。任何人都可以告訴我我做錯了什麼?如何解決在Procedure/Package中聲明遊標的問題?

由於

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; 

回答

3

此:

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