2013-06-06 2 views
7

Ich arbeite an ORACLE gespeicherten Verfahren und ich habe Zweifel. Ich habe eine Abfrage, die mehr als 1 Zeile abruft und ich möchte alle diese 3 Zeile Werte in 1 Variable speichern. Kann mir bitte jemand dabei helfen.Holen Sie mehrere Reihen und speichern in 1 VARIABLE - ORACLE gespeichertes Verfahren

geht Meine QUERY dies wie:

SELECT STUDENT_NAME FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C';

Hier ist diese Abfrage holt 3 Namen

Jack, Jill, Häschen

Ich möchte alle diese drei Namen in 1 Variable gespeichert werden, dh C_NAMES. Und danach verwende ich diese Variable in weiteren Schritten meines Verfahrens.

Kann mir bitte jemand dabei helfen.

Ich würde Ihre Zeit und Mühe sehr schätzen.

Vielen Dank im Voraus,

Vrinda :)

+0

Wie werden Sie die Werte später verwenden? Sie können sich einen Ref-Cursor, eine PL/SQL-Tabelle ansehen ... hängt davon ab, wie Sie sie weitergeben und/oder auf sie verweisen möchten. –

+0

Ich muss diese C_NAMES in einem Clob verwenden, um Werte zu ersetzen, die alle ersetzen Code ist fertig Ich möchte nur alle Namen in C_NAMES Variable ab sofort. – vrindamarfatia

Antwort

17
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

Ich denke, es ist notwendig, "% TYPE" zu "names_t" nach ** TYPE names_ntt IST TABELLE von names_t; ** – SophisticatedUndoing

+1

Ihr Code ist nicht 100% richtig, es gibt einen Fehler der Benutzer über mich sagt. Sie müssen 'TYPE names_ntt IST TABELLE von names_cur% ROWTYPE;' Und entfernen Sie 'names_t names_cur% ROWTYPE;'. – Tenzin

2

Sie werden dafür einen Cursor benötigen:

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; 
+0

Hey Danke für die prompte Antwort, aber ich habe versucht, diesen Code und seine Anzeige --PLS-00302: Komponente 'STUDENT_DETAILS' muss --PLS-00320 deklariert werden: die Deklaration des Typs dieses Ausdrucks ist unvollständig oder fehlerhaft – vrindamarfatia

3

auf Ihrer Oracle-Version Abhängig (> = 11G (11.2)), Sie kann LISTAGG verwenden:

SELECT LISTAGG(STUDENT_NAME,',') WITHIN GROUP (ORDER BY STUDENT_NAME) 
FROM STUDENT.STUDENT_DETAILS 
WHERE CLASS_ID= 'C'; 

EDIT: Wenn Ihre Oracle-Version nachsteht 1 1G (11.2), einen Blick here

+0

Ich arbeite an TOAD FOR ORACLE, Dieser Code zeigt: ORA-00923: FROM Schlüsselwort nicht gefunden, wo erwartet – vrindamarfatia

+0

Dafür nehme ich an Ihre Oracle-Version ist schlechter als 11G. Sieh dir mein EDIT an, ich glaube der Link wird dir helfen. – Ederson

+0

Ich verwende ORACLE 11G – vrindamarfatia

0

Hallo alle und vielen Dank für Ihre Zeit. Ich habe die Frage und alles dank Ederson gelöst. Hier

ist die Lösung:

SELECT WM_CONCAT(STUDENT_NAME) 
FROM STUDENT.STUDENT_DETAILS WHERE CLASS_ID= 'C'; 

Nun, wenn Sie diese in einer Stored Procedure oder PLSQL verwenden Sie nur eine Variable erstellen haben und verwenden SELECT INTO mit ihm und den variablen Druck.

Hier ist der Code

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; 

Nochmals vielen Dank für Ihre Hilfe Menschen.

Verwandte Themen