Pergunta

Eu queria saber se havia uma maneira de vincular uma lista de Array (ou qualquer tipo de lista, para esse assunto) a um estatuto preparado que acabará sendo usado para acessar um banco de dados Oracle. Eu encontrei:

Preparado estatamento em alternativas de cláusula?

E isso parece semelhante ao meu problema, mas essa pergunta é mais específica: gostaria de vincular uma lista de Array a uma estatuto preparado para ser usado no Oracle, se for possível, como isso é realizado?

Foi útil?

Solução

Você não pode vincular uma lista a um único parâmetro em uma instrução preparada.

Gere SQL com o marcador de parâmetro A para cada elemento da lista, por exemplo:

SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?)

Mesmo que você gere uma nova declaração para cada consulta, eu ainda recomendo usar um PreparedStatement. Se sua lista contiver String Instâncias, você obterá a escape necessária para proteger da injeção de SQL.

Mas mesmo que seja um tipo seguro, como Integer objetos, alguns drivers ou middleware podem armazenar em cache PreparedStatements, e retorne uma instância em cache se o mesmo formulário for solicitado. Obviamente, alguns testes seriam necessários. Se suas listas variarem amplamente, você terá muitas declarações diferentes, e um cache mal implementado pode não estar preparado para lidar com tantos.

Outras dicas

Você não pode vinculá -lo diretamente. Existe uma maneira de passar uma matriz como um parâmetro. Não tenho ideia do que você quer fazer com ele no lado do banco de dados, para que isso não ajude.

Basicamente, você deve criar um tipo de tabela aninhado no banco de dados; Crie um objeto Java com base nesse tipo, contendo os dados da sua matriz; e passe isso como o parâmetro.

Se você criou esses objetos no banco de dados:

CREATE OR REPLACE TYPE my_nested_table IS TABLE OF VARCHAR2(20);
CREATE TABLE my_table (a  my_nested_table) NESTED TABLE a STORE AS my_table_a;

Então você pode escrever código Java como este:

String[] insertvalues = { "a", "b", "c" };
PreparedStatement p = conn.prepareStatement("INSERT INTO my_table VALUES( ? )");
ARRAY insertParameter = new ARRAY( a_desc, conn, insertvalues );
p.setArray( 1, insertParameter );
p.execute();

Os resultados do Oracle se parecem:

dev> select * from my_table;

A
--------------------------------------------------------------------------------
MY_NESTED_TABLE('a', 'b', 'c')

Bem, a julgar pela resposta a essa, especialmente os comentários à minha resposta errada nessa pergunta, você não pode.

Ver http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#996857

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top