Comment déclarer un curseur après avoir COMMENCER?
Je veux savoir si un curseur peut être déclarés après la BEGIN
.
Et comment puis-je exporter le résultat de la plsql sur une feuille Excel, parce que j'ai l'exécution de cette procédure comme un travail.
CREATE OR REPLACE PROCEDURE masc(v_amsprogramid VARCHAR2) AS
v_mid VARCHAR2(50);
v_sid VARCHAR2(50);
CURSOR c1 IS
SELECT DISTINCT mid
FROM table_a WHERE aid = v_aid
ORDER BY mid;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO v_mid;
EXIT WHEN c1%NOTFOUND;
DECLARE
CURSOR c2 IS
SELECT DISTINCT sid INTO v_sid
FROM table_b WHERE mid = v_mid;
BEGIN
OPEN c2;
LOOP
FETCH c1 INTO v_mid;
EXIT WHEN c1%NOTFOUND;
dbms_output.PUT_LINE('MID : ' || v_mid);
dbms_output.PUT_LINE('Sid : ' || v_sid);
END LOOP;
CLOSE c2;
END LOOP;
CLOSE c1;
END masc;
Oui vous pouvez, mais seulement à l'intérieur d'un autre déclare-bloc begin
Pourquoi faites-vous cela en PL/SQL, ou de l'utilisation de curseurs? On dirait que vous juste besoin d'un simple select qui joint les deux tableaux? Il pourrait être utile de montrer ce la sortie dont vous avez besoin et expliquer comment il va obtenir dans Excel - êtes-vous produire un fichier CSV, ou l'interrogation à partir d'Excel?
Salut Alex j'ai une table qui a les Médiums et un autre qui a les Peid. Les Peid pourrait être l'un ou plus en nombre pour les Médiums. Je veux afficher les Médiums avec les Peid, correspondant à ceux des Médiums.
Cette exigence n'a rien à voir avec votre question: "puis-je déclarer un curseur après avoir commencer?"
Pourquoi faites-vous cela en PL/SQL, ou de l'utilisation de curseurs? On dirait que vous juste besoin d'un simple select qui joint les deux tableaux? Il pourrait être utile de montrer ce la sortie dont vous avez besoin et expliquer comment il va obtenir dans Excel - êtes-vous produire un fichier CSV, ou l'interrogation à partir d'Excel?
Salut Alex j'ai une table qui a les Médiums et un autre qui a les Peid. Les Peid pourrait être l'un ou plus en nombre pour les Médiums. Je veux afficher les Médiums avec les Peid, correspondant à ceux des Médiums.
Cette exigence n'a rien à voir avec votre question: "puis-je déclarer un curseur après avoir commencer?"
OriginalL'auteur olivia | 2015-10-28
Vous devez vous connecter pour publier un commentaire.
Peut-être vous cherchez ceci:
ou
OriginalL'auteur Wernfried Domscheit
Pas exactement. Mais vous pouvez utiliser un du curseur de la boucle au lieu de déclarer une explicite curseur.
Par exemple,
Mais de toute façon, ce serait plus lent que ligne par ligne est lente-par-lent. Je ne vois pas le besoin de la procédure à tout. Si vous avez vraiment besoin de le faire dans PL/SQL alors envisager en VRAC RECUEILLIR.
Je ne vois pas le besoin de PL/SQL dans ce cas. Vous pouvez simplement utiliser BOBINE dans SQL*Plus.
Par exemple,
OriginalL'auteur Lalit Kumar B
U pouvez utiliser le curseur de référence pour cette fin
OriginalL'auteur Prabhat Sharma
Vous pouvez déclarer plusieurs curseurs dans la même pl/sql bloc. Il n'est pas nécessaire de déclarer le deuxième curseur après que vous avez ouvert le premier curseur!
Vous écrivez quelque chose comme:
Toutefois, si vous deviez remplacer votre open-curseur-boucle-extrait comme un curseur-pour-boucle, vous pouvez simplifier un peu les choses:
En regardant cela, vous avez un curseur imbriqué boucle. Cela hurle de procédure de la pensée, plutôt que de définir la pensée, qui est à peu près un gros no-no lorsque vous travaillez avec des données dans la base de données (ie. c'est lent. Vous êtes d'avoir à passer constamment entre le SQL et PL/SQL moteurs, plutôt que de simplement poser le moteur SQL pour calculer le tout avant de le livrer à la PL/SQL du moteur).
En faisant le curseur imbriqué boucle, vous êtes essentiellement en réinventant les jointures de BOUCLE IMBRIQUÉE - ce que le moteur SQL peut faire beaucoup mieux que vous pouvez (pour ne pas mentionner qu'il pourrait ne pas être le plus efficace pour joindre, et le moteur SQL pu choisir une meilleure façon de faire le rejoindre!). Toutes les fois que vous verrez un curseur imbriqué boucle, vous devriez IMMÉDIATEMENT arrêter et de regarder pour voir si vous pouvez combiner les requêtes en une seule instruction select. (En fait, chaque fois que vous voyez une boucle, vous devriez mettre en pause et de considérer si vous avez vraiment besoin de cela; il est parfois nécessaire, mais si vous êtes en train de faire quelque chose comme la sélection d'un ensemble de résultats, puis d'aller dans chaque ligne et ensuite de faire une mise à jour, d'envisager la fusion de la sélectionner dans la mise à jour de sorte que vous avez une déclaration qui met à jour toutes les lignes à la fois. Il sera beaucoup plus rapide!)
Par exemple, l'original de votre procédure peut être réécrite comme:
Beaucoup plus simple à lire, à comprendre et à maintenir, je pense que vous serez d'accord!
Si vous êtes désireux d'écrire les résultats de la requête sql comme un fichier, vous aurez besoin d'utiliser
UTL_FILE
, au lieu deDBMS_OUTPUT
. Gardez à l'esprit que le répertoire dans lequel le fichier est écrit dans doit être quelque chose qui est monté/mappé sur le serveur de la base de données se trouve sur. Si vous écrivez les résultats que délimité par des caractères, vous pouvez facilement importer ce fichier dans Excel.Vous pourriez trouver que cela soit de l'utilisation.
Avez-vous l'essayer? Vous pouvez même juste essayer de l'exécution de l'instruction SQL, pour voir si elle renvoie les résultats que vous attendez.
Oui, il fonctionne.. merci beaucoup 🙂
OriginalL'auteur Boneist