Oracle 10g中的动态SQL查询

时间:2013-07-26 13:18:17

标签: oracle oracle10g oracle-sqldeveloper

下午全部,

我是Oracle和SQL的新手,但我查询了我创建的以下代码。我目前正在使用Oracle 10g。我只是想知道是否有人可以帮助我使这个代码动态而不是硬编码。

我只是查看一个记录用户活动的表的代码。然后,我基本上计算了每个用户/ PC的记录数,并在数据透视表样式表中显示。

这不是一个非常困难的查询,但我可能需要输入约30个左右的PC,这种硬编码方法绝对不是完成此任务的最佳方法。

我一直在互联网上搜索我可以根据主机名或user_ID使用的动态语句,但我还没有设法找到任何简单地遍历我的数据然后生成这种关键风格的视图。

我一直在关注'游标',但我认为远远不够。

Ant提前帮助很多。

此致 贝蒂

SELECT USER_ID,
    SUM(CASE WHEN host LIKE 'PC1' THEN 1 ELSE 0 END) AS PC1,
    SUM(CASE WHEN host LIKE 'PC2' THEN 1 ELSE 0 END) AS PC2,
    SUM(CASE WHEN host LIKE 'PC3' THEN 1 ELSE 0 END) AS PC3,
    SUM(CASE WHEN host IS NOT NULL THEN 1 ELSE 0 END) AS grand_total
FROM table_Name
GROUP BY USER_ID

1 个答案:

答案 0 :(得分:1)

当你提出一个oracle问题时,重要的是要注意发布。在你的情况下 - 如果你有11克,你可以查看pivot函数。

在10G(以及11g)中你可以尝试类似的东西

create or replace function get_pivot() 
return sys_refcursor
as
    stmt varchar2(32000);
    c sys_Refcursor;
    cursor c_values as 
        select distinct host from table_name;
begin
    stmt := 'select user_id , ';

    for x in c_values loop
        stmt := stmt || ' sum(case when host = '''||x.host||''' then 1 else 0 end) as ' ||host|| ',';
    end loop;

    stmt := stmt || ' count(host) as grand_total from table_name group by user_id';

    open c for stmt;
    return(c);
end get_pivot;

您是否正在使用枢轴或动态sql来查询不同的值。

没有测试过它 - 我现在没有我的神谕。