【问题标题】:ORACLE: ORA-06550 Error at "Select into"ORACLE:“选择进入”时出现 ORA-06550 错误
【发布时间】:2014-06-25 14:31:08
【问题描述】:

执行以下 SQL 时,SELECT INTO 行出现 ORA-06550 错误:

DECLARE 
  new_type INTEGER;
  cur_idCardProfileId DECIMAL;

  CURSOR IDCardProfileCursor
   IS
    SELECT idcardprofileid FROM idcard;    
BEGIN
  FOR cur_idCardProfileId IN IDCardProfileCursor
  LOOP
    SELECT cardtype INTO new_type FROM idcardprofile WHERE idcardprofileid = cur_idCardProfileId;
  END LOOP;        
END;

idcardprofileid (table 'idcard') 和 idcardprofileid (table 'idcardprofile') 都是 DECIMAL 类型。

我不知道了...提前谢谢你。

【问题讨论】:

  • ORA-06550 通常不会单独告诉您太多信息。显示整个异常堆栈更有用,在这种情况下将包括PLS-00382: expression is of wrong type,这更有帮助。您似乎已经看到并意识到这很重要,因为您提到了 DECIMAL 类型,但是向我们展示也很好 *8-)

标签: oracle ora-06550


【解决方案1】:

您错误地引用了光标行。您的光标行被命名为cur_idCardProfileId,它优先于您使用相同名称声明的DECIMAL 值;这里根本不用。

当您从游标中引用值时,您需要使用列名和行变量名。使用较短的名称 cur 和表别名以避免歧义,您可以这样做:

DECLARE 
  new_type INTEGER;

  CURSOR IDCardProfileCursor
   IS
    SELECT idcardprofileid FROM idcard;    
BEGIN
  FOR cur IN IDCardProfileCursor
  LOOP
    SELECT cardtype INTO new_type
    FROM idcardprofile i
    WHERE i.idcardprofileid = cur.idcardprofileid;
  END LOOP;        
END;
/

当然,您通常不会在这样的循环内进行选择,您可以让光标连接两个表,因为这样更有效。

【讨论】:

    【解决方案2】:

    ORA-06550,是在语法不正确的情况下发生的编译错误,通常在消息中会提到行号和错误原因。

    回答你的问题:

    您的匿名块中有几个语法错误:

    a.) 您不需要声明 cur_idCardProfileId b.) 当您引用游标集返回的列时,您需要使用<loop_variable>.column_name 表示法,因此Select Into 应该具有cur_idCardProfileId.idcardprofileid

    已经对你的区块进行了修改,修改后的区块如下:

         DECLARE 
          new_type INTEGER;
        --  cur_idCardProfileId DECIMAL;
    
         CURSOR IDCardProfileCursor
         IS
         SELECT idcardprofileid FROM idcard;    
          BEGIN
            FOR cur_idCardProfileId IN IDCardProfileCursor
            LOOP
              SELECT cardtype 
              INTO new_type 
              FROM idcardprofile 
              WHERE idcardprofileid = cur_idCardProfileId.idcardprofileid; --Replaced   cur_idCardProfileId with cur_idCardProfileId.idcardprofileid
        END LOOP;        
        END;
    

    希望对你有帮助

    维沙德

    【讨论】:

    • 您能否解释一下这有何不同为什么它回答了这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多