2014-05-22 7 views
5

Tabella: 1.) prova 2.) PosizionePL/SQL utilizzando i dati fetching in loop

primo tavolo

//TEST 
A# 
--------------- 
1 
2 
3 

Seconda tavola:

//Position 
A#  POSITION 
------------------ 
1   GM 
1   DIRECTOR 
2   DOCTOR 
3   HELLO 
3   GM 

quando uso il seguente pl/sql nel mio sqlplus

DECLARE 
    c_a# test.A#%TYPE; 
    c_pos position.position%TYPE; 
    CURSOR c_app IS 
     SELECT t.a#,p.position from test t 
     INNER JOIN position p ON t.a#=p.p#; 
BEGIN 
    OPEN c_app 
    LOOP 
     FETCH c_app into c_a# , c_pos; 
     DBMS_OUTPUT.PUT_LINE(c_a# || ':' || c_pos); 
    END LOOP; 
    CLOSE c_app; 
END; 
/

Ecco l'output:

1:GM 
1:Director 
2:Doctor 
... 
... 

uscita prevista:

1:GM,Director 
2:Doctor 
3:HELLO,GM 

è qualcosa che non va nel mio loop?

+0

questo non è correlato alla mia domanda – user3664490

+0

Questo può essere fatto senza l'uso di cursori. Hai davvero bisogno di usare i cursori? – Arnab

+0

Quale versione di Oracle stai usando? –

risposta

0

Non sono sicuro di quale ambiente si sta utilizzando Oracle, perché hanno differenti funzione di aggregazione stringa per 10G e 11G rilascio.

Per 10G è necessario considerare la funzione WM_CONCAT. Di seguito è riportato il codice di esempio che si sta cercando di raggiungere attraverso cursor

DECLARE 
    CURSOR C_APP 
    IS 
     SELECT T.A#, WM_CONCAT (P.POSITION) 
      FROM TEST T INNER JOIN POSITION P ON T.A# = P.P# 
     GROUP BY T.A#; 

    C_A# TEST.A#%TYPE; 
    C_POS POSITION.POSITION%TYPE; 
BEGIN 
    OPEN C_APP; 

    LOOP 
     FETCH C_APP 
     INTO C_A#, C_POS; 
     EXIT WHEN C_APP%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE (C_A# || ':' || C_POS); 
    END LOOP; 
    CLOSE C_APP; 
END; 

Per 11G è possibile utilizzare la funzione listagg. Di seguito è riportato il codice di esempio

DECLARE 
    CURSOR C_APP 
    IS 
     SELECT T.A#, 
      LISTAGG(P.POSITION,',') WITHIN GROUP (ORDER BY P.POSITION) 
    FROM TEST T INNER JOIN POSITION P ON T.A# = P.P# 
    GROUP BY T.A#; 

    C_A# TEST.A#%TYPE; 
    C_POS POSITION.POSITION%TYPE; 
BEGIN 
    OPEN C_APP; 

    LOOP 
     FETCH C_APP 
     INTO C_A#, C_POS; 
     EXIT WHEN C_APP%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE (C_A# || ':' || C_POS); 
    END LOOP; 
    CLOSE C_APP; 
END; 

Accertarsi che siano presenti set serveroutput on al fine di visualizzare il risultato.

+0

si trova sempre di fronte al problema con valore numerico troppo piccolo ORA-06502 – user3664490

+0

ha dichiarato la riga 11. quindi qualsiasi soluzione? – user3664490

+0

@ user3664490 Non sono sicuro di quale sia la definizione della tabella. Molto probabilmente è il coz della colonna 'varchar' del tipo' Position' che supera il limite dopo aver restituito più valori per la colonna 'A #'. Altrimenti non riesco a pensare a nessun altro motivo per cui il codice sopra non funzioni –

0

per 11g è possibile utilizzare

CURSOR c_app IS 
     SELECT t.a#, listagg(p.position, ', ') WITHIN GROUP(order by t.a#) over(partition by t.a#) from test t 
     INNER JOIN position p ON t.a#=p.p#; 
0

Non sono sicuro, ma, Non è necessario chiudere questa linea?

OPEN c_app; 
+0

non riesci a vedere chiaramente il mio codice? – user3664490

0

Dai un'occhiata a questo. DBMS_OUTPUT potrebbe aiutare a

1

Puoi provare una cosa. utilizzare la funzione di raccolta. Recupererà i dettagli e li stamperà nel formato richiesto.

Problemi correlati