【问题标题】:PL/SQL Numeric or value error: character to number conversion errorPL/SQL 数字或值错误:字符到数字的转换错误
【发布时间】:2023-03-21 19:18:02
【问题描述】:

程序代码:

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 错误:数字或值错误:字符转数字 转换错误。

我相信我所有的参数都是有序的,所以我不会得到冲突的变量分配。

我单独运行了这个查询以确保我得到正确的输出并且它工作正常。

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;

【问题讨论】:

  • p_OrderNbr NUMBER := &ordernumber;为什么这个 & 签名?
  • 你做了什么来调试问题?通常,如果不至少运行一次,我不会写这么多代码,我会从返回一列的查询开始,验证它,添加其他列,验证它等等,直到我有完整的查询。您可以反向并删除一些列,直到您确定哪个步骤引发了错误。如果您可以查明错误发生的位置,但仍然无法理解如何修复它,我们可能会更有帮助。
  • 仅供参考,您的匿名块不能是您实际用于调用您的过程的块。您不能将变量声明为没有长度的CHAR。如果你这样做了,你应该得到一个不同的错误。
  • 与号用于接收订单号的输入。有错吗?
  • 贾斯汀,你说的匿名块是什么意思?我也有 p_NameOutput、p_AddressOutput、p_CityOutput 和 p_DescOutput 作为 VARCHAR2,我收到错误说我违反了字符串长度 (1.. 32000)。

标签: sql oracle plsql


【解决方案1】:

选择列表说

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

进入列表说

 ... v_Address, v_Zip, v_state ...

您似乎在 Z 表中输入了错误的字段。

除非 Z.CITY 是数字邮政编码?

【讨论】:

  • 是的……就是这样。感谢您了解这一点。
  • @Josh -- 是的。我对自己在没有看到表定义的情况下弄清楚它感到非常满意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多