10
votes

Fixer plusieurs lignes et stocker dans 1 variable - Procédure stockée Oracle

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.

Ma requête va comme ça:

Sélectionnez Student_Name De Student.Student_Détails Où class_id = 'c';

ici cette requête récupère 3 noms

Jack, Jill, Bunny

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.

Quelqu'un peut-il m'aider avec ceci.

J'apprécierais très bien votre temps et vos efforts.

Merci d'avance,

vrinda :)


2 commentaires

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.


4 Réponses :


2
votes

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;


1 commentaires

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



4
votes

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';


5 commentaires

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



21
votes
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;

2 commentaires

Je pense qu'il est nécessaire d'ajouter '% de type' à 'nams_t' après type nom_ntt est Table de noms_t;


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; et supprimer noms_t noms_cur% rowtype; .



3
votes

Bonjour à tous et merci pour votre temps. J'ai résolu la question et tout remerciement à Ederson.

Voici la solution: p> xxx pré>

maintenant si vous utilisez ceci dans une procédure stockée ou plsql, vous devez juste avoir à Créez une variable et utilisez Sélectionnez dans CODE> avec et imprimez la variable. P>

Voici le code 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;


0 commentaires