2017-09-07 26 views
0

我有一個特定的表格,其中包含書籍列表及其名稱和成本。我想寫一個函數,以最低的成本找到並打印書名。 我寫了一個函數並調用它,並且我似乎沒有收到任何錯誤(函數編譯和Pl/SQL過程已成功完成)。但是我沒有看到任何實際的輸出。 這裏是我的代碼:用於在表格中查找最小成本項目的PI/SQL函數

CREATE OR REPLACE FUNCTION min_cost 
RETURN VARCHAR2 IS 
    minCostOfBooks VARCHAR2(50); 
BEGIN 
SELECT NAME 
INTO minCostOfBooks 
FROM BOOKS 
WHERE cost = (SELECT MIN(cost) FROM BOOKS); 

RETURN minCostOfBooks; 
END; 

我這樣稱呼它:

DECLARE 

d VARCHAR2(50); 

BEGIN 

d := min_cost(); 
dbms_output.put_line('Book(s) with lowest cost ' || d); 

END; 

很難知道問題是什麼,因爲我不似乎會看到任何錯誤。

+0

[DBMS \ _OUTPUT.PUT \ _line不打印](可能的重複https://stackoverflow.com/questions/10434474/dbms-output -put-line-not-printing) – user2672165

+2

'set serveroutput on size unlimited' while anyone must call get_line。 – 0xdb

+0

當你運行'SELECT min_cost FROM dual;'會發生什麼? – krokodilko

回答

1

您可能需要使用:

SET SERVEROUTPUT ON; 

爲了使DBMS_OUTPUT輸出到任何IDE你正在使用您的控制檯。

此外,你的函數有一個問題,如果幾本書有相同的最低成本,那麼函數將拋出一個異常,因爲SQL語句將返回太多的行;同樣如果沒有書。你可能想是這樣的:

CREATE OR REPLACE FUNCTION min_cost 
RETURN VARCHAR2 IS 
    minCostOfBooks VARCHAR2(50); 
BEGIN 
    SELECT NAME 
    INTO minCostOfBooks 
    FROM (
    SELECT NAME 
    FROM BOOKS 
    ORDER BY cost ASC 
) 
    WHERE ROWNUM = 1; 

    RETURN minCostOfBooks; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    RETURN NULL; 
END; 

CREATE OR REPLACE FUNCTION min_cost 
RETURN VARCHAR2 IS 
    minCostOfBooks VARCHAR2(50); 
BEGIN 
    SELECT MIN(NAME) KEEP (DENSE_RANK FIRST ORDER BY cost ASC) 
    INTO minCostOfBooks 
    FROM BOOKS; 

    RETURN minCostOfBooks; 
END; 
+1

您不需要在異常塊中處理「找不到數據」;如果沒有找到數據,默認情況下'minCostOfBooks'將是'null'。 – mathguy

+0

您仍然需要使用'ROWNUM'的第一個版本,但是,可以從第二個版本中刪除它。 – MT0

+0

...不,你只是檢查:-)我重新創建了從SCOTT.EMP中選擇工資的函數 - 一個類似的函數,我操縱它選擇DEPTNO = 50(它不存在於EMP)。它仍然按預期工作:內部查詢不返回任何行,因此外部查詢也不返回任何行,因此結果是分配給該變量的'null'。 – mathguy

相關問題