2016-11-24 42 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;