Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

passar array para procedimento oracle


Aqui está um exemplo de como fazê-lo.

O script a seguir configura uma tabela, um tipo e um procedimento armazenado no banco de dados. O procedimento pega um parâmetro do tipo array e insere cada linha do array na tabela:
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;
/

O código Java demonstra a passagem de uma matriz para este procedimento armazenado:
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();
    }
}

Se você executar o script SQL e, em seguida, a classe Java e, em seguida, consultar a tabela strings , você deve descobrir que todos os dados foram inseridos na tabela.

Quando você diz 'um array de caracteres', suponho que você quer dizer um array de Java char s. Se acertei, acho que seria melhor converter o char s para String s e, em seguida, usando a mesma abordagem acima.