Je travaille sur les procédures d'Oracle stockées et j'ai un doute. J'ai une requête qui récupère plus d'une rangée et je souhaite stocker toutes ces valeurs de 3 lignes dans une variable. Quelqu'un peut-il m'aider avec ceci. P>
Ma requête va comme ça: p>
ici cette requête récupère 3 noms p>
Jack,
Jill,
Bunny P>
blockQuote>
Je veux que tous ces 3 noms soient stockés dans une variable I.E C_Names.
Et après cela, j'utilise cette variable dans d'autres étapes de ma procédure. P>
Quelqu'un peut-il m'aider avec ceci. P>
J'apprécierais très bien votre temps et vos efforts. P>
Merci d'avance, P>
vrinda :) p> Sélectionnez Student_Name
De Student.Student_Détails
Où class_id = 'c'; code> p>
4 Réponses :
Vous aurez besoin d'un curseur pour cela:
DECLARE
CURSOR stud_cur IS
SELECT STUDENT_NAME FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';
l_stud STUDENT.STUDENT_DETAILS%ROWTYPE;
BEGIN
OPEN stud_cur;
LOOP
FETCH stud_cur INTO l_stud;
EXIT WHEN stud_cur%NOTFOUND;
/* The first time, stud_cur.STUDENT_NAME will be Jack, then Jill... */
END LOOP;
CLOSE stud_cur;
END;
Hé merci pour la réponse rapide mais j'ai essayé ce code et sa montrant --PLS-00302: composant 'Student_Détails' doit être déclaré --PLS-00320: La déclaration du type de cette expression est incomplète ou malformée
Selon votre version Oracle (> = 11g (11.2)), vous pouvez utiliser Listagg:
SELECT LISTAGG(STUDENT_NAME,',') WITHIN GROUP (ORDER BY STUDENT_NAME) FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';
Je travaille sur le crapaud pour Oracle, ce code montre: ora-00923: à partir de mots-clés introuvable si attendu
Pour cela, je suppose que votre version Oracle est inférieure à 11g. Jetez un coup d'œil à mon édition, je crois que le lien vous aidera à sortir.
Ce doit être de 11,2 g. Même problème: Stackoverflow.com/Questions/5569633/oracle-sql-listagg -Funct ion
Weird, j'ai exécuté la même requête (à l'exception du schéma des étudiants) et cela a fonctionné comme un charme. C'est le résultat: lapin, Jack, Jill
Oh je dois mettre le nom du schéma parce que j'exègre la procédure de schéma différent, pourquoi..some Autre solution s'il vous plaît
CREATE PROCEDURE a_proc
AS
CURSOR names_cur IS
SELECT student_name
FROM student.student_details
WHERE class_id = 'C';
names_t names_cur%ROWTYPE;
TYPE names_ntt IS TABLE OF names_t%TYPE; -- must use type
l_names names_ntt;
BEGIN
OPEN names_cur;
FETCH names_cur BULK COLLECT INTO l_names;
CLOSE names_cur;
FOR indx IN 1..l_names.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(l_names(indx).student_name);
END LOOP;
END a_proc;
Je pense qu'il est nécessaire d'ajouter '% de type' à 'nams_t' après type nom_ntt est Table de noms_t; b>
Votre code n'est pas correct à 100%, il donne une erreur que l'utilisateur au-dessus de moi dit. Vous devez utiliser type nom_ntt est Tableau de noms_cur% Rowtype; code> et supprimer noms_t noms_cur% rowtype; code>.
Bonjour à tous et merci pour votre temps. J'ai résolu la question et tout remerciement à Ederson.
Voici la solution: p> maintenant si vous utilisez ceci dans une procédure stockée ou plsql, vous devez juste avoir à Créez une variable et utilisez Voici le code P> Sélectionnez dans CODE> avec et imprimez la variable. P> DECLARE
C_NAMES VARCHAR2(100);
BEGIN
SELECT WM_CONCAT(STUDENT_NAME) INTO C_NAMES
FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';
dbms_output.put_line(sname);
END;
Comment allez-vous utiliser les valeurs plus tard? Vous pouvez regarder un curseur REF, une table PL / SQL ... dépend de la façon dont vous voulez les transmettre et / ou de les référer.
Je dois utiliser que c_names dans un clavier pour remplacer les valeurs tout ce que le remplacement du code est effectué, je veux juste que tous les noms de la variable C_Names à partir de maintenant.