2017-05-31 65 views
-3

當我嘗試運行此代碼時,它不顯示任何輸出,我不知道爲什麼。SQL過程 - 什麼都不打印

此程序接收客戶ID並顯示由指定客戶製作的所有訂單 。它使用光標來存儲訂單的詳細信息 ,然後打印詳細信息。

SET SERVEROUTPUT ON; 
    create or replace PROCEDURE procedure_CustOrderHistory (cust_id IN number) AS 
    CURSOR c_CustOrderHistory IS 

    Select o.order_id, o.order_totalCost, o.order_date, cu.customer_firstName, 
    cu.customer_lastName, s.staff_firstName, s.staff_lastName, os.order_status 
    FROM orders o, customer cu, staff s, order_status os 
    where o.customer_id=cu.customer_id AND s.staff_id = o.staff_id AND 
    os.order_statusID = o.order_statusID and cu.customer_id = cust_id ; 

BEGIN 
    FOR r_order IN c_CustOrderHistory 
    LOOP 
    dbms_output.put_line('Order ID: '||r_order.order_id || ', Order Total Cost: ' || r_order.order_totalCost || 'BHD, Order Date: ' || r_order.order_date || ', Customer Name: ' || r_order.customer_firstName || ' ' || r_order.customer_lastName|| ', Customer Name: ' || r_order.customer_firstName || ' ' || r_order.customer_lastName || ', Order Status: '|| r_order.order_status);    
    END LOOP; 
END; 

這個匿名塊測試前面的程序。它詢問用戶 的ID,然後通過傳入客戶ID來調用該過程。

SET SERVEROUTPUT ON; 
DECLARE 
    v_custid number := &customerid; 
BEGIN 
    procedure_CustOrderHistory(v_custid); 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    dbms_output.put_line('Customer ID not found.'); 
    WHEN OTHERS THEN 
    dbms_output.put_line('Error! ' || SQLERRM); 
END; 
+0

歡迎來到Stack Overflow。請閱讀[問]並創建[mcve]。我們可以說的是:如果沒有與WHERE子句相對應的數據並且沒有發生錯誤,則此查詢將不會打印任何內容。 – CodeCaster

+0

你在哪裏運行?例如。在SQL * Plus中,在兩套代碼 – Boneist

+0

之後,你需要一個正斜槓。正如Tom Kyte所說,這就像去找你的機械師並且說「我的車不會啓動,我不知道爲什麼」... – sandman

回答

0

遊標循環不會拋出NO_DATA_FOUND。所以如果你的查詢沒有返回任何行,遊標將循環零次並優雅地退出。

因此,最有可能發生的情況是您沒有在提示處傳遞的ID的customer記錄,或者光標查詢中存在其他邏輯問題(例如,客戶沒有訂單)。

您可以通過添加這樣的計數器測試我的理論:

create or replace PROCEDURE procedure_CustOrderHistory (cust_id IN number) AS 
    CURSOR c_CustOrderHistory IS 

    Select o.order_id, o.order_totalCost, o.order_date, cu.customer_firstName, 
    cu.customer_lastName, s.staff_firstName, s.staff_lastName, os.order_status 
    FROM orders o, customer cu, staff s, order_status os 
    where o.customer_id=cu.customer_id AND s.staff_id = o.staff_id AND 
    os.order_statusID = o.order_statusID and cu.customer_id = cust_id ; 
    rec_ctr pls_integer := 0; 
BEGIN 
    FOR r_order IN c_CustOrderHistory 
    LOOP 
    rec_ctr := rec_ctr +1; 
    dbms_output.put_line('#'|| rec_ctr ||' '|| 
      'Order ID: '||r_order.order_id || ', Order Total Cost: ' || r_order.order_totalCost || 'BHD, Order Date: ' || r_order.order_date || ', Customer Name: ' || r_order.customer_firstName || ' ' || r_order.customer_lastName|| ', Customer Name: ' || r_order.customer_firstName || ' ' || r_order.customer_lastName || ', Order Status: '|| r_order.order_status);    
    END LOOP; 
    if rec_ctr = 0 then 
    raise no_data_found; 
    end if; 
END; 

這明確地拋出一個異常,如果循環處理任何行。


「不過,即使我輸入一個有效的客戶ID不顯示它。你有什麼想法?」

您的查詢加入了四個表格。因此,你需要通過查詢的邏輯工作,以確保:

  1. 的加盟條件,正確指定
  2. 有匹配數據的表

例如在,客戶是否你輸入有任何命令?如果是,他們的訂單是否有有效的訂單狀態。訂單員工ID是否有效?

+0

謝謝!它工作並顯示錯誤作爲輸出。但是,即使我輸入了有效的CustomerID,它也不會顯示它。你有什麼主意嗎? –

+1

它終於奏效了! **謝謝**。 –

+0

如果這個答案幫助你應該upvote和/或接受它。被接受的答案將StackOverflow提升爲未來尋找者的資源。 – APC

相關問題