pass-array naar een oracle-procedure

Ik wil twee arrays vorm java opgeslagen oracle-procedures.
De eerste Array is een array van strings en de tweede is een array van chars
hoe kan ik dit??

InformationsquelleAutor palAlaa | 2011-03-04

 

6 Replies
  1. 14

    Hier is een voorbeeld van hoe het te doen.

    Het volgende script wordt een tabel, een type en een opgeslagen procedure in de database. De procedure neemt een parameter van de array type en voegt elke rij van de matrix in de tabel:

    CREATE TABLE strings (s VARCHAR(4000));
    
    CREATE TYPE t_varchar2_array AS TABLE OF VARCHAR2(4000);
    /
    
    CREATE OR REPLACE PROCEDURE p_array_test(
        p_strings      t_varchar2_array
    )
    AS
    BEGIN
      FOR i IN 1..p_strings.COUNT
      LOOP
        INSERT INTO strings (s) VALUES (p_strings(i));
      END LOOP;
    END;
    /

    De Java-code, dan toont het doorgeven van een array in dit opgeslagen procedure:

    import java.sql.*;
    import oracle.jdbc.*;
    import oracle.sql.*;
    
    public class ArrayTest {
        public static void main(String[] args) throws Exception {
            DriverManager.registerDriver(new OracleDriver());
            Connection conn = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:xe", "user", "pass");
    
            CallableStatement stmt = conn.prepareCall("BEGIN p_array_test(?); END;");
    
            //The first parameter here should be the name of the array type.
            //It's been capitalised here since I created it without using
            //double quotes.
            ArrayDescriptor arrDesc =
                ArrayDescriptor.createDescriptor("T_VARCHAR2_ARRAY", conn);
    
            String[] data = { "one", "two", "three" };
            Array array = new ARRAY(arrDesc, conn, data);
            stmt.setArray(1, array);
            stmt.execute();
    
            conn.commit();
            conn.close();
        }
    }

    Als u het SQL-script en vervolgens de Java-klasse, en vervolgens een query de tabel strings, je moet zien dat alle van de gegevens in de tabel ingevoegd.

    Als je zegt ‘een array van chars’, ik vermoed dat je bedoelt dat een array van Java chars. Als ik heb goed geraden, dan denk ik dat het best zou zijn uit het omzetten van de chars te Strings en vervolgens met behulp van dezelfde methode als hierboven.

    • Is het mogelijk dit te doen met multidimensionale arrays? stackoverflow.com/questions/15045019/…
    • Ik heb kopieer/plak uw volledige oplossing – wat resulteert in een tabel “strings” met drie waarden (null)… met oracle 9i evenals 10g en alle beschikbare jdbc-stuurprogramma ‘ s – resultaat is hetzelfde. oracle.sql.MATRIX is leeg wanneer het is gemaakt in java – ik probeer een oplossing is te vinden, maar geen geluk zo ver 🙁 het is hetzelfde probleem als hier stackoverflow.com/questions/14998299/…
    • Woodward: ik upvoted u. Kunt u uitbreiden met een beetje voor het doorgeven van een arraylist toa functie. De functie in de database niet gemaakt door mij, en ik moet 2 arraylists.
    • nee, ik zie niet in waarom ik zou moeten. Bent u niet op de hoogte van de toArray() methode op een ArrayList?
  2. 3

    Kijk hier:
    http://download.oracle.com/docs/cd/B19306_01/java.102/b14355/oraarr.htm#i1058512

    en hier is mijn korte voorbeeld:

    1) op database

    SQL> create or replace type string_array as table of varchar2(100);
      2  /
    
    Type created.
    
    SQL> create or replace function to_string(p_array in string_array) return varchar2
      2  as
      3     l_string varchar2(32767);
      4     i binary_integer;
      5  begin
      6     i := p_array.first();
      7     while i is not null loop
      8        l_string := l_string || p_array(i) || ';';
      9        i := p_array.next(i);
     10     end loop;
     11     l_string := rtrim(l_string, ';');
     12     return l_string;
     13  end;
     14  /
    
    Function created.

    2) in java

    public class ArrayTest {
        public static void main(String[] args) throws SQLException {
            DriverManager.registerDriver(new OracleDriver());
            OracleConnection connection = (OracleConnection) DriverManager.getConnection(...);
    
            String[] elements = {"abc", "def", "geh"};
            ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("STRING_ARRAY", connection);
            ARRAY array = new ARRAY(descriptor, connection, elements);
    
            OracleCallableStatement stmt = (OracleCallableStatement) connection.prepareCall("{? = call to_string(?)}");
            stmt.registerOutParameter(1, Types.VARCHAR);
            stmt.setARRAY(2, array);
            stmt.execute();
    
            String result = stmt.getString(1);
            System.out.println("to_string returned: " + result);
        }
    }

    lijkt te werken: de uitvoer, zegt

    to_string returned: abc;def;geh
  3. 1

    Sinds ArrayDescriptor is verouderd sinds 12c, het mag niet meer worden gebruikt.
    Hier is een code sniplet dat werkte voor mij in 12c:

                Array array = ((OracleConnection) connection).createOracleArray("T_VARCHAR2_ARRAY", data);
                CallableStatement statement = connection.prepareCall("{call p_array_test(?)}");
                statement.setArray(1, array);
                statement.execute();
  4. 0

    Kunt u gebruik maken van Oracle Soorten in kaart Java objecten naar Oracle. Ook is er de Lente JDBC-hulpprogramma ‘ s.

  5. 0

    Regex lossen

    select * from table_a  a where a.col in (select   regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
    connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;)
    • Bent u suggereert het omzetten van de matrix naar een komma-gescheiden String en door te geven aan een procedure verwacht een varchar2; dan versmelten tot aan de elementen? Dat lijkt rommelig, kunt raken van de 32k limiet, en zal breken (eventueel op de achtergrond) als een van de waarden die al een komma bevatten,…
  6. 0

    PeudoCode voor hetzelfde hoe ik bereikt heb.

        # 1.You will require a structDescriptor object for an object equivalent in pl sql like :
    
        StructDescriptor structDes= new StructDescriptor("<schemaname in caps>.<sql_object_name>", connectionObject);
    
        # 2. You will need to pass one object values such name, class, id to an object array in order and accordance to 'sql_object_name' object. 
    
        For exmaple:
        STRUCT[] structArray=new STRUCT[<ListObj>.size()];
        int index=0;
        for (a in ListObj){
    
        Object[] object=new Object[]{a.getName(),a.getId()};
        STRUCT struct=new STRUCT(structDes ,connectionObject,object);
                   structArray[index]=struct;
                   index++;
    
        }
    
        ArrayDescriptor arrayDes=ArrayDescriptor.createDescriptor(
            "<Schema name>.<table object from sql>", connectionObject);
    
        ARRAY array=new ARRAY(arrayDes,connectionObject, structArray);
    
       then pass it to proc 
    
       .declareParameters(
       new SqlInOutParameter("<parameter to proc name>",OracleTypes.ARRAY,"
       <schema name>.<sql_array_or_table_obj>"))
    
       like 
       Hashmap<String, Object> map= new HashMap<>();
       map.put("<parameter to proc name>",array);
       psStatement.execute(map);

    Hoop dat het helpt. Deze volgorde kan verschillen per eis en het type van de sql-database gebruikt, maar de basis is hetzelfde.

    Ik heb gekopieerd dit antwoord van één van mijn andere antwoorden.

    Pas array als parameter input om een opgeslagen oracle-procedure met behulp van eenvoudige jdbc-oproep

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *