2016-08-16 110 views
0

我有一個'person'表有兩個字段'person_name'和'person_age'。PL/SQL:PLS-00382:表達式類型錯誤。聲明被忽略

我想編寫返回SYS_REFCURSOR但計算額外字段「is_old」的過程。例如:

PROCEDURE people_load(p_name IN VARCHAR2, P_RESULT OUT SYS_REFCURSOR) IS 
    BEGIN 
     DECLARE 
     isOld BOOLEAN := false; 
     CURSOR cursorTemp IS SELECT person_name, person_age, is_old 
          WHERE person_name = p_name; 
     BEGIN 
      FOR _p IN cursorTemp 
      LOOP 
      IF _p.person_age > 75 THEN   
       _p.is_old:=TRUE; 
      END IF; 
      END LOOP;   
      ¿¿P_RESULT:=cursorTemp; //open P_RESULT for (open cursorTemp);?? 
     END; 
    END people_load; 

我不知道如何分配時間遊標'cursorTemp'OUT參數'P_RESULT'返回結果。

回答

2
  1. 不能在SQL中使用BOOLEAN,只能在PL/SQL中使用。
  2. 您無法循環遊標並重新計算列。
  3. 您聲明瞭一個變量isOld並從不使用它。

我建議你計算光標內is_old。我改變它包含1(真)或0(假)。

PROCEDURE people_load(p_name IN VARCHAR2, P_RESULT OUT SYS_REFCURSOR) IS 
    BEGIN 
     DECLARE 
     CURSOR cursorTemp IS SELECT person_name, person_age, case when person_age > 75 then 1 else 0 end is_old 
          WHERE person_name = p_name; 
     BEGIN 
      P_RESULT := cursorTemp; //open P_RESULT for (open cursorTemp); 
     END; 
    END people_load; 
+0

我浪費了7個小時的生活在這個...如果我知道你住的地方去你家清潔你的鞋子。 – ajcarracedo

+0

如果您通過樣本投入7小時學習Oracle,這將會是更好的學習體驗。你還有更多的時間學習。好運:-) – Aishu

+0

非常感謝您的建議;) – ajcarracedo

0

您應該在select中進行計算。

CURSOR cursorTemp IS 
    SELECT 
     person_name, 
     person_age, 
     CASE WHEN person_age>75 THEN 1 ELSE 0 END AS is_old 
    WHERE person_name = p_name;