我有一个oracle 11g数据库,在Windows Server 2008上运行:
Oracle Database 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'
答案 0 :(得分:0)
我知道OP发现了一种解决方法,但实际上在11.2.0.4.0中工作正常。
CREATE TABLE seg_roles
(
aplicacion VARCHAR2(12 BYTE),
rol VARCHAR2(12 BYTE),
usuarios VARCHAR2(255 BYTE)
);
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 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)
);
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 OR REPLACE VIEW vw_rol_user
AS
SELECT DISTINCT aplicacion,
rol,
TRIM(COLUMN_VALUE) usuario
FROM
(SELECT aplicacion, rol, usuarios usuario
FROM seg_roles
WHERE usuarios IS NOT NULL
ORDER BY aplicacion, rol
) t,
XMLTABLE(('"' || Replace(Usuario, ',', '","') || '"'))
ORDER
BY aplicacion, rol, TRIM(COLUMN_VALUE);
CREATE OR REPLACE VIEW 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 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 OR REPLACE VIEW vw_seg_accesos
AS
SELECT vacr.aplicacion, vacr.menu, vacr.tipo, vacr.opcion, vacr.objeto_menu, vacr.acceso, vacr.rol, vusr.usuario
FROM vw_acc_rol vacr,
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
vw_seg_accesos vseg
WHERE
vseg.aplicacion = 'MULTIPLAN'
AND vseg.usuario = 'PATY';
返回11行。我不能做一个SQL小提琴示例,因为我不认为安装了XMLDB(因此关于缺少COLUMNS的ORA-20000错误)所以我希望答案是从11.1升级