首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态Oracle Pivot_In_Clause

动态Oracle Pivot_In_Clause
EN

Database Administration用户
提问于 2013-06-21 06:03:10
回答 2查看 24.7K关注 0票数 3

我有点卡住了。我想做一个用户角色关系枢轴表,到目前为止,我的查询如下所示:

代码语言:javascript
复制
WITH PIVOT_DATA AS (
     SELECT *
     FROM
     (
         SELECT USERNAME, GRANTED_ROLE
         FROM DBA_USERS@DB_LINK U LEFT OUTER JOIN DBA_ROLE_PRIVS@DB_LINK R
         ON U.USERNAME = R.GRANTEE
      )
)
SELECT *
FROM PIVOT_DATA
PIVOT
(
    COUNT(GRANTED_ROLE)
    FOR GRANTED_ROLE
    IN('CONNECT') -- Just an example
)
ORDER BY USERNAME ASC;

它工作得很好,可以完成这项工作,但我不想写任何我想要在pivot_in_clause中搜索的角色,因为我们得到了大量的角色,而且我不想每次都检查是否有任何更改。

那么,有什么方法可以在SELECT中编写pivot_in_clause呢?我自己试过:

代码语言:javascript
复制
[...]
PIVOT
(
    COUNT(GRANTED_ROLE)
    FOR GRANTED_ROLE
    IN( SELECT ROLE FROM DBA_ROLES@DB_LINK )
)
[...]

但是它总是在整个查询的第1行给我一个ORA-00936:“缺失表达式”,我不知道为什么。在SELECT中不能有一个pivot_in_clause,或者我做错了吗?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2013-06-21 10:43:12

如果您想为枢轴实现某种类型的动态列列表,那么您可以考虑使用生成动态SQL的过程。该过程的基本语法是:

代码语言:javascript
复制
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select USERNAME ';

    begin
        for x in (select distinct ROLE from DBA_ROLES@DB_LINK)
        loop
            sql_query := sql_query ||
                ' , sum(case when GRANTED_ROLE = '''||x.Role||''' then 1 else 0 end) as '||x.Role;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' FROM DBA_USERS@DB_LINK U 
                                    LEFT OUTER JOIN DBA_ROLE_PRIVS@DB_LINK R
                                      ON U.USERNAME = R.GRANTEE
                                    GROUP BY USERNAME';
        dbms_output.put_line(sql_query);

        open p_cursor for sql_query;
    end;
/

然后,您可以使用以下方法测试结果:

代码语言:javascript
复制
variable x refcursor
exec dynamic_pivot(:x)
print x;

这将产生类似于以下结果的结果:

代码语言:javascript
复制
+----------+-----+-------+-------+
| Username | DBA | Owner | Admin |
+----------+-----+-------+-------+
| Bob      |   0 |     0 |     1 |
| Jane     |   1 |     1 |     1 |
| Jim      |   1 |     1 |     0 |
+----------+-----+-------+-------+
票数 3
EN

Database Administration用户

发布于 2013-06-21 08:33:31

这可能对您有帮助,也可能无助于您,但是使用PIVOT XML而不是简单的PIVOT,您可以做您想做的事情。

将XML关键字添加到PIVOT运算符允许我们将生成的pivot结果转换为XML格式。它还使支点更加灵活,允许我们用子查询或任意通配符替换硬编码的IN子句。

(来源)

这显然会返回一个XML,这就是为什么它可能无助于您.

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/45016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档