Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不能';t在JDBC中创建varchar2的字符串Oracle数组_Java_Arrays_String_Oracle_Jdbc - Fatal编程技术网

Java 不能';t在JDBC中创建varchar2的字符串Oracle数组

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

请原谅我英语不好(愚蠢的法国人!!: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 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")