2016-03-26 13 views
0

customer IDorder IDとその他のデータを含むテーブルがあります。レコードが見つからないときに例外を発生する

customer IDを入力してテーブル内を調べるprocedureを作成します。

その顧客が存在する場合はorderの詳細を、 の顧客が存在しない場合はexceptionを「顧客が見つかりません」と表示してください。

私はこのコードを持っていますが、正しく動作していないか、この質問に間違ったアプローチをしている可能性があります。

CREATE OR REPLACE PROCEDURE order_details(customer NUMBER) 
    IS 
    CURSOR order_cursor IS 
    SELECT ORDER_ID, ORDER_DATE, TOTAL, CUSTOMER_ID 
     FROM PRODUCT_ORDER 
    WHERE CUSTOMER_ID = customer ; 
    order_row order_cursor%ROWTYPE ; 
    customer_error EXCEPTION ; 

    BEGIN 
     FOR order_row IN order_cursor 
    LOOP 
     IF order_cursor%FOUND THEN 
    dbms_output.put_line ('order id = ' || order_row.ORDER_ID) ; 
    ELSE 
    RAISE customer_error ; 
    END IF; 
    END LOOP; 

    EXCEPTION 
    WHEN customer_error THEN 
    dbms_output.put_line ('no customer') ; 
     END; 

私は

このラインでの手順を実行した場合の順序は、この顧客のために存在するので、だから私は二つの結果を取得します。私はこのライン

BEGIN 
    order_details(101); 
END; 

で手順を実行した場合、その顧客のためのオーダーがないので

と私は何も(いなくても、エラー)を得ることはありません。

Table Data

答えて

0

あなたは代わりに "カーソルFORループ" の "明示カーソル" を使用する必要があります。後者は、クエリが複数のレコードを返すときに、LOOPとEND LOOPの間のコードを入力するだけです。

CREATE OR REPLACE PROCEDURE order_details(customer NUMBER) 
    IS 
    CURSOR order_cursor IS 
    SELECT ORDER_ID, ORDER_DATE, TOTAL, CUSTOMER_ID 
     FROM PRODUCT_ORDER 
    WHERE CUSTOMER_ID = customer ; 
    order_row order_cursor%ROWTYPE ; 
    customer_error EXCEPTION ; 

    BEGIN 
    OPEN order_cursor; 
    LOOP 
    FETCH order_cursor INTO order_row; 
    EXIT WHEN order_cursor%NOTFOUND; 
    dbms_output.put_line ('order id = ' || order_row.ORDER_ID); 
    END LOOP; 

    IF order_cursor%rowcount = 0 THEN 
    RAISE customer_error; 
    END IF; 

    CLOSE order_cursor; 

    EXCEPTION 
    WHEN customer_error THEN 
    dbms_output.put_line ('no customer') ; 

END; 

よろしく

+0

私はすでにあまりにも、これに関する問題これを試してみました、私は顧客を持っていないときにはうまく機能しているが、私は顧客を持っている場合、その顧客が複数のオーダーを持っている場合は、それ出力でその顧客の1つの注文のみを表示し、それ以外は表示しません。 –

+0

私はテーブルの中にデータ用の画像をアップロードしています。たとえば、顧客ID = 104のデータを2セット持っていますが、私が提案したコードを使用すると、 –

+0

このケースでは、LOOP-END LOOPと属性%rowcountと%notfoundを使用してすべてのORDER_IDまたは 'no customer'を表示するようにコードを修正しました。 –

関連する問題