2017-09-07 10 views
0

書籍のリストとその名前とコストを含む特定のテーブルがあります。最低のコストで本の名前を見つけて印刷する関数を書いてみたいと思います。 私は関数を書いて呼び出しましたが、関数のコンパイルとPl/SQLプロシージャが正常に完了してもエラーは発生していないようです。しかし、実際の出力は表示されません。 は、ここに私のコードです:Pl/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

可能な複製をhttps://stackoverflow.com/questions/10434474/dbms-output -put-line-not-printing) – user2672165

+2

'set serveroutput on size unlimited'誰でもget_lineを呼び出さなければなりません。 – 0xdb

+0

'SELECT min_cost FROM dual;'を実行するとどうなりますか? – krokodilko

答えて

1

あなたは、おそらく使用する必要があります。

SET SERVEROUTPUT ON; 

を使用しているものは何でもIDEであなたのコンソールに出力するDBMS_OUTPUTを有効にするには。

また、いくつかの書籍に同じ最小コストがあると、SQL文が多すぎる行を返すため、関数は例外をスローします。同様に書籍がない場合も同様です。あなたはおそらく何かしたい:[DBMS \ _OUTPUT.PUT \ _lineない印刷](の

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'を使っても最初のバージョンでそれが必要ですが、2番目のバージョンから削除できます。 – MT0

+0

...いいえ、私はちょうどチェックしました:-)私はSCOTT.EMPから給与を選択する関数を作り直しました - 同様の関数で、DEPTNO = 50(これは存在しませんEMP)。それは期待通りに機能します。内部クエリは行を返さないので、外部クエリも行を返さないため、結果は変数に 'null'が割り当てられます。 – mathguy

関連する問題