2017-02-22 1 views
0

J'ai une table temporaire dynamique comme ci-dessous.Oracle: Instruction de curseur dynamique SQL

Nom de la table pour hypothèse: TB_EMP_TEMP_TABLE

Column1 | column2  | column3 
Emp_NM | EMP_ID  |TB_EMP_DTLS 
Emp_Adr | EMP_ID  |TB_EMP_DTLS 
Emp_Sal | EMP_ID  |TB_EMP_OTHER 

Les données ci-dessus est récupéré comme Cursor(Emp_cursor) et j'ai besoin de construire une requête SQL dynamique ci-dessous à partir des données du curseur.

Résultats escomptés:

SELECT TB_EMP_DTLS.EMP_NM,TB_EMP_DTLS.EMP_Adr,TB_EMP_OTHER.EMP_SAL 
FROM TB_EMP_DTLS,TB_EMP_OTHER 
WHERE TB_EMP_DTLS.EMP_ID=TB_EMP_OTHER.EMP_ID 

Je nai beaucoup travaillé sur des concepts PLSQL/curseur. Comment le curseur peut être bouclé pour obtenir la sortie attendue.

+0

Comment savez-vous quelle colonne à utiliser comme condition de jointure? Pouvez-vous compter sur le nom de la colonne et toujours joindre sur des colonnes avec le même nom? Aussi, s'il vous plaît poster la façon dont votre curseur est cédulé, ouvert, ... afin que les gens peuvent comprendre votre point de départ – Aleksej

Répondre

1

Si je comprends bien, vous voulez colonne1 valeurs choisies parmi tables colonne3 reliées par colonnes colonne2.

Ce n'est pas élégant mais devrait fonctionner:

select listagg(v, ' ') within group (order by n asc) my_cursor from (
    with 
     tb as (select distinct column3 val from tb_emp_temp_table), --tables 
     sl as (select distinct column3||'.'||column1 val from tb_emp_temp_table), --selected columns 
     pr as (select distinct column3||'.'||column2 val from tb_emp_temp_table) --predicates 
    select 1 n, 'SELECT' v from dual 
    union 
    select 2 n, listagg(val, ', ') within group (order by val) v from sl 
    union 
    select 3 n, 'FROM' v from dual 
    union 
    select 4 n, listagg(val, ', ') within group (order by val) v from tb 
    union 
    select 5 n, 'WHERE' v from dual 
    union 
    select 6 n, listagg(pra.val||'='||prb.val, ' AND ') within group (order by pra.val) v from pr pra, pr prb where pra.val != prb.val 
) 
+0

Merci beaucoup :) – Karthik