2017-05-31 16 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

ようこそスタックオーバーフロー。 [ask]を読んで[mcve]を作成してください。これについては、WHERE句に対応するデータがなく、エラーが発生しない場合、このクエリは何も出力しません。 – CodeCaster

+0

あなたはこれをどこで実行していますか?例えば。 SQL * Plusでは、両方のコードの後に​​スラッシュが必要です – Boneist

+0

Tom Kyteが言っているように、それはあなたのメカニックに行き、 "私の車は始まりません。 – sandman

答えて

0

カーソルループはNO_DATA_FOUNDをスローしません。したがって、クエリが行を返さない場合、カーソルは0回ループしてエレガントに終了します。

おそらく、プロンプトで渡した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; 

これは、明示的に例外を発生させます。


「.Howeverは、私は、有効な得意先コードを入力しても、それはそれは表示されません。あなたがどんな考えを持っていますか?」

クエリが4つのテーブルを結合します。だから、確認するために、クエリのロジックを介して動作する必要があります。

  1. 参加条件は、例えば、テーブル

で一致するデータが存在し、正しく

  • 指定されている、あなたは顧客を行います任意の注文を入力しますか?はいの場合、注文は有効な注文ステータスになっていますか?受注担当者IDは有効なIDですか?

  • +0

    ありがとうございました!それは働いて、出力としてエラーを示しました。ただし、有効なCustomerIDを入力しても表示されません。あなたは何か考えていますか? –

    +1

    それは最終的に働いた! **ありがとうございました**。 –

    +0

    この回答が助けになった場合は、アップアップしたり、受け入れたりする必要があります。受け入れられた回答は将来のシーカのためのリソースとしてStackOverflowを改善します。 – APC

    関連する問題