IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Problème pour passer un tableau en parametre dans une procedure PL/SQL


Sujet :

JDBC Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Problème pour passer un tableau en parametre dans une procedure PL/SQL
    Bonjour,

    Après pas mal de recherche (et à peu près tous les forums de la terre), je n'arrive toujours pas à utiliser les éléments String d'un tableau passé dans une proc avec JAVA.

    En m'aidant pas mal du forum (http://www.developpez.net/forums/d38...cedure-pl-sql/), je n'arrive toujours pas à enregistrer des chaines de caractères en base (ca marchepour les tableaux de numériques)

    voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    --Create table
    drop table Z_TOP2;
     
    CREATE TABLE Z_TOP2
    (
      N_TOP  NUMBER(12),
      I_TOP  INTEGER,
      V_TOP  VARCHAR2(400 CHAR),
      C_TOP  CHAR(100 CHAR)
    );
     
    --Create type
    CREATE OR REPLACE type char_t is table of char(100);
    CREATE OR REPLACE type integer_t is table of integer;
    CREATE OR REPLACE type number_t is table of number;
    CREATE OR REPLACE type varchar2_t is table of varchar2(255);
     
    --Create Proc
    CREATE OR REPLACE PROCEDURE EXP_BCPA_EP.test_arraytab_pro2 
    (tab_n IN NUMBER_T,tab_i in INTEGER_T,tab_v in VARCHAR2_T,tab_c in CHAR_T)
    IS
    begin
        For i in 1..tab_c.count Loop 
          insert into Z_TOP2 values(tab_n(i), tab_i(i), tab_v(i), tab_c(i));
        End loop;
    commit;
    end test_arraytab_pro2;
     
    commit;
    TEST 1: je lance la proc directement
    TEST 2: je lance la proc avec du JAVA


    TEST 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    declare
        tab_n NUMBER_T;
        tab_i INTEGER_T;
        tab_v VARCHAR2_T;
        tab_c CHAR_T;
    begin
        tab_n := NUMBER_T(1230,2340,3450,5670);
        tab_i := INTEGER_T(1230,2340,3450,5670);
        tab_v := VARCHAR2_T('direct_v1', 'direct_v2', 'direct_v3');
        tab_c := CHAR_T('c1', 'c2', 'c3');
        test_arraytab_pro2(tab_n, tab_i, tab_v, tab_c);
    end;

    Résultat Test 1: Nickel!
    N_TOP I_TOP V_TOP C_TOP
    1230 1230 direct_v1 c1
    2340 2340 direct_v2 c2
    3450 3450 direct_v3 c3


    TEST 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    import java.math.BigDecimal;
    import java.util.List;
    import oracle.jdbc.driver.OracleDriver.*;
    import java.sql.*;
    import oracle.jdbc.*;
    import oracle.sql.*;
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Types;
    import oracle.jdbc.OracleCallableStatement;
    import oracle.jdbc.internal.OracleTypes;
    import oracle.sql.ARRAY;
    import oracle.sql.ArrayDescriptor; 
    import java.util.*;
    import java.io.*;
     
    class Java_pwc_arr2 {
       public static void main (String[] args){
                try{
    	    DriverManager.registerDriver ( new oracle.jdbc.driver.OracleDriver () );
    	    String url = "jdbc:oracle:thin:XXXXXXXXX";
    	    String usr = "XXXXXXX";
    	    String pwd = "XXXXXXX";
    	    Connection conn = DriverManager.getConnection(url,usr, pwd); 
     
    	    String sql = "call test_arraytab_pro2(?,?,?,?)";
    	    CallableStatement stmt = conn.prepareCall(sql);
    	    ArrayDescriptor des1 = ArrayDescriptor.createDescriptor("EXP_BCPA_EP.NUMBER_T", conn);
    	    ArrayDescriptor des2 = ArrayDescriptor.createDescriptor("EXP_BCPA_EP.INTEGER_T", conn);
    	    ArrayDescriptor des3 = ArrayDescriptor.createDescriptor("EXP_BCPA_EP.VARCHAR2_T", conn);
    	    ArrayDescriptor des4 = ArrayDescriptor.createDescriptor("EXP_BCPA_EP.CHAR_T", conn);
     
     
    	    //String array[] = {"one", "two", "three","four", "5"};              
    	Number[] var_n = {123,234,345,567};
    	Integer[] var_i = {123,234,345,567};
    	String[] var_v = {"Java1", "v2", "v3"};
    	String[] var_c = {"a", "b", "c"};
     
    	System.out.println( "Debut programme");
    	//Array array_to_pass = new ARRAY (des, conn, array);
    	Array array_to_pass_1 = new ARRAY (des1, conn, var_n);
    	Array array_to_pass_2 = new ARRAY (des2, conn, var_i);
    	Array array_to_pass_3 = new ARRAY (des3, conn, var_v);
    	Array array_to_pass_4 = new ARRAY (des4, conn, var_c);
     
    	    stmt.setArray(1,array_to_pass_1);
    	    stmt.setArray(2,array_to_pass_2);
    	    stmt.setArray(3,array_to_pass_3);
    	    stmt.setArray(4,array_to_pass_4);
     
    	    stmt.execute();
    	    stmt.close();
     
    	    conn.close(); 
     
    	    System.out.println ("Resultat requete connexion realise");
     
                }
                catch(Exception e)
                {
                //    System.out.println("--Pbm en chargeant le driver JDBC oracle--");
                }
       }
    }

    Résultat Test 2: Pas top (seul les numériques sont enregistrés)
    N_TOP I_TOP V_TOP C_TOP
    123 123
    234 234
    345 345

    Conclusion:
    Les tableaux de numériques/entiers passent bien mais pas les chaines de caractères.
    HELP!

    Infos:
    JDK 1.5, Oracle 9i et 11g.

  2. #2
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Problème passage Array vers Oracle
    Bonjour,
    Même sans parler de procs, le Array ne semble pas du tout fonctionner.

    Oracle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE OR REPLACE TYPE string_varray AS VARRAY(10) OF VARCHAR2(100);
     
     
    CREATE TABLE Z_TOP_VARRAY
    (
      LB_TOP  STRING_VARRAY
    )
    JAVA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    import java.sql.*;
    import oracle.sql.*;
    import oracle.jdbc.*;
     
     
    public class VArrayManipulation
    {
      public static void main (String args[])
        throws Exception
      {
        DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
     
        // The sample retrieves an varray of type "STRING_VARRAY",
        // materializes the object as an object of type ARRAY.
        // A new ARRAY is then inserted into the database.
     
        String url = "jdbc:oracle:thinXXX";
        String usr = "XXX";
        String pwd = "XXX";
        Connection conn = DriverManager.getConnection(url,usr, pwd); 
     
        conn.setAutoCommit (false);
     
        // Create a Statement
        Statement stmt = conn.createStatement ();
     
        //TEST1: Insert using SQL
        stmt.execute ("INSERT INTO Z_TOP_varray VALUES (string_varray('Test1', 'Test2'))");
     
        //TEST2: Insert using ArrayDescriptor
        // create a new ARRAY object
        String arrayElements[] = { "Test3", "Test4" };
        ArrayDescriptor desc = ArrayDescriptor.createDescriptor("VARCHAR2_T", conn);
        ARRAY newArray = new ARRAY(desc, conn, arrayElements);
     
        PreparedStatement ps = conn.prepareStatement ("insert into Z_TOP_varray values (?)");
        ((OraclePreparedStatement)ps).setObject (1, newArray);
     
        ps.execute ();
     
        // Close all the resources
        ps.close();
        stmt.close();
        conn.close();
      }
    }
    Résultat:
    LB_TOP
    (Test1; Test2; ; ; ; ; ; ; ; )
    (; ; ; ; ; ; ; ; ; )



    Un amateur JAVA? (un vrai).
    Merci.

  3. #3
    Membre émérite
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Points : 2 814
    Points
    2 814
    Par défaut
    Plop,

    Tu devrais déjà utiliser les fonctions de java.sql, sans passer par oracle.sql. Tu oublies surement de faire des choses.

    En soit, le pur code pour les tableaux est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Connection con = ... 
    String [] region = { "10022", "02110", "07399" };
    Array aArray = con.createArrayOf("VARCHAR", region);
    PreparedStatement pstmt = con.prepareStatement("insert into mytable (zips)  VALUES (?)");
    pstmt.setArray(1, northEastRegion);
    pstmt.executeUpdate();
    aArray.free();
    Essaye de partir sur du code standard, sans utiliser les implémentations propres au driver que tu as.

  4. #4
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Réponse
    Bonjour,
    Et voila la solution: ajouter une librairie pour résoudre les problèmes de NLS
    (http://docs.oracle.com/cd/B14117_01/...979/global.htm)

    Sous Linux:
    java -cp ./lib/ojdbc5.jar:./lib/orai18n.jar:. TestArray



    Merci PS

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/01/2013, 16h25
  2. Saisie clavier de Parametres dans une procedure PL/SQL
    Par E LABOUREAU dans le forum PL/SQL
    Réponses: 1
    Dernier message: 06/11/2009, 19h13
  3. Réponses: 4
    Dernier message: 05/03/2009, 13h52
  4. Réponses: 1
    Dernier message: 20/07/2007, 07h19
  5. Passer un tableau en parametre dans une fonction js
    Par hellmaster78 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/06/2005, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo