为列插入的值太大:“oracle.sql.STRUCT@c85ad79”

Posted

技术标签:

【中文标题】为列插入的值太大:“oracle.sql.STRUCT@c85ad79”【英文标题】:Inserted value too large for column: "oracle.sql.STRUCT@c85ad79" 【发布时间】:2017-11-21 14:43:16 【问题描述】:

JSON 请求:


"telephoneAddress" : 
    "phoneType" : "RESADD",
    "countryCode" : "87654321",
    "areaCode" : "0111",
    "telephoneNumber" : "8097739267",
    "extensionNum" : "9111",
    "formatCode" : "as",
    "unlistTelephoneNumInd" : "y"

 

从java代码调用过程:

 rspParmMap = this.applicationsProcPut.withProcedureName("MS_PUT_CTC_DETAILS")
            .declareParameters(new SqlParameter("V_MS_CTC_DTL_OBJ",
                oracle.jdbc.OracleTypes.STRUCT)).execute(reqParamMap);

谁能告诉我为什么会出现此错误以及oracle.jdbc.OracleTypes.STRUCT 的用途是什么?

如果您想了解有关此错误的更多信息,请告诉我。

从上到下插入的 JSON 数据序列中的列大小:

VARCHAR2(6 BYTE)
VARCHAR2(8 BYTE)
VARCHAR2(8 BYTE)
VARCHAR2(20 BYTE)
VARCHAR2(20 BYTE)
VARCHAR2(8 BYTE)
VARCHAR2(1 BYTE)

java中的Sqlobj

    private long appReferNum;

    private int ipIdNum;
    private String seqNo;
    private String postalTableInd;
    private String emailTableInd;
    private String teleTableInd;
    private TelephoneAddObj telephoneAddObj;
    private PostalAddObj postalAddObj;
    private EmailAddObj emailAddObj;

        //get,set
    @Override
        public String getSQLTypeName() throws SQLException 
            return "MS_CTC_DTL_OBJ"; // sqltype name in oracle
        

sql类型

create or replace 
            TYPE "MS_CTC_DTL_OBJ" 
                AS 
        OBJECT(
    v_app_refer_num      NUMBER,
    v_ip_id_num          NUMBER,
    v_seqNo             VARCHAR2(4 CHAR),
    v_postalTableInd    VARCHAR2(4 CHAR),
    v_emailTableInd     VARCHAR2(4 CHAR),
    v_teleTableInd     VARCHAR2(4 CHAR),

    v_TELE_ADD_DEL IP_TELE_ADDR_OBJ,
    v_POST_ADD_DEL IP_POSTAL_ADD_OBJ,
    v_EMAIL_ADD_DEL IP_EMAIL_ADD_OBJ );

程序

create or replace 
PROCEDURE 
MS_PUT_CTC_DETAILS(
  V_MS_CTC_DTL_OBJ IN MS_CTC_DTL_OBJ,
  v_status OUT varchar2
  --,v_postal_status OUT varchar2
 -- ,v_email_status OUT varchar2
) AS .

。 . . .只是更新的东西

【问题讨论】:

你检查你的列长度了吗?看起来您插入的值大于列可以处理的值。 我们看不到你的过程定义来了解它的正式参数是如何声明的——大概它需要一个对象类型,因此是结构——但更重要的是看不到过程在做什么,这它正在修改的表,这些列的数据类型,或者它试图放入其中的数据。 JSON 和它有什么关系? @SantanuSahoo 我期待这个问题我已经检查过列长度超过我插入的长度 @kiranrathod 如果您确定会提出问题,最好在发布的问题中说明。 所以...我们是否假设您正在将该 JSON 解析为一个 Java 对象 - 而您没有向我们展示该对象或解析代码 - 然后传递该 Java 对象(作为struct) 到期望具有这些字段大小的 Oracle 对象的过程?我不确定你认为我们能用这么少的信息做什么。 【参考方案1】:

结构和数组是高级数据类型,来自spring doc。

用于存储过程的 Oracle 数据库和 PL/SQL 语言 在 Oracle 中内置了对一些高级数据类型的支持。这些 使用标准 JDBC API 无法轻松访问数据类型,因此它是 必须依赖 Oracle 的 JDBC 扩展,如 ARRAY 和 STRUCT 以及用于访问它们的 API。

请检查您的STRUCT/表格列长度。还要注意任何长度可能超过 1 的特殊字符。

【讨论】:

【参考方案2】:

我找到了上述问题的答案:

在您覆盖 writeSQL() 方法的 sql 类型 java 对象中:

  @Override
public void writeSQL(final SQLOutput stream) throws SQLException 
                stream.writeLong(this.appReferNum);
                stream.writeInt(this.ipIdNum);
                stream.writeString(this.seqNo);
                stream.writeString(this.postalTableInd);
                stream.writeString(this.emailTableInd);
                stream.writeString(this.teleTableInd);
                stream.writeObject(this.getTelephoneAddObj());
                stream.writeObject(this.getPostalAddObj());
                stream.writeObject(this.getEmailAddObj());

            

您需要遵循与您的sqltype相同的顺序,并且不要跳过sql java对象的writeSQL()方法中的任何属性

create or replace 
            TYPE "MS_CTC_DTL_OBJ" 
                AS 
        OBJECT(
    v_app_refer_num      NUMBER,
    v_ip_id_num          NUMBER,
    v_seqNo             VARCHAR2(4 CHAR),
    v_postalTableInd    VARCHAR2(4 CHAR),
    v_emailTableInd     VARCHAR2(4 CHAR),
    v_teleTableInd     VARCHAR2(4 CHAR),

    v_TELE_ADD_DEL IP_TELE_ADDR_OBJ,
    v_POST_ADD_DEL IP_POSTAL_ADD_OBJ,
    v_EMAIL_ADD_DEL IP_EMAIL_ADD_OBJ );

【讨论】:

以上是关于为列插入的值太大:“oracle.sql.STRUCT@c85ad79”的主要内容,如果未能解决你的问题,请参考以下文章

double的值太大的时候

对于 Int32 而言,值太大或太小 [重复]

基础值太大(错误标记为“08”)bash

查看 getHeight() 和 getWidth() 返回值太大

对于未存储的字段,值太大

ZTree id值太大,ZTree没有生成树,ZTree的id值过大