Comment avez-vous préciser DANS la clause dans une dynamique de requêtes à l'aide d'une variable?
En PL/SQL, vous pouvez spécifier les valeurs de l'opérateur à l'aide de la concaténation:
v_sql := 'select field1
from table1
where field2 in (' || v_list || ')';
Est-il possible de faire la même chose à l'aide d'une variable?
v_sql := 'select field1
from table1
where field2 in (:v_list)';
Si oui, comment?
EDIT: Avec référence à Marcin réponse, comment puis-je sélectionner à partir de la table résultante?
declare
cursor c_get_csv_as_tables is
select in_list(food_list) food_list
from emp_food
where emp_type = 'PERM';
cursor c_get_food_list (v_food_table varchar2Table)is
select *
from v_food_table;
begin
for i in c_get_csv_as_tables loop
for j in c_get_food_list(i.food_list) loop
dbms_output.put_line(j.element);
end loop;
end loop;
end;
J'obtiens l'erreur suivante:
ORA-06550: line 10, column 6:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 9, column 1:
PL/SQL: SQL Statement ignored
ORA-06550: line 15, column 34:
PLS-00364: loop index variable 'J' use is invalid
ORA-06550: line 15, column 13:
PL/SQL: Statement ignored
double possible de PL/SQL utiliser VARRAY dans la CLAUSE
Je ne comprends pas... comment est-ce la même chose? J'ai besoin de passer un lier des variables. Est-il une façon similaire pour ce faire?
Je ne savais pas que tu voulais lier. cela dit, autant que je sache, vous ne pouvez pas utiliser de lier des variables comme ça.
mais vous pouvez toujours lier un varray comme dans le lien @Sathya vous a donné
double possible de Comment puis-je vérifier pour une mise EN condition à l'encontre d'une liste dynamique dans Oracle?
Je ne comprends pas... comment est-ce la même chose? J'ai besoin de passer un lier des variables. Est-il une façon similaire pour ce faire?
Je ne savais pas que tu voulais lier. cela dit, autant que je sache, vous ne pouvez pas utiliser de lier des variables comme ça.
mais vous pouvez toujours lier un varray comme dans le lien @Sathya vous a donné
double possible de Comment puis-je vérifier pour une mise EN condition à l'encontre d'une liste dynamique dans Oracle?
OriginalL'auteur Zesty | 2012-01-23
Vous devez vous connecter pour publier un commentaire.
Comme dans @Sathya lien, vous pouvez lier le varray (j'ai pris @Codo exemple):
Mise à JOUR: la première commande peut être remplacé par:
puis composez le:
lorsque vous ajoutez une valeur
J'ai utilisé le VARRAY juste parce que c'était dans l'exemple original. Vous pouvez utiliser une autre collection de la TABLE de VARCHAR2(200). L'extension de la méthode peut être appelée pour chaque valeur ajoutée (lors de la conversion d'un fichier CSV)
OriginalL'auteur A.B.Cade
Malheureusement vous ne pouvez pas lier une liste comme ceci, cependant, vous pouvez utiliser une fonction de table. Lire cette
Voici un exemple d'utilisation en fonction de votre code:
Que j'ai utilisé ici un column_value pseudo-colonne
J'ai rencontré un problème avec cette approche. Comment puis-je sélectionner à partir de la table résultante, puisque je n'ai pas la "colonne" nom?
OriginalL'auteur Marcin Wroblewski
Lier des variables peuvent être utilisées dans Oracle SQL de la requête avec "dans" la clause.
Travaille dans 10g; je ne sais pas pour les autres versions.
Lier la variable est de type varchar jusqu'à 4 000 caractères.
Exemple: Lier la variable contenant la liste séparée par des virgules de valeurs, par exemple
:bindvar = 1,2,3,4,5
OriginalL'auteur Kat
Comme par @Marcin réponse vous ne pouvez pas faire cela, cependant, il ya un peu juste pour ajouter à cela, que votre requête doit vraiment travailler, c'est à dire exécuter.
Tout simplement, vous ne pouvez pas utiliser une liaison variable pour une table ou une colonne. Non seulement cela, lier les variables qu'ils sont présumés avoir un caractère, donc si vous voulez un numéro que vous avez à utiliser
to_number(:b1)
etc.C'est là que votre requête tombe vers le bas. Comme vous êtes de passage dans une chaîne Oracle suppose que l'intégralité de votre liste est une chaîne unique. Ainsi, vous êtes effectivement en cours d'exécution:
Il n'ya aucune raison pourquoi vous ne pouvez pas faire cela d'une manière différente. Je vais supposer que vous êtes la création dynamique d'
v_list
, ce qui signifie que tout ce que vous devez faire est de créer cette liste différemment. Une série deor
conditions est, soi-disant :-), à l'aide d'unin
.Par des soi-disant, je veux dire que jamais compter sur quelque chose qui est non testé. Bien que Tom ne dit dans le lien qu'il peut y avoir des contraintes de performance il n'y a aucune garantie qu'il n'était pas plus rapide que d'utiliser
in
pour commencer. La meilleure chose à faire est d'exécuter le suivi de votre requête et son et de voir quelle différence il y a, le cas échéant.OriginalL'auteur Ben