oracle - PL/SQL 编译错误 - PLS-00382 : expression is of wrong type

标签 oracle types plsql varchar varchar2

我正在运行以下 PL/SQL...

DECLARE
BEGIN 
FOR i IN (select VALUE from REWARDS)
LOOP 
insert into BT_CMS.T_REWARDS_TYPES 
(ID, REWARD_LABEL, REWARD_VALUE, REWARD_METHOD, UPDATE_USER, UPDATE_DATE, PAYMENT_PROVIDER_ID, CREATE_DATE, COUNTRY_CODE_ID) 
values 
(BT_CMS.SEQ_REWARD_TYPE_ID.nextval, 'R' || i || ' Real Time', i, 'Airtime', 'DEVOPS-826', sysdate, 120, sysdate, 206); 
END LOOP; 
END;

...并出现以下错误...

ORA-06550: line 8, column 72:
PLS-00382: expression is of wrong type
ORA-06550: line 8, column 52:
PLS-00382: expression is of wrong type
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.

我相当确定问题在于将 i 替换为值,但我不知道到底是什么问题。 REWARDS 表中 i 被选择的 VALUE 列的 data_type = VARCHAR2(20 BYTE)。我尝试将其插入的 REWARD_LABEL 列的 data_type = VARCHAR2(50 CHAR)。

最佳答案

在循环内,i 指的是整个记录,而不是记录的(唯一)字段;您需要使用 i.value 而不是 i:

DECLARE
BEGIN
    FOR i IN (SELECT VALUE FROM REWARDS)
    LOOP
        INSERT INTO BT_CMS.T_REWARDS_TYPES(
                                           ID,
                                           REWARD_LABEL,
                                           REWARD_VALUE,
                                           REWARD_METHOD,
                                           UPDATE_USER,
                                           UPDATE_DATE,
                                           PAYMENT_PROVIDER_ID,
                                           CREATE_DATE,
                                           COUNTRY_CODE_ID
                                          )
             VALUES (
                     BT_CMS.SEQ_REWARD_TYPE_ID.NEXTVAL,
                     'R' || i.VALUE || ' Real Time',
                     i.VALUE,
                     'Airtime',
                     'DEVOPS-826',
                     SYSDATE,
                     120,
                     SYSDATE,
                     206
                    );
    END LOOP;
END;

更好的方法是使用单个插入选择而不是循环游标;例如:

INSERT INTO BT_CMS.T_REWARDS_TYPES(
                                   ID,
                                   REWARD_LABEL,
                                   REWARD_VALUE,
                                   REWARD_METHOD,
                                   UPDATE_USER,
                                   UPDATE_DATE,
                                   PAYMENT_PROVIDER_ID,
                                   CREATE_DATE,
                                   COUNTRY_CODE_ID
                                  )
    SELECT BT_CMS.SEQ_REWARD_TYPE_ID.NEXTVAL,
           'R' || r.VALUE || ' Real Time',
           r.VALUE,
           'Airtime',
           'DEVOPS-826',
           SYSDATE,
           120,
           SYSDATE,
           206
      FROM REWARDS r

关于oracle - PL/SQL 编译错误 - PLS-00382 : expression is of wrong type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39533234/

相关文章:

types - 在类型别名上调用静态方法

oracle - 我是 PL/SQL 的新手。有人可以帮助我了解这个 PL/SQL 过程吗?

mysql - Oracle 与 MySQL 的对比

mysql - 将现有值插入新列

SQL 查询比较两个 varray()

database - 自动创建数据库表的脚本

sql - 获取去年同一周的同一天

database - 如何将 JBoss 7.1.1 Final 连接到 Oracle 数据库?

haskell - GHC 7.8 中类型级别自然的行为

PHP 类型转换