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.