PL/SQL:PLS-00382:表达式类型错误。语句被忽略

Posted

技术标签:

【中文标题】PL/SQL:PLS-00382:表达式类型错误。语句被忽略【英文标题】:PL/SQL: PLS-00382: expression is of wrong type. Statement ignored 【发布时间】:2016-08-16 15:45:07 【问题描述】:

我有一个包含两个字段“person_name”和“person_age”的“person”表。

我想编写一个返回 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”以返回结果。

【问题讨论】:

【参考方案1】:
    您不能在 SQL 中使用 BOOLEAN,只能在 PL/SQL 中使用。 不能循环游标并重新计算列。 您声明了一个变量 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;

【讨论】:

我在这件事上浪费了我生命中的 7 个小时……如果我知道你住在哪里,去你家擦鞋吧。 如果您花 7 个小时通过示例学习 Oracle,那将是更好的学习体验。你还有更多的时间学习。祝你好运:-) 非常感谢您的建议 ;)【参考方案2】:

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

 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;

【讨论】:

以上是关于PL/SQL:PLS-00382:表达式类型错误。语句被忽略的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06550:第 1 行,第 13 列:PLS-00382:表达式类型错误 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略

将值插入记录类型表

PLS-00382:表达式类型错误

PLS-00382:表达式的类型错误触发器

PLS-00382:表达式类型错误,无法显示 DBMS_OUTPUT.PUT_LINE

plsql 中的条件字符串,如 sprintf