PL SQL数据透视表VS自定义Json解决方案

时间:2011-05-10 14:40:36

标签: sql json oracle10g pivot oracle-apex

我正处于我的一个Oracle APEX项目中,我需要针对特定​​应用程序为特定个人实施不同级别的安全性。

首先,我创建了一个笛卡尔,其中包含user表,app表和role表中的信息。

看起来像这样:

SELECT
A.user_id, B.app_id, C.role_id
FROM user A, app B, role C
ORDER BY A.user_id ASC, B.app_id ASC, C.role_id ASC

这允许我返回userapprole的每个组合。没有使用where子句,它返回超过303k行。目前有近500名用户,6个角色和100多个应用程序。

当我从这个视图中为特定用户选择时,它在大约10毫秒内返回,这是可以接受的。

现在,我还有一个存储每个用户的应用程序/角色分配的vw。我已经按照以下方式加入了这张桌子。

SELECT
A.*,
DECODE(B.app_right_id, null, 0, 1) AS user_access 
FROM
            vw_user_app_role A -- My cartesian view
LEFT JOIN   vw_tbl_user_app_role B 
        ON  A.user_id = B.user_id
        AND A.app_id = B.app_id
        AND A.role_id = B.role_id

这将返回一组非常有用的数据,类似于

user_id app_id role_id user_access
50      5      1       0  
50      10     2       1
50      15     3       1
75      5      1       1
75      10     2       0
75      15     3       0

我正在考虑我的下一步应该是什么,如果我应该创建数据的一个数据透视,其中app_id将是行,role_id将是列,而user_access将是“数据”。 “数据”最终将呈现为具有相应行/列标题的网站上的复选框。

我也在考虑使用纯粹的ajax / json解决方案,我将使用pl sql构建json字符串,并将整个字符串返回给客户端以通过jquery进行处理。

我关心第一个选项的难度(我是pl sql的新手,我不确定如何生成在这个版本的oracle(v 10)中使用的数据透视表)和我担心创建一个包含大量数据的整个json字符串的费用。

任何建议都将不胜感激。

修改

我通过以下sql实现了我想要的数据透视表:

SELECT
B.application_nm,
A.user_id,
MAX(DECODE(b.role_name, 'role 1', A.USER_ACCESS, NULL)) "role 1",
MAX(DECODE(b.role_name, 'role 2', A.USER_ACCESS, NULL)) "role 2",
MAX(DECODE(b.role_name, 'role 3', A.USER_ACCESS, NULL)) "role 3",
MAX(DECODE(b.role_name, 'role 4', A.USER_ACCESS, NULL)) "role 4",
MAX(DECODE(b.role_name, 'role 5', A.USER_ACCESS, NULL)) "role 5",
MAX(DECODE(b.role_name, 'role 6', A.USER_ACCESS, NULL)) "role 6"
FROM 
vw_user_app_access A LEFT JOIN vw_tbl_app B ON A.app_id = B.app_id
LEFT JOIN vw_tbl_roles C ON A.role_id = C.role_id
GROUP BY B.application_name, A.user_id
ORDER BY A.user_id DESC

唯一的问题是,将来我们必须添加'角色7'。我必须回到此查询并添加行MAX(DECODE(b.role_name, 'role 7', A.USER_ACCESS, NULL)) "role 7"

提前考虑,这可能会给您带来不便,但考虑到APEX的框架,我必须以任何方式进入报告,以便手动更新我认为的列数。

我认为这可能是目前“最好的”解决方案,除非有人有任何其他建议......

1 个答案:

答案 0 :(得分:2)

基于动态SQL查询的Apex报表区域可能会在查询更改时返回不同数量的列。我已经设置了一个简单的演示on apex.oracle.com。在“列”表格形式中键入新列名称,然后按“添加行”,并使用该名称的额外列重新绘制Matrix报告。

你必须:

  1. 将报告基于一个函数,该函数返回要作为字符串运行的SQL
  2. 选择区域属性“使用通用列名称(仅在运行时解析查询)”
  3. 将报告标题类型设置为PL / SQL,然后使用函数将所需的列标题动态返回为以冒号分隔的列表。请注意,这可能与列名称不同,尽管我的示例对两者都使用相同的文本。
  4. 如果我的例子不够清楚,我会在以后添加更多信息 - 我现在没时间了。