【问题标题】:Couldn't create String Oracle ARRAY of varchar2 in JDBC无法在 JDBC 中创建 varchar2 的字符串 Oracle ARRAY
【发布时间】:2014-12-30 16:20:40
【问题描述】:

对不起,我的英语不好(愚蠢的法国人!!:p)

我创建了 2 种类型:

create or replace TYPE LISTE_ENQUETE AS TABLE OF VARCHAR2(500);    

create or replace TYPE LISTE_IDE_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[] tabEntete 和 String[]tabIde 选项卡有很好的信息,但是当我查看 sqlArray 和 sqlArrayIde 内容时,我有:["???", "???", "???" ].

当我尝试插入 sqlArray 的数据或 sqlArrayIde'data 时出现错误:

Error executing the stored procedure PS_MAJ_QUALITE, exception message :  ORA-01400: cannot insert NULL into ("WFGA_PM_ASS1"."REPONSE_FORMULAIRE_QUALITE"."IDE_REPONSE")

你能帮我解决这个问题吗? 非常感谢您的帮助。

约翰

【问题讨论】:

  • 看起来不错。您如何查看 sqlArray 内容 - 什么代码显示 ??? 值?我以前见过,但不记得在哪里,除非它与字符集有关。我不确定这实际上是一个问题......那么执行插入的代码是什么 - 例如,您确定您不只是查看过程主体中数组的末尾吗?
  • 您的实际插入语句在哪里?
  • 我正在使用 Eclipse 调试查看 sqlArray 内容。在我的存储过程中,我插入:
  • FOR I IN w_LISTE.FIRST..w_LISTE.LAST LOOP Begin INSERT INTO REPONSE_FORMULAIRE_QUALITE (IDE_REPONSE,TY_REPONSE,LIB_REPONSE) VALUES (w_LISTE_IDE(I),w_TYPE,w_LISTE(I)); EXCEPTION WHEN DUP_VAL_ON_INDEX then UPDATE REPONSE_FORMULAIRE_QUALITE SET LIB_REPONSE= w_LISTE(I) WHERE IDE_REPONSE= w_LISTE_IDE(I) and TY_REPONSE= w_TYPE;结尾;结束循环;如果结束;
  • 已解决!我将 NVARCHAR2 用于我的新类型,而不是 VARCHAR2

标签: java arrays string oracle jdbc


【解决方案1】:

(用 Yo hann 自己的解决方案回答,因为它对我也有帮助)

为您的新类型使用 NVARCHAR2 而不是 VARCHAR2。

【讨论】:

    【解决方案2】:

    正如 OP 所确认的,问题在于使用 NVARCHAR2 而不是 VARCHAR2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2013-03-22
      • 2019-12-26
      • 2010-10-31
      • 1970-01-01
      相关资源
      最近更新 更多