【发布时间】:2017-04-16 20:51:44
【问题描述】:
我有一个 oracle 11g 数据库,在 Windows Server 2008 上运行:
Oracle 数据库 11g 企业版 11.1.0.6.0 版 - 生产
我有两个表和三个视图:
CREATE TABLE UTILS.SEG_ROLES
(
APLICACION VARCHAR2(12 BYTE),
ROL VARCHAR2(12 BYTE),
USUARIOS VARCHAR2(255 BYTE)
)
SET DEFINE OFF;
Insert into SEG_ROLES (APLICACION, ROL, USUARIOS) Values ('MULTIPLAN', 'ADMIN', 'ADMIN');
Insert into SEG_ROLES (APLICACION, ROL, USUARIOS) Values ('MULTIPLAN', 'CAR01', 'PATY ');
Insert into SEG_ROLES (APLICACION, ROL, USUARIOS) Values ('MULTIPLAN', 'CAR02', 'FABIOLA, ERIKA');
Insert into SEG_ROLES (APLICACION, ROL, USUARIOS) Values ('MULTIPLAN', 'CON01', 'LUCY, PATY');
Insert into SEG_ROLES (APLICACION, ROL, USUARIOS) Values ('MULTIPLAN', 'CON02', 'VALERIA');
COMMIT;
CREATE TABLE UTILS.SEG_ACCESOS
(
APLICACION VARCHAR2(12 BYTE),
ADMROL VARCHAR2(12 BYTE),
MENU VARCHAR2(20 BYTE),
OPCION VARCHAR2(20 BYTE),
TIPO VARCHAR2(5 BYTE),
OBJETO_MENU VARCHAR2(40 BYTE),
ACCESO VARCHAR2(2 BYTE),
ROLES_ACCESOS VARCHAR2(255 BYTE)
)
SET DEFINE OFF;
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'COLOCA', NULL, 'M', 'm_coloca', 'S', 'CAR01, CAR02');
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'COLOCA', 'PREVALIDA', 'SM', 'sm_prevalida', 'S', 'CAR01, CAR02');
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'COLOCA', 'PRECOLOCA', 'SM', 'sm_preColocacion', 'S', 'CAR01, CAR02');
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'COLOCA', 'COLOCACION', 'SM', 'sm_colocacion', 'S', 'CAR01');
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'COLOCA', 'REGCOLOCA', 'SM', 'sm_regcoloca', 'S', 'CAR01');
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'PLD', NULL, 'M', 'm_PLD', 'S', 'CAR01, CAR02, CON01, CON02');
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'PLD', 'LN_CONSULTA', 'SM', 'sm_PLD_LNConsulta', 'S', 'CAR01, CAR02');
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'PLD', 'LN_BARRIDOMASIVO', 'SM', 'sm_PLD_LNBarridoMasivo', 'S', 'CAR01');
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'PLD', 'REP_INICICLO', 'SM', 'sm_PLD_ReporIniciclo', 'S', 'CON01, CON02');
Insert into SEG_ACCESOS (APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS)
Values ('MULTIPLAN', 'ADMIN', 'PLD', 'LN_BITACORA', 'SM', 'sm_PLD_LNBitacora', 'S', 'CON01');
COMMIT;
--- 并提出了这样的意见:
CREATE VIEW UTILS.VW_ROL_USER AS
select distinct APLICACION, ROL, trim(column_value) USUARIO
from ( SELECT APLICACION, ROL, USUARIOS USUARIO
FROM UTILS.SEG_ROLES
WHERE USUARIOS IS NOT NULL
ORDER BY APLICACION, ROL
) t,
xmltable(('"' || replace(USUARIO, ',', '","') || '"'))
order by APLICACION, ROL, trim(column_value)
CREATE VIEW UTILS.VW_ACC_ROL AS
select distinct APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, trim(column_value) ROL
from ( SELECT APLICACION, ADMROL, MENU, OPCION, TIPO, OBJETO_MENU, ACCESO, ROLES_ACCESOS ROL
FROM UTILS.SEG_ACCESOS
WHERE ROLES_ACCESOS IS NOT NULL
ORDER BY APLICACION, ADMROL, MENU, OPCION
) t,
xmltable(('"' || replace(ROL, ',', '","') || '"'))
order by APLICACION, MENU, TIPO, OPCION, trim(column_value)
CREATE VIEW UTILS.VW_SEG_ACCESOS AS
SELECT VACR.APLICACION, VACR.MENU, VACR.TIPO, VACR.OPCION, VACR.OBJETO_MENU, VACR.ACCESO, VACR.ROL, VUSR.USUARIO
FROM UTILS.VW_ACC_ROL VACR,
UTILS.VW_ROL_USER VUSR
WHERE VACR.ROL = VUSR.ROL
ORDER BY VACR.APLICACION, VACR.ROL, VACR.MENU, VUSR.USUARIO, VACR.TIPO, VACR.OPCION
当我查询最后一个视图时,它工作正常:
SELECT VSEG.* FROM UTILS.VW_SEG_ACCESOS VSEG
但是当我添加条件时:
SELECT VSEG.* FROM UTILS.VW_SEG_ACCESOS VSEG
WHERE VSEG.APLICACION = 'MULTIPLAN'
AND VSEG.USUARIO = 'PATY'
会引发此错误:
**ORA-22813: Operand value exceeds system limits**
Cause: Object or Collection value was too large. The size of the value might have exceeded 30k in a SORT context, or the size might be too big for available memory.
Action: Choose another value and retry the operation.
即使只是查询一个简单的视图也会引发错误:
SELECT * FROM UTILS.VW_ROL_USER WHERE USUARIO = 'PATY'
【问题讨论】:
-
有一些 Oracle 错误会引发此错误。你可能不得不去挖掘补丁。 dba-oracle.com/…
-
视图是否按所示为您编译?在 10gR2 中,xmltable() 调用得到“ORA-19102:XQuery string literal expected”,而在 11gR2 中,它们得到“ORA-02000:缺少 COLUMNS 关键字”。我没有 11gR1 实例来尝试这个。如果这是您正在运行的内容,您是否会得到一个完整的错误堆栈,该堆栈会引用您视图中的这些子句之一?
-
感谢 Alex,视图编译正常...如何获得完整的错误堆栈?
-
嗯,如果它没有在那个普通的 SQL 查询中为您提供完整的堆栈,那么您可以尝试在 PL/SQL 块内查询 - 使用 select into 或 as cursor - 看看是否给出您的更多信息;它可能不是。当然,您的
ROLES_ACCESOS列中不应该有多个值,但是如果您坚持使用它,还有其他方法可以将其拆分为单独的值,我想。您能否添加您对PATY的期望输出,可能是从有效的未过滤版本中删除? -
谢谢亚历克斯,我添加了一张图片,你的权利,我只想要一个可查询的视图,如图所示。
标签: oracle11g