2017-08-08 52 views
0

我正在尝试编写一个PL/SQL脚本,它将从我的saleinv表中收集与用户输入的序列号相匹配的信息。目前,我的代码正在返回错误错误消息是ORA-01422:精确提取返回的行数多于请求的行数。如果有人能向我解释如何解决这个问题,那将非常感激。我的代码如下。PL/SQL错误 - 确切获取返回的行数多于请求的行数

ACCEPT p_saleinv PROMPT 'Enter sales invoice number: ' 
    VARIABLE g_output VARCHAR2(4000) 

    DECLARE 

v_ABC NUMBER(4); 
v_DEF EXCEPTION; 
v_freightcost car.freightcost%TYPE; 
v_totalcost car.totalcost%TYPE; 

CURSOR saleinvoicelist IS 
SELECT * 
FROM saleinv 
WHERE saleinv = '&p_saleinv'; 

BEGIN 

SELECT COUNT(*) 
INTO v_ABC 
FROM saleinv 
WHERE saleinv = '&p_saleinv'; 

SELECT freightcost,totalcost 
INTO v_freightcost,v_totalcost 
FROM car c, saleinv si 
WHERE c.serial = si.serial 
AND c.cname = si.cname; 


IF v_ABC = '0' THEN 

    RAISE v_DEF; 

ELSE 

    FOR v_saleinv IN saleinvoicelist LOOP 
     :g_output := :g_output||TRIM(v_saleinv.saleinv)||' '; 
     :g_output := :g_output||TRIM(v_saleinv.cname)||' '; 
     :g_output := :g_output||TRIM(v_saleinv.saledate)||' '; 
     :g_output := :g_output||TRIM(v_saleinv.serial)||' '; 
     :g_output := :g_output||TO_CHAR(v_freightcost,'122345.69')||CHR(10); 
     :g_output := :g_output||TO_CHAR(v_saleinv.tax,'12345.99')||' '; 
     :g_output := :g_output||TO_CHAR(v_saleinv.licfee,'123.76')||' '; 
     :g_output := :g_output||TO_CHAR(v_saleinv.commission,'1234.59')||' '; 
     :g_output := :g_output||TO_CHAR(v_totalcost,'123489.97')||CHR(10); 
     :g_output := :g_output||TO_CHAR(v_saleinv.totalprice,'12345.45')||' '; 

    END LOOP; 

END IF; 

EXCEPTION 

WHEN v_DEF THEN 

    ROLLBACK WORK; 

    :g_output := 'Such data does not exist.'; 

    WHEN OTHERS THEN 

    ROLLBACK WORK; 

    -- check error message 
    :g_output := 'Error'||CHR(10); 
    :g_output := :g_output||'Error code is '||SQLCODE||CHR(10); 
    :g_output := :g_output||'Error message is '||SQLERRM; 

    END; 
/
    PRINT g_output 
+0

你需要一个'GROUP BY' someField还有,你有'COUNT(*)' – Ofisora

+0

@Ofisora - 只有在查询的预测包括一些非聚集列。这不是这种情况,所以不需要GROUP BY。 – APC

回答

0

此错误的最可能的原因是下面的选择

SELECT freightcost,totalcost 
INTO v_freightcost,v_totalcost 
FROM car c, saleinv si 
WHERE c.serial = si.serial 
AND c.cname = si.cname; 

,因为你是选择到变量选择只能返回一行。我假设你正在使用的序列号会从这个选择中返回多行。你需要确保它返回一个唯一的行。

0

下面的SELECT INTO语句只需要单数变量中的单数输出。你需要处理异常或修改代码,如果你期望更多的输出,然后使用FOR LOOP。 希望下面的代码有助于。

ACCEPT p_saleinv PROMPT 'Enter sales invoice number: ' 
VARIABLE g_output VARCHAR2(4000) 
DECLARE 
    v_ABC NUMBER(4); 
    v_DEF EXCEPTION; 
    v_freightcost car.freightcost%TYPE; 
    v_totalcost car.totalcost%TYPE; 
    CURSOR saleinvoicelist 
    IS 
    SELECT * FROM saleinv WHERE saleinv = '&p_saleinv'; 
BEGIN 
    SELECT COUNT(*) INTO v_ABC FROM saleinv WHERE saleinv = '&p_saleinv'; 


    BEGIN 
    SELECT freightcost, 
    totalcost 
    INTO v_freightcost, 
    v_totalcost 
    FROM car c, 
    saleinv si 
    WHERE c.serial = si.serial 
    AND c.cname = si.cname; 
    EXCEPTION 
    WHEN TOO_MANY_ROWS THEN 
    dbms_output.put_line('Too many rows fetched'); 
    RETURN; 
    WHEN NO_DATA_FOUND THEN 
    dbms_output.put_line('No rows fetched'); 
    RETURN; 
    IF v_ABC  = '0' THEN 
    RAISE v_DEF; 
    ELSE 
    FOR v_saleinv IN saleinvoicelist 
    LOOP 
     :g_output := :g_output||TRIM(v_saleinv.saleinv)||' '; 
     :g_output := :g_output||TRIM(v_saleinv.cname)||' '; 
     :g_output := :g_output||TRIM(v_saleinv.saledate)||' '; 
     :g_output := :g_output||TRIM(v_saleinv.serial)||' '; 
     :g_output := :g_output||TO_CHAR(v_freightcost,'122345.69')||CHR(10); 
     :g_output := :g_output||TO_CHAR(v_saleinv.tax,'12345.99')||' '; 
     :g_output := :g_output||TO_CHAR(v_saleinv.licfee,'123.76')||' '; 
     :g_output := :g_output||TO_CHAR(v_saleinv.commission,'1234.59')||' '; 
     :g_output := :g_output||TO_CHAR(v_totalcost,'123489.97')||CHR(10); 
     :g_output := :g_output||TO_CHAR(v_saleinv.totalprice,'12345.45')||' '; 
    END LOOP; 
    END IF; 
EXCEPTION 
WHEN v_DEF THEN 
    ROLLBACK WORK; 
    :g_output := 'Such data does not exist.'; 
WHEN OTHERS THEN 
    ROLLBACK WORK; 
    -- check error message 
    :g_output := 'Error'||CHR(10); 
    :g_output := :g_output||'Error code is '||SQLCODE||CHR(10); 
    :g_output := :g_output||'Error message is '||SQLERRM; 
END; 
/
相关问题