Estou procurando garantir que todas as consultas em um aplicativo da Web php tenham o uso adequado de variáveis de ligação para minimizar a análise das consultas.
Estou me perguntando como o Oracle analisa as consultas que comparam uma coluna a uma lista de valores. O Oracle considerará essas instruções iguais ou a lista deve estar dentro de variáveis vinculadas?
select char from alphabet where char not in ('a', 'b');
select char from alphabet where char not in ('c', 'd');
Se o conteúdo da lista deve estar em uma variável de ligação, isso pode ser feito com uma única variável ou deve-se colocar cada item da lista em uma variável separada?
select char from alphabet where char not in (:list);
select char from alphabet where char not in (:c1, :c2);
Se o último for verdadeiro, as consultas com um número diferente de itens na lista ainda serão consideradas como tendo a mesma estrutura?
select char from alphabet where char not in (:c1, :c2);
select char from alphabet where char not in (:c1, :c2, :c3);
Você deve vincular os elementos de uma lista IN, caso contrário, o Oracle considerará essas instruções separadas. Quaisquer diferenças no texto do SQL farão com que uma nova instrução seja analisada (exceto alguns casos em que
cursor_sharing = force
). Portanto, seus exemplos com:a, :b
e:a, :b, :c
serão considerados instruções SQL diferentes.Cada elemento deve ser vinculado a uma variável separada. Se você vincular
'fred,nick'
a uma variável, o Oracle procurará a string "fred,nick", em vez dos itens separados fred e nick.Se você tiver variáveis em listas, mas não quiser analisar uma nova instrução para cada item adicional, precisará passar os elementos como uma string separada por vírgulas em uma variável de ligação e, em seguida, analisar os elementos você mesmo.
Tom Kyte discute algumas maneiras de fazer isso aqui . Basicamente, você pode fazer isso escrevendo uma função que retorna uma tabela aninhada na qual você pode agrupar uma
table
função para torná-la uma fonte de linha. Como alternativa, isso pode ser feito em SQL puro usando oconnect by level <= :num_of_rows
truque para gerar o número de elementos necessários e analisar a variável de ligação dessa maneira.