2017-02-22 79 views
0

我有一個如下所示的動態臨時表。對於假設Oracle:SQL動態遊標語句

表名: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 

上述數據被檢索爲Cursor(Emp_cursor),我需要基於光標數據以如下構造一個動態SQL查詢。

預期輸出:

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 

我還沒有上PLSQL /光標概念廣泛的合作。遊標如何循環以獲得預期的輸出。

+0

你怎麼知道的連接條件要使用的列?你能依賴列名並且總是加入同名的列嗎?另外,請張貼你的光標被打開,打開,...以便人們可以理解你的出發點 – Aleksej

回答

1

如果我的理解對不對,你想從欄3選擇通過COLUMN2列加入COLUMN1值。

這不是優雅,但應該工作:

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

非常感謝:) – Karthik