Preciso usar este código em um pacote PL/SQL:
Var_All Varchar2(100) := '''var1'',''var2''';
Select ... many fields ...
Bulk Collect Into ResultTable
From ... many tables with joins
Where my_table.MC01 IN (Var_All);
Pelo que eu sei, não posso usar a variável Var_All com uma cláusula IN porque os dados são perdidos devido aos apóstrofos. As variáveis var1, var2, varN são strings que na verdade contêm apenas números, então também seria bom se eu pudesse comparar o valor do campo my_table.MC01 com números.
Encontrei duas soluções, mas não gosto de nenhuma delas.
SQL Dinâmico
Cursor, onde faço algumas dessas alterações:
Em vez da cláusula IN: Onde my.table.MC01 = record.var;
E em vez de "Bulk Collect Into", eu chamaria um procedimento separado onde colocaria os dados na ResultTable.
Existe uma solução melhor?
Uma variável de ligação é um valor escalar único - não é uma lista. Portanto, quando você passa uma string contendo
'var1','var2'
você está passando um único valor e não uma lista de dois valores, então se você tivesse ummy_table.MC01
que fosse,'var1','var2'
então ele seria correspondido, masvar1
ouvar2
não seria correspondido.Você pode continuar passando uma única string usando uma correspondência
LIKE
para realizar uma correspondência de substring (garantindo que você corresponda os termos completos com os delimitadores circundantes):ou você pode usar uma coleção:
Em seguida, use-o na consulta:
ou:
ou usando a
JOIN
(que pode fornecer resultados diferentes se a coleção de entrada contiver duplicatas):