2016-11-28 15 views
1

手順コード:PL/SQL数値または値のエラー:番号変換エラーに文字

CREATE OR REPLACE PROCEDURE GetOrder(
p_Order IN NUMBER, 
p_OrderDate OUT DATE, 
p_CusNbr OUT NUMBER, 
p_OrderOut OUT NUMBER, 
p_Name OUT VARCHAR2, 
p_Address OUT VARCHAR2, 
p_City OUT VARCHAR2, 
p_State OUT CHAR, 
p_Zip OUT NUMBER, 
p_Itm OUT NUMBER, 
p_Desc OUT VARCHAR2, 
p_Qty OUT NUMBER, 
p_Price OUT NUMBER) 
AS 
v_OrderDate ord.ord_date%type; 
v_CusNbr ord.Cus_nbr%type; 
v_Order ord.Ord_nbr%type; 
v_Name cus.cus_nme%type; 
v_Address cus.str_adr%type; 
v_City zip.city%type; 
v_state zip.st%type; 
v_Zip zip.zip%type; 
v_Itm itm.itm_nbr%type; 
v_Desc itm.ITM_DSC%TYPE; 
v_Qty ord_itm.ord_Qty%type; 
v_Price itm.ord_itm_price%type; 
BEGIN 
SELECT O.ORD_NBR, C.CUS_NBR, O.ORD_DATE, C.CUS_NME, C.STR_ADR, Z.CITY, Z.ST, I.ITM_NBR, I.ITM_DSC, OI.ORD_QTY, I.ORD_ITM_PRICE 
     INTO 
     v_Order, v_CusNbr, v_OrderDate, v_Name, v_Address, v_Zip, v_state, v_Itm, v_Desc, v_Qty, v_Price 
FROM ITM I JOIN ORD_ITM OI ON (I.ITM_NBR = OI.ITM_NBR) 
      JOIN ORD O ON (OI.ORD_NBR = O.ORD_NBR) 
      JOIN CUS C ON (O.CUS_NBR = C.CUS_NBR) 
      JOIN ZIP Z ON (C.ZIP_ADR = Z.ZIP) 
WHERE O.ORD_NBR = p_Order; 
DBMS_OUTPUT.PUT_LINE('ILLINOIS COMPUTERS'); 
DBMS_OUTPUT.PUT_LINE('CUSTOMER ORDER FORM'); 
DBMS_OUTPUT.PUT_LINE(v_Order || v_OrderDate || v_CusNbr); 
DBMS_OUTPUT.PUT_LINE('Name: ' || v_Name); 
DBMS_OUTPUT.PUT_LINE('Address: ' || v_Address); 
DBMS_OUTPUT.PUT_LINE('City: ' || v_City || ' State : ' || v_state || ' Zip: ' || v_Zip); 
DBMS_OUTPUT.PUT_LINE('Item No.' || 'Description' || 'Quantity' || 'Price'); 
DBMS_OUTPUT.PUT_LINE(v_Itm || v_Desc || v_Qty || v_Price); 
END GetOrder; 
/

そして、私はプロシージャを呼び出す:

DECLARE 
    p_OrderNbr NUMBER := &ordernumber; 
    p_OrderDateOutput DATE; 
    p_CusNbrOutput  NUMBER; 
    p_OrderNbrOutput NUMBER; 
    p_NameOutput  cus.cus_nme%type; 
    p_AddressOutput  cus.str_adr%type; 
    p_CityOutput  zip.city%type; 
    p_StateOutput  CHAR; 
    p_ZipOutput   NUMBER; 
    p_ItmOutput   NUMBER; 
    p_DescOutput  itm.itm_dsc%type; 
    p_QtyOutput   NUMBER; 
    p_PriceOutput  NUMBER; 
begin 
    GetOrder(p_OrderNbr, 
    p_OrderDateOutput, 
    p_CusNbrOutput, 
    p_OrderNbrOutput, 
    p_NameOutput, 
    p_AddressOutput, 
    p_CityOutput, 
    p_StateOutput, 
    p_ZipOutput, 
    p_ItmOutput, 
    p_DescOutput, 
    p_QtyOutput, 
    p_PriceOutput); 
END; 
/

私は

ORA-06502 error: numeric or value error: character to number conversion error.

を取得しています

私はすべてのパラメータが順番に並んでいると思いますので、矛盾する変数の割り当てが得られていません。

このクエリを別々に実行して、適切な出力が得られていることを確認してください。正常に動作します。

SELECT O.ORD_NBR, C.CUS_NBR, O.ORD_DATE, C.CUS_NME, C.STR_ADR, Z.CITY, Z.ST, I.ITM_NBR, I.ITM_DSC, OI.ORD_QTY, I.ORD_ITM_PRICE 
     --INTO 
     --v_Order, v_CusNbr, v_OrderDate, v_Name, v_Address, v_Zip, v_state, v_Itm, v_Desc, v_Qty, v_Price 
FROM ITM I JOIN ORD_ITM OI ON (I.ITM_NBR = OI.ITM_NBR) 
      JOIN ORD O ON (OI.ORD_NBR = O.ORD_NBR) 
      JOIN CUS C ON (O.CUS_NBR = C.CUS_NBR) 
      JOIN ZIP Z ON (C.ZIP_ADR = Z.ZIP) 
WHERE O.ORD_NBR = 100; 
+0

p_OrderNbr NUMBER:=&ordernumber;なぜこの&サイン? –

+0

問題をデバッグするために何をしましたか?通常、少なくとも1回は実行しないでこのコードを書くのではなく、完全なクエリを取得するまで、ある列を返したクエリから始めて、それを検証したり、列を追加したり、検証したりします。逆の手順でエラーを投げるステップがわかるまで、いくつかの列を削除することができます。エラーがどこで発生しているのかを特定できますが、それを修正する方法を理解する上で問題が残っている場合は、おそらくもっと役に立ちます。 –

+0

ご参考までに、あなたの無名ブロックは実際にプロシージャを呼び出すために使用しているものであってはなりません。変数を長さなしで 'CHAR'と宣言することはできません。そうした場合は、別のエラーが発生するはずです。 –

答えて

0

選択リストは、リストに

... C.STR_ADR, Z.CITY, Z.ST, ... 

を言う

... v_Address, v_Zip, v_state ... 

言うあなたはZテーブルに間違ったフィールドを得たようです。

Z.CITYが数値の郵便番号ですか?

+0

うん...それはそれだった。それをキャッチするためにありがとう。 – Josh

+0

@Josh - yw。私はテーブルの定義を見ることなくそれを理解することにとても満足しています。 – Hogan

関連する問題