【问题标题】:Oracle: SQL Dynamic cursor statementOracle:SQL 动态游标语句
【发布时间】:2017-07-12 02:01:08
【问题描述】:

我有一个像下面这样的动态临时表。

假设的表名: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/Cursor 概念上进行过广泛的研究。如何循环光标以获得预期的输出。

【问题讨论】:

  • 您如何知道将哪一列用作连接条件?您可以依赖列名并始终加入具有相同名称的列吗?另外,请张贴您的光标被割让、打开、...的方式,以便人们了解您的出发点

标签: sql oracle plsql cursor dynamic-sql


【解决方案1】:

如果我理解正确,您希望从 column3 表中选择 column1 值,这些表由 column2 列连接。

它并不优雅,但应该可以工作:

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
)

【讨论】:

    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 2018-06-01
    • 2014-11-20
    • 1970-01-01
    • 2012-01-10
    • 2013-05-16
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多