2016-11-24 38 views
0

我已经创建了一个函数来封装PL/SQL上的选择。选择内部函数不能按预期工作

但是我从使用函数得到的结果与我自己使用select所得到的结果不同。

CREATE OR REPLACE FUNCTION fecha_ultimo_trasiego(fermentacion IN VARCHAR2) 
RETURN DATE 
IS fecha DATE; 
BEGIN 
    SELECT (
     SELECT fecha 
     FROM (
      SELECT t.id, t.fecha 
      FROM TrasiegoAux t 
      WHERE t.fermentacion=fermentacion 
      ORDER BY t.fecha desc 
     ) 
     WHERE ROWNUM=1 
    ) INTO fecha FROM DUAL; 
    RETURN(fecha); 
END; 

我的函数声明有什么问题吗?现在无论输入什么参数,它都会返回相同的值。

预期输出是最后一个Trasiego的日期(表格的最大日期)。

这是我的结构:

CREATE TABLE Fermentacion(
    id VARCHAR2(36) 
); 

CREATE TABLE Trasiego(
    id VARCHAR2(36), 
    fecha DATE not null, 
    fermentacion VARCHAR2(36) REFERENCES Fermentacion, 
    temperatura NUMBER(8) not null, 
    litrosFinal NUMBER(8) not null, 
    PRIMARY KEY(id, fermentacion) 
); 

create or replace view TrasiegoAux as select id, fecha, fermentacion from Trasiego; 

下面是一些数据:

Insert into FERMENTACION (ID) values ('4'); 
Insert into FERMENTACION (ID) values ('9'); 

Insert into TRASIEGO (ID,FERMENTACION,TEMPERATURA,LITROSFINAL,FECHA) values ('1','4',20,190,to_date('04-OCT-16','DD-MON-RR')); 
Insert into TRASIEGO (ID,FERMENTACION,TEMPERATURA,LITROSFINAL,EMPLEADOLABORATORIO,FECHA) values ('2','4',20,180,to_date('11-OCT-16','DD-MON-RR')); 
Insert into TRASIEGO (ID,FERMENTACION,TEMPERATURA,LITROSFINAL,FECHA) values ('3','9',20,190,to_date('04-OCT-16','DD-MON-RR')); 

鉴于数据我预计这样的:

DECLARE 
fecha date; 
BEGIN 
    fecha :=fecha_ultimo_trasiego(4); 
    DBMS_OUTPUT.PUT_LINE(fecha); //'11-OCT-16' 
    fecha :=fecha_ultimo_trasiego(4); 
    DBMS_OUTPUT.PUT_LINE(fecha); //'04-OCT-16' 
END; 
+0

请告诉我预期输出 – XING

+0

请出示样品表中的数据,以及如何调用该函数和预期产出。 – OldProgrammer

回答

2

这很可能是因为您传入的参数与列的名称相同。这不是一个好主意,因为它会导致各种奇怪。

您可以修改参数名称,例如:

CREATE OR REPLACE FUNCTION fecha_ultimo_trasiego(p_fermentacion IN VARCHAR2) 
... 
    WHERE t.fermentacion = p_fermentacion 
... 

,或者你可以在查询限定参数名:

CREATE OR REPLACE FUNCTION fecha_ultimo_trasiego(fermentacion IN VARCHAR2) 
... 
    WHERE t.fermentacion = fecha_ultimo_trasiego.fermentacion 
... 
+0

你打了我1分钟:( –

+0

\ *伸出手腕,所以它可以被打\ \ \ * {;-) – Boneist

+1

谢谢!这是问题所在。我会尽快接受anwser :) – moondaisy

2

你需要给参数不同的名称,以任何TrasiegoAux中的列,或者用函数名称作为前缀,例如

WHERE t.fermentacion = fecha_ultimo_trasiego.fermentacion 

否则(后更名参数):

WHERE t.fermentacion = p_fermentacion 

编辑:Boneist打我给它。

你也许可以简化代码了一下,不过,作为select ... from dual包装似乎并不需要:

create or replace function fecha_ultimo_trasiego 
    (p_fermentacion in trasiegoaux.fermentacion%type) 
    return date 
as 
    l_fecha date; 
begin 
    select fecha into l_fecha 
    from (select t.fecha 
      from trasiegoaux t 
      where t.fermentacion = p_fermentacion 
      order by t.fecha desc) 
    where rownum = 1; 

    return l_fecha; 
end;