【问题标题】:Dynamic SQL Query in Oracle 10gOracle 10g 中的动态 SQL 查询
【发布时间】:2013-07-26 13:18:16
【问题描述】:

下午,

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

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

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

我一直在 Internet 上搜索以查看我可以根据主机名或 user_ID 使用的动态语句,但我没有找到任何简单地循环遍历我的数据然后生成此 piviot 样式视图的内容。

我一直在看'Cursors',但我认为我差得很远。

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

【问题讨论】:

    标签: oracle oracle10g oracle-sqldeveloper


    【解决方案1】:

    当您提出 oracle 问题时,请务必注意版本。在您的情况下 - 如果您有 11g,您可以查看 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,您都必须查询不同的值。

    没有测试过 - 我现在没有我的预言机。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多