繁体   English   中英

"Oracle sql 无法插入长度超过 200 个字符的字符串“错误:ORA-06502:PL\/SQL:数字或值错误”"

[英]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: E​​rror 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参数并且您没有logEntryIdnoteOUT参数时,您还可以将entryDate作为OUT参数传递(尽管我不确定为什么需要note ,因为它应该是您输入的值)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM