Function 选择内部功能未按预期工作

Function 选择内部功能未按预期工作,function,select,plsql,oracle-sqldeveloper,Function,Select,Plsql,Oracle Sqldeveloper,我创建了一个函数来封装select on 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.fe

我创建了一个函数来封装select on 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;

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

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

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
...

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

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

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
...

您需要为Trasiegaoux中的任何列赋予参数不同的名称,或者在其前面加上函数名,例如

WHERE t.fermentacion = fecha_ultimo_trasiego.fermentacion
或者(重命名参数后):

编辑:博奈斯特赢了我

不过,您可以稍微简化代码,因为
选择。。。从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;

您需要为Trasiegaoux中的任何列赋予参数不同的名称,或者在其前面加上函数名,例如

WHERE t.fermentacion = fecha_ultimo_trasiego.fermentacion
或者(重命名参数后):

编辑:博奈斯特赢了我

不过,您可以稍微简化代码,因为
选择。。。从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;

预期的输出是什么请显示示例表数据、函数如何调用以及预期的输出。预期的输出是什么请显示示例表数据、函数如何调用以及预期的输出。您比我快了1分钟:(*伸出手腕以便可以拍打它**{;-)谢谢!这就是问题所在。我会尽快接受答案:)你比我快了1分钟:(*伸出手腕让它被拍打**{;-)谢谢!这就是问题所在。我会尽快接受答案:)