0
votes

Attribuer une valeur à la variable et appelez plusieurs commandes

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

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 xxx

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" "

et appelez le v_pdb comme suit:

Alter Session Set Container = v_pdb; Exécuter d'autres commandes SQL ... ......


1 commentaires

Essayez v_pdb: = nom pdb.nom; comme première ligne du corps de votre boucle.


3 Réponses :


1
votes

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.


2 commentaires

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 . 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.



1
votes

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

Donc, pour chacune de vos déclarations immédiates d'exécution, supprimez le; par exemple xxx

devient xxx


0 commentaires

1
votes

Il existe plusieurs façons d'améliorer le code et le processus de codage:

  1. excluez les terminalisateurs de la déclaration de Dynamic SQL: Comme d'autres personnes ont mentionné, supprimez le ; à partir de la fin des instructions SQL utilisées dans Dynamic SQL.
  2. Strings d'échappement: Les cordes dans les cordes doivent être échappées. La chaîne 'données' doit être '' DATA '' '.
  3. Faites attention au message d'erreur complet: affiche toujours le message d'erreur entier , y compris le numéro de ligne et le numéro de colonne. Cette information pointe exactement sur le problème.
  4. Utilisez le plus petit exemple possible: 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.

0 commentaires