2013-06-06 17 views
7

ORACLE STORED PROSEDÜRLERİ üzerinde çalışıyorum ve şüphem var. 1'den fazla satır alan bir sorgu sahibim ve bu 3 satırın değerlerini 1 Değişken'de saklamak istiyorum. Lütfen bu konuda bana yardımcı olabilir.1 DEĞİŞKEN - ORACLE DEPOLANMIŞ PROSEDÜRÜ MULTIPLE ROWS ve STORE Getir

Benim SORGU şöyledir:

İşte

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

bu sorgu 3 isim

getirir

Jack Jill Tavşan

Tüm bu 3 adları istiyoruz 1 değişkeni, yani C_NAMES içinde depolanması. Ve bundan sonra bu değişkeni prosedürümün diğer adımlarında kullanıyorum.

Bu konuda bana yardımcı olabilecek herhangi biri olabilir.

Zaman ve çabanıza minnettar olurum. peşin

sayesinde

Vrinda :)

+0

Daha sonra değerleri nasıl kullanacaksınız? Bir ref imlecine bakabilirsin, bir PL/SQL tablosu ... onlara nasıl geçmek istediğine ve/veya onlara referans vermek istediğine bağlı. –

+0

Bu C_NAMES'i bir kodda kullanıp kodun yerine geçen tüm değerleri değiştirmek zorundayım. C_NAMES değişkenindeki tüm isimleri şimdi olduğu gibi istiyorum. – vrindamarfatia

cevap

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

Sanırım '% TYPE' ifadesini 'names_t' alanına eklemeniz gerekiyor. ** TİP names_ntt IS TABLE OF names_t; ** – SophisticatedUndoing

+1

Kodunuz% 100 doğru değil, benim üstümde bir hata veriyor. 'TYPE names_ntt' ifadesini kullanmanız gerekir: names_cur% ROWTYPE; ve 'names_t names_cur% ROWTYPE;'. – Tenzin

2

Bunun için bir imleç gerekecek: Oracle sürümüne bağlı

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

istemine cevap için teşekkürler ama Hey Bu kodu ve gösteren --PLS-00302 çalıştı: bileşen 'STUDENT_DETAILS' --PLS-00320 beyan edilmelidir: Bu ifadenin türünün beyanı eksik veya yanlış biçimlendirilmiş – vrindamarfatia

3

(> = 11G (11.2)), sizi

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

DÜZENLEME: Oracle versiyonu aşağı ise 1 LISTAGG kullanabilirsiniz 1G (11.2), bir göz here

+0

ORACLE TOAD FOR ORACLE, üzerinde çalışıyoruz. Bu kod gösteriliyor: ORA-00923: FROM anahtar kelimesi beklenen yerde bulunamadı – vrindamarfatia

+0

Bunun için Oracle sürümünüzün 11G'den daha düşük olduğunu varsayıyorum. EDIT'ime bir göz atın, bağlantının size yardımcı olacağını düşünüyorum. – Ederson

+0

ORACLE 11G kullanıyorum – vrindamarfatia

0

Merhaba hepsini almak ve zaman ayırdığınız için teşekkür ederiz. Sorunu çözdüm ve Ederson'a teşekkürler. Şimdi

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

bir saklı yordam veya PLSQL bu kullanıyorsanız, sadece değişken oluşturmak ve onunla SELECT INTO kullanmak ve değişken yazdırmak zorunda: Burada

çözümdür.

İşte yardım insanlar için

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; 

tekrar teşekkürler kodudur.