Ste*_*lsh 3 oracle varchar types plsql 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;
Run Code Online (Sandbox Code Playgroud)
......并在下面得到错误......
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.
Run Code Online (Sandbox Code Playgroud)
我很确定问题是我被替换为值,但我不知道究竟是什么问题.正在选择i的REWARDS表中的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;
Run Code Online (Sandbox Code Playgroud)
更好的方法可能是使用单个insert-select而不是循环遍历游标; 例如:
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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2685 次 |
最近记录: |