使用动态列引用游标

时间:2012-02-27 14:14:50

标签: oracle11g

我正在使用oracle 11g并编写了一个存储过程,它将值存储在临时表中,如下所示:

 id    count   hour   age   range
-------------------------------------
0       5       10     61     10-200
1       6       20     61     10-200
2       7       15     61     10-200  
5       9       5      61     201-300
7       10      25     61     201-300
0       5       10     62     10-20
1       6       20     62     10-20
2       7       15     62     10-20  
5       9       5      62     21-30
1       8       6      62     21-30
7       10      25     62     21-30
10      15      30     62     31-40

现在使用这个临时表我想返回两个游标。一个用于61,一个用于62(年龄)。 对于游标,不同的范围将是列。例如,年龄62的游标应该作为数据集返回。

user      10-20       21-30       31-40
         Count/hour  count/hour  count/hour
----------------------------------------------
0         5     10      -   -      -    -     
1         6     20      8   6      -    -    
2         7     15      -   -      -    -       
5         -      -      9   5      -    -         
7         -      -      10  25     -    -       
10        -      -      -   -      15   30          

临时表中的此列范围不是固定值,这些值是从其他表引用的。

编辑:我正在使用PIVOT来解决上述问题,我在互联网上看到的所有例子都是列值的固定值(在我的情况下是范围)。我怎样才能获得动态价值。以下是ex查询:

SELECT *
FROM   (SELECT column_2, column_1
    FROM   test_table)
PIVOT  (SUM(column1) AS sum_values FOR (column_2) IN ('value1' AS a, 'value2' AS b, 'value3' AS c));

我没有使用手写值,而是在'IN'

中使用以下查询
SELECT * from(
with x as (
  SELECT DISTINCT range 
          FROM test_table
         WHERE age = 62 )
select ltrim( max( sys_connect_by_path(range, ','))
                keep (dense_rank last order by curr),
              ',') range
  from (select range,
               row_number() over (order by range) as curr,
               row_number() over (order by range) -1 as prev
          from x)
connect by prev = PRIOR curr
  start with curr = 1 )

在这种情况下给出了错误。但是当我使用手写值时,它会给出正确的输出。

select * from (select user_id, nvl(count,0) count, nvl(hour,0) hour,nvl(range,0) range,nvl(age,0) 
age from test_table)
  PIVOT (SUM(count) as sum_count, sum(hour) as sum_hour for (range) IN 
(

'10-20','21-30','31-40' 
 )
) where age = 62 order by userid

我怎样才能动态给出值? 我怎么能这样做。

1 个答案:

答案 0 :(得分:2)

游标很慢,我建议尝试在查询中执行此操作,除非没有其他选择(或速度无关紧要)。您可能需要查看:PIVOT / UNPIVOT可以旋转列(在本例中为“范围”)。

这里有一些PIVOT / UNPIVOT文件和例子:
http://www.oracle-developer.net/display.php?id=506

根据您的上次修改:

很确定你有两个选择:

  1. 根据“范围”列中的不同值构建动态sql。

    你可能会再次使用游标来构建列名,但至少它只限于不同的范围。

  2. Oracle有一个PIVOT XML命令可供您使用。

    请参阅:http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html

    然后向下滚动到“XML Type”

  3. 部分