PL / SQL:PLS-00382:表达式类型错误。声明被忽略了

时间:2016-08-16 15:45:07

标签: oracle plsql cursor

我有一个'带有两个字段的表' person_name'和' person_age'。

我想编写一个返回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 param' P_RESULT'返回结果。

2 个答案:

答案 0 :(得分:2)

  1. 您不能在SQL中使用BOOLEAN,只能在PL / SQL中使用。
  2. 您无法遍历游标并重新计算列。
  3. 您声明变量isOld并且从不使用它。
  4. 我建议你计算光标内的is_old。我将其更改为包含1(true)或0(false)。

      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;
    

答案 1 :(得分:0)

您应该在选择中进行计算。

 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;