
[英]Substr with more than 4000 characters gets ORA-06502: PL/SQL: numeric or value error
[英]Oracle sql cannot insert string with length more than 200 characters "Error: ORA-06502: PL/SQL: numeric or value error"
我正在尝试在 Oracle sql 中插入数据类型为 VARCHAR2(4000 字节)的列。 我使用节点 js 作为 lambda 函数编写了一个 API,但是当我插入一个超过 200 个字符的字符串时,我收到错误“错误:ORA-06502: PL\/SQL: numeric or value error: DML Returning: Error writing to host多变的”。 但是当我尝试通过 Oracle sql developer windows 直接插入时,我可以插入长度不超过 4000 个字符的字符串。
这是我的查询:
const sql = `BEGIN INSERT INTO job_log(
job_log_entry_id,
job_id,
entry_text,
entry_date)VALUES (
job_log_entry_seq.nextval,
:jobID,
:entryText,
TO_DATE('${params.entryDate}', 'DD/MM/YY')
)
RETURNING job_log_entry_id, entry_text
INTO :logEntryId, :note;
COMMIT; END;`
const opt = {
jobId:{val:params.jobId,dir: oracledb.BIND_IN,type: oracledb.STRING},
entryText:{val: params.entryText,dir: oracledb.BIND_IN,type: oracledb.STRING},
entryDate:{dir: oracledb.BIND_OUT,type: oracledb.DATE}
};
try {
result = await conn.execute(sql, opt);
} catch (error) {
sqlError = true
}
您将参数作为DATE
数据类型传递。 但是,PL/SQL 块将其传递给TO_DATE
函数,并且该函数需要字符串参数,因此将从DATE
传递到字符串的隐式转换,以便随后可以将其转换回DATE
。 删除TO_DATE
函数并只传递一个DATE
:
const sql = `BEGIN
INSERT INTO job_log(
job_log_entry_id,
job_id,
entry_text,
entry_date
)VALUES (
job_log_entry_seq.nextval,
:jobID,
:entryText,
:entryDate
)
RETURNING job_log_entry_id, entry_text INTO :logEntryId, :note;
COMMIT;
END;`
当 entryDate 应该是IN
参数并且您没有logEntryId
或note
的OUT
参数时,您还可以将entryDate
作为OUT
参数传递(尽管我不确定为什么需要note
,因为它应该是您输入的值)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.