Je dois attribuer une valeur à la variable de sélection de la sortie de requête et appeler la variable dans les commandes SQL
pour par exemple: je reçois PDB_Name de V $ PDBS et attribue la valeur à v_pdb Je souhaite utiliser v_pdb dans plusieurs commandes SQL à exécuter contre les PDBS P>
J'ai essayé d'attribuer de la valeur à partir de la requête SELECT sur V_PDB et appelez le V_PDB dans 'Atter Session Set Contaminer = v_pdb'; Mais je reçois une erreur ORA-00922: erreur d'option manquante ou non valide p> Je veux simplement obtenir la valeur de variable v_pdb à partir de "Sélectionnez Nom de V $ PDBS où con_id = 3 et Open_mode = "lire écrire" " p> et appelez le v_pdb comme suit: p> Alter Session Set Container = v_pdb;
Exécuter d'autres commandes SQL
...
...... p> p>
3 Réponses :
Je crois que le problème est dans le demi-point de fin de votre SQL dynamique. Dynamic SQL n'inclut pas de semi-points de fuite - puisque le SQL dynamique est une déclaration unique, aucun séparateur de relevé n'est requis.
Après avoir laissé tomber la commande Semi-points de fin (et la commande "Afficher" (commande client) ) Cela fonctionne bien. Mais je ne connais pas un bon moyen d'obtenir dbms_output code> si vous êtes déjà dans un PDB donné. Qui a été abandonné dans cet exemple. P>
PL/SQL procedure successfully completed.
Merci, mais cela n'a pas l'air de travailler avec la commande show con_name, j'ai besoin d'exécuter plusieurs instructions SQL après que je défini "Alter Session Set Conteneur = PDB;" Je reçois une erreur lorsque vous remplacez SELECT * de Dual to Afficher con_name v_sql: = 'Afficher con_name'; / SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 Exécution: Alter Session Set Conteneur = PDB1D002 Exécution: Afficher con_Name Déclarez * Erreur à la ligne 1: ORA-00900: Instruction SQL non valide ORA-06512: à la ligne 11 ora -06512: à la ligne 11
Merci user918753. "Afficher" est une commande SQLPLUS / SQLCL - SQLPLUS / SQLCL Voir "Afficher" et exécutez d'autres commandes pour recueillir d'autres informations à afficher dans le terminal. Les commandes SQLPLUS ne peuvent pas être exécutées dans SQL dynamique, uniquement valide SQL ou PL / SQL peuvent être exécutées dans un bloc d'exécution immédiat code>. Vous pouvez plutôt exécuter une instruction SQL valide pour obtenir le nom de la connexion et faire tout ce qui est nécessaire avec elle.
Je ne pense pas que cela ait réellement quelque chose à voir avec votre variable PDB ...
Lorsque vous utilisez l'exécution immédiate, vous ne pouvez pas avoir de; dans la chaîne p>
Donc, pour chacune de vos déclarations immédiates d'exécution, supprimez le; par exemple p> devient p>
Il existe plusieurs façons d'améliorer le code et le processus de codage: P>
; code> à partir de la fin des instructions SQL utilisées dans Dynamic SQL. LI>
- Strings d'échappement: forts> Les cordes dans les cordes doivent être échappées. La chaîne
'données' code> doit être '' DATA '' ' CODE>. LI>
- Faites attention au message d'erreur complet: strong> affiche toujours le message d'erreur entier em>, y compris le numéro de ligne et le numéro de colonne. Cette information pointe exactement sur le problème. LI>
-
Utilisez le plus petit exemple possible: strong> A exemple plus petit aurait moins d'erreurs, ce qui facilite la tâche de Trouvez le problème réel. Et dans le processus de simplification de l'exemple, vous trouverez probablement la réponse vous-même. LI>
ol>
Essayez
v_pdb: = nom pdb.nom; code> comme première ligne du corps de votre boucle.