2017-09-07 16 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

相关问题