2017-08-08 27 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; 
/
相關問題