为列插入的值太大:“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”的主要内容,如果未能解决你的问题,请参考以下文章