передать массив в процедуру оракула - PullRequest
10 голосов
/ 04 марта 2011

Я хочу отправить два массива из Java в хранимые процедуры оракула. Первый массив - это массив строк, а второй - массив символов как я могу это сделать ??

Ответы [ 6 ]

14 голосов
/ 05 марта 2011

Вот пример того, как это сделать.

Следующий скрипт устанавливает таблицу, тип и хранимую процедуру в базе данных. Процедура принимает параметр типа массива и вставляет каждую строку массива в таблицу:

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;
/

Затем Java-код демонстрирует передачу массива в эту хранимую процедуру:

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();
    }
}

Если вы запустите сценарий SQL, а затем класс Java и запросите таблицу strings, вы обнаружите, что все данные были вставлены в таблицу.

Когда вы говорите «массив символов», я предполагаю, что вы имеете в виду массив Java char s. Если я правильно угадал, то я думаю, что вам лучше преобразовать char s в String s, а затем использовать тот же подход, что и выше.

3 голосов
/ 05 марта 2011

Смотрите здесь: http://download.oracle.com/docs/cd/B19306_01/java.102/b14355/oraarr.htm#i1058512

и вот мой короткий пример:

1) в базе данных

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) в 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);
    }
}

, кажется, работает: вывод говорит

to_string returned: abc;def;geh
1 голос
/ 03 августа 2016

Поскольку ArrayDescriptor устарело с 12с, его больше не следует использовать.Вот фрагмент кода, который работал для меня в 12c:

            Array array = ((OracleConnection) connection).createOracleArray("T_VARCHAR2_ARRAY", data);
            CallableStatement statement = connection.prepareCall("{call p_array_test(?)}");
            statement.setArray(1, array);
            statement.execute();
0 голосов
/ 25 апреля 2018

PeudoCode для того же, как я добился.

    # 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);

Надеюсь, это поможет. Эта последовательность может отличаться в зависимости от требований и типа используемой базы данных sql, но база та же.

Я скопировал этот ответ из одного из моих других ответов.

Передать массив в качестве входного параметра хранимой процедуре оракула с помощью простого вызова jdbc

0 голосов
/ 03 сентября 2012

Regex решить

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;)
0 голосов
/ 05 марта 2011

Вы можете использовать типы Oracle для сопоставления объектов Java с Oracle.Также есть утилиты Spring JDBC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...