Java 不能';t在JDBC中创建varchar2的字符串Oracle数组
请原谅我英语不好(愚蠢的法国人!!:p) 我创建了两种类型:Java 不能';t在JDBC中创建varchar2的字符串Oracle数组,java,arrays,string,oracle,jdbc,Java,Arrays,String,Oracle,Jdbc,请原谅我英语不好(愚蠢的法国人!!:p) 我创建了两种类型: create or replace TYPE LISTE_ENQUETE AS TABLE OF VARCHAR2(500); 及 我在存储过程PS_MAJ_QUALITE2.sql中使用它们: create or replace PROCEDURE PS_MAJ_QUALITE2 ( w_LISTE IN LISTE_ENQUETE, w_PART
create or replace TYPE LISTE_ENQUETE AS TABLE OF VARCHAR2(500);
及
我在存储过程PS_MAJ_QUALITE2.sql中使用它们:
create or replace PROCEDURE PS_MAJ_QUALITE2 (
w_LISTE IN LISTE_ENQUETE,
w_PART IN VARCHAR2,
w_TYPE IN VARCHAR2,
w_ID_ENQ IN VARCHAR2,
w_CATEGORIE IN VARCHAR2,
w_LISTE_IDE IN LISTE_IDE_ENQUETE
)
IS.......
我的Java代码是:
private void appelerPS_MAJ_QUALITE2(String partieEnquete, Connection c, String[]tabEntete, String type, String categorie, String ideEnquete, String[]tabIde) throws TechnicalException {
String sReq = "{call ps_MAJ_QUALITE2(?,?,?,?,?,?)}";
CallableStatement cstmt = null;
try {
java.sql.Array sqlArray = null;
ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor("LISTE_ENQUETE", c);
sqlArray = new oracle.sql.ARRAY(arrayDescriptor, c, tabEntete);
java.sql.Array sqlArrayIde = null;
ArrayDescriptor arrayDescriptor2 = ArrayDescriptor.createDescriptor("LISTE_IDE_ENQUETE", c);
sqlArrayIde = new oracle.sql.ARRAY(arrayDescriptor2, c, tabIde);
// Préparation de l'appel à la procédure stockée
cstmt = c.prepareCall(sReq);
cstmt.clearParameters();
// alimentation du code traitement :
cstmt.setArray(1, sqlArray);
cstmt.setString(2, partieEnquete);
cstmt.setString(3, type);
cstmt.setString(4, ideEnquete);
cstmt.setString(5, categorie);
cstmt.setArray(6, sqlArrayIde);
cstmt.execute();
} catch (SQLException e) {...}
.......
}
我的String[]tabente和String[]tabIde选项卡具有良好的信息,但当我查看sqlArray和sqlArrayIde内容时,我有:[“?”、“?”、“?”、“?”]
当我尝试插入sqlArray的数据或sqlArrayIde的数据时,出现了错误:
Error executing the stored procedure PS_MAJ_QUALITE, exception message : ORA-01400: cannot insert NULL into ("WFGA_PM_ASS1"."REPONSE_FORMULAIRE_QUALITE"."IDE_REPONSE")
你能帮我解决这个问题吗。
非常感谢你的帮助
Yohann(回答Yohann自己的解决方案,因为它也帮助了我)
在新类型中使用NVARCHAR2而不是VARCHAR2。正如OP所确认的,问题是使用NVARCHAR2而不是VARCHAR2。看起来不错。您如何查看sqlArray内容-什么代码显示
?
值?我以前见过,但不记得在哪里,除非它与角色集有关。我不确定这是否真的是个问题。。。那么,执行插入的代码是什么呢?例如,您确定不只是查看过程体中数组的末尾吗?您的实际插入语句在哪里?我正在使用Eclipse调试查看sqlArray内容。在我的存储过程中,我插入了:FOR I In w_LISTE.FIRST..w_LISTE.LAST循环Begin insert INTO REPONSE_FORMULAIRE_QUALITE(IDE_REPONSE,TY_REPONSE,LIB_REPONSE)值(w_LISTE_IDE(I),w_TYPE,w_LISTE(I));索引上的重复值然后更新响应公式集LIB\U REPONSE=w\U LISTE(I)时出现异常,其中IDE\U REPONSE=w\U LISTE\U IDE(I)和TY\U REPONSE=w\U TYPE;结束;端环;如果结束;解决了的!!我的新类型使用NVARCHAR2而不是VARCHAR2
Error executing the stored procedure PS_MAJ_QUALITE, exception message : ORA-01400: cannot insert NULL into ("WFGA_PM_ASS1"."REPONSE_FORMULAIRE_QUALITE"."IDE_REPONSE")