2013-04-27 27 views
0

我想實現這個過程到包裝,不過包裝 不會允許我使用光標出於某種原因。誰能幫忙?謝謝。光標將不會工作在封裝過程

此外,當我試圖把程序到我包了「輸入綁定變量」對話框出現 負任何地方輸入綁定變量,但此錯誤

Not found 
The requested URL /apex/wwv_flow.show was not found on this server 

我的代碼是

PROCEDURE total_calc(p_order NUMBER) 
IS 
    c_price product.unit_price%type; 
    c_prod_desc product.product_desc%type; 
    v_total_cost NUMBER := 0; 
    v_c1 REFCURSOR; 
    CURSOR c1 IS 
     SELECT product_desc, unit_price 
     FROM product 
     WHERE product_id IN (SELECT fk2_product_id 
          FROM order_line 
          WHERE fk1_order_id = p_order); 
BEGIN 
    OPEN c1; 
    LOOP 
     FETCH c1 into c_prod_desc, c_price; 
     dbms_output.put_line(c_prod_desc || ': ' || c_price); 
     v_total_cost := v_total_cost + c_price; 
     EXIT WHEN c1%notfound; 
    END LOOP; 
    CLOSE c1; 
    dbms_output.put_line('Total Cost:' || v_total_cost); 
END; 

下面是包的其餘部分的代碼

CREATE OR REPLACE PACKAGE orders_salary_manage AS 
    FUNCTION tax_func (p_sal IN NUMBER) 
    RETURN NUMBER; 
    PROCEDURE reduce_price(p_product_id NUMBER, p_sub_price NUMBER); 
    PROCEDURE increase_price(p_product_id NUMBER, p_add_price NUMBER); 
    PROCEDURE remove_order(p_order_id NUMBER); 
    PROCEDURE add_order(p_order_id NUMBER, 
             p_order_date VARCHAR2, 
             p_delivery_date VARCHAR2, 
             p_customer_id NUMBER, 
             p_employee_id NUMBER, 
             p_order_type_id NUMBER); 
END orders_salary_manage; 

CREATE OR REPLACE PACKAGE BODY orders_salary_manage AS 
    tot_orders NUMBER; 

FUNCTION tax_func (p_sal IN NUMBER) 
    RETURN NUMBER 
IS 
    tax_rate NUMBER := 0; 
    v_netsal NUMBER := 0; 
    v_sal NUMBER; 
BEGIN 
    v_sal := p_sal; 
IF v_sal > 70000 THEN 
    tax_rate := (v_sal * 0.4); 
    v_netsal := v_sal - tax_rate; 
END IF; 
IF v_sal < 70000 THEN 
    tax_rate := (v_sal * 0.2); 
    v_netsal := v_sal - tax_rate; 
END IF; 

RETURN v_netsal; 
END; 


PROCEDURE reduce_price(p_product_id NUMBER, p_sub_price NUMBER) 
IS v_price NUMBER; 
    e_invalid_price EXCEPTION; 
BEGIN 
    SELECT unit_price 
    INTO v_price 
    FROM product 
    WHERE product_id = p_product_id; 

    v_price := v_price - p_sub_price; 

    IF v_price < 1 THEN 
    RAISE e_invalid_price; 
    ELSE 
     UPDATE product SET unit_price = v_price WHERE product_id = p_product_id; 
    END IF; 

END; 

PROCEDURE increase_price(p_product_id NUMBER, p_add_price NUMBER) 
IS v_price NUMBER; 
BEGIN 
    SELECT unit_price 
    INTO v_price 
    FROM product 
    WHERE product_id = p_product_id; 

    v_price := v_price + p_add_price; 

    UPDATE product SET unit_price = v_price WHERE product_id = p_product_id; 

END; 

PROCEDURE remove_order(p_order_id NUMBER) 
IS 
BEGIN 

    DELETE FROM placed_order WHERE order_id = p_order_id; 
    DELETE FROM order_line WHERE fk1_order_id = p_order_id; 

END; 

PROCEDURE add_order(p_order_id NUMBER, 
             p_order_date VARCHAR2, 
             p_delivery_date VARCHAR2, 
             p_customer_id NUMBER, 
             p_employee_id NUMBER, 
             p_order_type_id NUMBER) 
IS new_order NUMBER; 
BEGIN 


    INSERT INTO placed_order (order_id, order_date, delivery_date, fk1_customer_id, fk2_employee_id, fk3_order_type_id) 
    VALUES (p_order_id, p_order_date, p_delivery_date, p_customer_id, p_employee_id, p_order_type_id); 

END; 
END; 
+0

您正在計算訂單中包含的產品單價總和的成本? – 2013-04-27 16:58:49

+0

是有一張表上有訂單行和產品表。 我從產品表中選取與用戶放入的訂單號相匹配的產品說明和價格。 謝謝 – user2241161 2013-04-27 17:18:46

+0

如果某人訂購了某一特定產品的三種產品,該怎麼辦? – 2013-04-27 17:24:53

回答

0

這是真實的令人困惑。

第一關 - DBMS_OUTPUT需要對環境特殊設置才能工作。並且打電話給DBMS_OUTPUT.ENABLE,再加上軟件包確實可以訪問終端。包沒有你的進程上下文,它們運行在db的進程上下文中 - 它運行時沒有控制終端。如果你必須使用文件寫一些東西 - UTL_FILE包是爲了那個。

下一頁 因爲你基本上是添加了一個命令,你需要一個函數返回值。 程序不起作用。正如你編碼一樣。

下一頁 v_C1不使用,是沒有意義的代碼。你沒有返回一個refcursor。

下一頁 你應該考慮使用模式與像通用表名錶時,你decalre一個變量。

例如:

v_foo schema_owner.table_name.column_name%type; 

考慮一下:

function total_calc(p_order in NUMBER) 
return NUMBER 
is 
    c_price product.unit_price%type; 
    c_prod_desc product.product_desc%type; 
    v_total_cost NUMBER := 0; 
    -- lose this: v_c1 REFCURSOR; 
    CURSOR c1 IS 
     SELECT product_desc, unit_price 
     FROM product 
     WHERE product_id IN (SELECT fk2_product_id 
          FROM order_line 
          WHERE fk1_order_id = p_order); 
BEGIN 
    OPEN c1; 
    LOOP 
     FETCH c1 into c_prod_desc, c_price; 
    -- lose this line: dbms_output.put_line(c_prod_desc || ': ' || c_price); 
     v_total_cost := v_total_cost + c_price; 
     EXIT WHEN c1%notfound; 
    END LOOP; 
    CLOSE c1; 
    -- lose this line: dbms_output.put_line('Total Cost:' || v_total_cost); 
    return v_total_cost; 
END; 

爲了這個工作有一個 CREATE OR REPLACE FUNCTION一個語句中。然後 - 由具有正確權限的用戶添加到數據庫模式以創建它。

畢竟這一點,那麼你可以運行它。另外,如果有人需要從SQLPLUS運行這個功能,那麼所有這些包/功能創建都會使用PRAGMAS。

+0

感謝您的回覆和建議。我測試了這個,它似乎仍然不會與我的包一起工作,所以我已經將它放在它自己的包中,現在它工作正常。 – user2241161 2013-04-28 19:47:23