任何人都可以帮助我使用 PIPELINED 功能吗?
Can anyone help me with a PIPELINED function?
我正在Oracle 12c中开发一个函数,它从几个表中获取数据并且return是一个header行并且在每个header之后是与其相关的值列表.
更好地解释一下,我有几个地方或城市,其中有电力消费者,根据他们对电力的使用和他们的消耗量(千瓦时)来确定类别。
该函数必须 return header 行中的每个城镇(加上标题),然后对该城镇的每个类别进行分组;每个城市依此类推。
我想我会用两 (2) 个光标来解决这个问题,一个按位置分组,另一个在第一个光标内部按类别分组。
当我编译时没有出现错误,但在执行时,Oracle 警告我这个错误:
ORA-06502: PL / SQL: error: numeric or value string buffer too small
ORA-06512: in "CEMDO_DB.XXLOCALIDADPORCATEGORIA1", line 87
ORA-06512:in "CEMDO_DB.XXLOCALIDADPORCATEGORIA1", line 87
- 00000 - "PL / SQL: numeric or value error% s"
- Cause: An arithmetic, numeric, string, conversion, or constraint error
occurred. For example, this error occurs if an attempt is made to
assign the value NULL to a variable declared NOT NULL, or if an
attempt is made to assign an integer larger than 99 to a variable
declared NUMBER (2).
- Action: Change the data, how it is manipulated, or how it is declared so
that values do not violate constraints.*
它没有说明原因,因为我对值类型或变量容量没有问题。我在错误行上唯一拥有的是 PIPE ROW。
在函数的Debug中,报错信息如下:
ORA-06550: line 10, column 3:
PL / SQL: ORA-00904: "XXLXC1_ROW": invalid identifier
ORA-06550: line 9, column 5:
PL / SQL: SQL Statement ignored
这里的错误是明确的,但我找不到解决它的方法,因为 PIPE ROW xxLxC1 类型已声明并且存在于架构中 objects.
很抱歉给您带来不便,但这是我为 Oracle 编写的第三个特性,因为我已经使用 Informix 20 年了。
以后谢谢大家的关注
我复制了函数的代码:
CREATE OR REPLACE FUNCTION xxLocalidadPorCategoria1( pAnio NUMBER, pNroPer NUMBER ) RETURN xxLxC1_tab PIPELINED IS
CURSOR curLoc IS
SELECT cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion Localidad
FROM Cbtes_Coop cc, Cbtes_Cptos ccp, Suministros s, SubFincas sf, Fincas f, Categorias cat,
Localidades l -----, OUTER( Sim_Cbtes sc, OUTER( Categorias cat, Suministros s, Localidades l ))
WHERE cc.Anio = pAnio
AND cc.NroPer = pNroPer
AND cc.Estado != 'X'
AND cc.IdTipo_Srv = 1
----AND cc.IdSuministro = 1078 ----Agregada para control
AND cc.IdEmpresa = ccp.IdEmpresa
AND cc.IdSucursal = ccp.IdSucursal
AND cc.Tipo_Cbte = ccp.Tipo_Cbte
AND cc.Grupo_Cbte = ccp.Grupo_Cbte
AND cc.Letra_Cbte = ccp.Letra_Cbte
AND cc.NroCbte = ccp.NroCbte
AND ccp.IdConcepto IN ( SELECT IdConcepto FROM Conceptos WHERE IdTipo_Srv = 1 )
AND NOT EXISTS ( SELECT IdEmpresa
FROM Cbtes_Coop
WHERE IdCbte_Padre = cc.IdCbte
AND IdSucursal IN ( 4, 47, 48 )
AND Tipo_Cbte = 'NC'
AND IdTipo_ModoFac > 0
AND Estado != 'X'
AND ABS( Totalimp ) = ABS( cc.Totalimp ))
AND cc.IdSuministro = s.IdSuministro
AND s.IdSubFinca = sf.IdSubFinca
AND sf.IdFinca = f.IdFinca
AND f.IdLocalidad = l.IdLocalidad
AND cc.IdTipo_Srv = cat.IdTipo_Srv
AND cc.IdCategoria = cat.IdCategoria
GROUP BY cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion
ORDER BY 1;
CURSOR curTemp (pIdLocalidad NUMBER) IS
SELECT cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion Localidad, SUM( CASE WHEN
ccp.IdConcepto = 5 THEN 1 END ) Cargo_Fijo, SUM( CASE WHEN ccp.IdConcepto = 5 THEN ccp.Importe
END ) Importe_C_Fijo, SUM( CASE WHEN ccp.IdConcepto = 10 THEN ROUND( ccp.Unidades, 2 ) END ) kWh,
SUM( CASE WHEN ccp.IdConcepto = 10 THEN ccp.Importe END ) Importe_Consumo, SUM( CASE WHEN
ccp.IdConcepto IN( 35, 38 ) THEN 1 END) Cargo_Fijo_GC, SUM( CASE WHEN ccp.IdConcepto IN( 35, 38 )
THEN ccp.Importe END ) Imp_C_Fijo_GC, SUM( CASE WHEN ccp.IdConcepto IN( 30, 31, 32 ) THEN ROUND(
ccp.Unidades, 2 ) END ) Energia_GC, SUM( CASE WHEN ccp.IdConcepto IN( 30, 31, 32 ) THEN
ccp.Importe END ) Importe_GC, SUM( CASE WHEN ccp.IdConcepto IN( 40, 41 ) THEN ROUND(
ccp.Unidades, 2 ) END ) Unidades_Demanda, SUM( CASE WHEN ccp.IdConcepto IN( 40, 41 ) THEN
ccp.Importe END ) Importe_Demanda, SUM( CASE WHEN ccp.IdConcepto IN( 101, 109 ) THEN 1 END )
Cant_BEN, SUM( CASE WHEN ccp.IdConcepto IN( 101, 109 ) THEN ccp.Importe END ) BEN, SUM( CASE WHEN
ccp.IdConcepto = 62 AND ccp.Importe != 0 THEN 1 END ) Ajuste_Coseno, SUM(CASE WHEN ccp.IdConcepto
= 62 AND ccp.Importe != 0 THEN ccp.Importe END ) Imp_Ajuste_Coseno, SUM(CASE WHEN ccp.IdConcepto
IN ( 25, 26, 27, 29, 291,292, 293, 294, 295 ) THEN 1 END )
Cant_Cargos_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 25, 26, 27, 29, 291,292, 293, 294, 295 )
THEN ccp.Importe END ) Imp_Cargos_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 20, 21, 23, 24, 64,
100, 432, 433, 434 ) THEN 1 END ) Cant_Ajustes_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 20, 21,
23, 24, 64, 100, 432, 433, 434 ) THEN ccp.Importe END ) Imp_Ajustes_Ersep, SUM( CASE WHEN
ccp.IdConcepto IN( 28, 97, 98 ) AND ccp.IdSubConcepto IN( 0,1,2,3 ) THEN 1 END ) Unid_Bonif_Exc,
SUM( CASE WHEN ccp.IdConcepto IN( 28, 97, 98 ) AND ccp.IdSubConcepto IN( 0,1,2,3 ) THEN
ccp.Importe END ) Imp_Bonif_Exc, SUM( CASE WHEN ccp.IdConcepto IN( 438, 439 ) AND
ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Reajustes, SUM( CASE WHEN
ccp.IdConcepto IN( 438, 439 ) AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Reajustes, SUM(
CASE WHEN ccp.IdConcepto = 58 AND ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Coie, SUM( CASE WHEN
ccp.IdConcepto = 58 AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Coie, SUM( CASE WHEN
ccp.IdConcepto = 296 AND ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Coie_Dem, SUM( CASE WHEN
ccp.IdConcepto = 296 AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Coie_Dem, SUM( CASE WHEN
ccp.IdConcepto = 103 AND ccp.Importe < 0 THEN 1 END ) Unid_TRA1, SUM( CASE WHEN ccp.IdConcepto =
103 AND ccp.Importe < 0 THEN ccp.Importe END ) Imp_TRA1, SUM( CASE WHEN ccp.IdConcepto = 104 AND
ccp.Importe < 0 THEN 1 END ) Unid_TRA2, SUM( CASE WHEN ccp.IdConcepto = 104 AND ccp.Importe < 0
THEN ccp.Importe END ) Imp_TRA2, SUM( CASE WHEN ccp.IdConcepto = 102 AND ccp.Importe < 0 THEN 1
END ) Unid_TSCA, SUM( CASE WHEN ccp.IdConcepto = 102 AND ccp.Importe < 0 THEN ccp.Importe END )
Imp_TSCA, SUM( CASE WHEN ccp.IdConcepto = 105 AND ccp.Importe < 0 THEN 1 END ) Unid_TSSA, SUM(
CASE WHEN ccp.IdConcepto = 105 AND ccp.Importe < 0 THEN ccp.Importe END ) Imp_TSSA, SUM( CASE WHEN
ccp.IdConcepto = 443 AND ccp.Importe < 0 THEN 1 END ) UnidBonifCemdo, SUM( CASE WHEN
ccp.IdConcepto = 443 AND ccp.Importe < 0 THEN ccp.Importe END ) ImpBonifCemdo, SUM( CASE WHEN
ccp.IdConcepto = 121 AND ccp.Importe < 0 THEN 1 END ) UnidTSPC, SUM( CASE WHEN ccp.IdConcepto =
121 AND ccp.Importe < 0 THEN ccp.Importe END ) ImpTSPC, SUM( CASE WHEN ccp.IdConcepto = 122 AND
ccp.Importe < 0 THEN 1 END ) UnidTSPI, SUM( CASE WHEN ccp.IdConcepto = 122 AND ccp.Importe < 0
THEN ccp.Importe END ) ImpTSPI
FROM Cbtes_Coop cc, Cbtes_Cptos ccp, Suministros s, SubFincas sf, Fincas f, Categorias cat,
Localidades l
WHERE cc.Anio = pAnio
AND cc.NroPer = pNroPer
AND cc.Estado != 'X'
AND cc.IdTipo_Srv = 1
----AND cc.IdSuministro = 1078 ----Agregada para control
AND cc.IdEmpresa = ccp.IdEmpresa
AND cc.IdSucursal = ccp.IdSucursal
AND cc.Tipo_Cbte = ccp.Tipo_Cbte
AND cc.Grupo_Cbte = ccp.Grupo_Cbte
AND cc.Letra_Cbte = ccp.Letra_Cbte
AND cc.NroCbte = ccp.NroCbte
AND ccp.IdConcepto IN ( SELECT IdConcepto FROM Conceptos WHERE IdTipo_Srv = 1 )
AND NOT EXISTS ( SELECT IdEmpresa
FROM Cbtes_Coop
WHERE IdCbte_Padre = cc.IdCbte
AND IdSucursal IN ( 4, 47, 48 )
AND Tipo_Cbte = 'NC'
AND IdTipo_ModoFac > 0
AND Estado != 'X'
AND ABS( Totalimp ) = ABS( cc.Totalimp ))
AND cc.IdSuministro = s.IdSuministro
AND s.IdSubFinca = sf.IdSubFinca
AND sf.IdFinca = f.IdFinca
AND f.IdLocalidad = l.IdLocalidad
AND cc.IdTipo_Srv = cat.IdTipo_Srv
AND cc.IdCategoria = cat.IdCategoria
AND f.IdLocalidad = pIdLocalidad
GROUP BY f.IdLocalidad, l.Descripcion, cc.IdCategoria, cat.Descripcion
/*GROUPING SETS((f.IdLocalidad, l.Descripcion, cc.IdCategoria, cat.Descripcion))*/
ORDER BY f.IdLocalidad, cc.IdCategoria;
BEGIN
FOR regLoc IN curLoc LOOP
PIPE ROW (xxLxC1_row( TO_CHAR(regLoc.IdLocalidad) || '-' || regLoc.Localidad, 'Cargo Fijo',
'Imp. Cargo Fijo', 'Consumo', 'Imp. Consumo', 'C. Fijo GC', 'Imp. C. Fijo GC', 'Consumo GC', 'Imp.
Consumo GC', 'Unid. Demanda', 'Imp. Demanda', 'Bonificaciones', 'Imp. Bonificaciones', 'Coseno PHI',
'Imp. Coseno PHI', 'Cargos ERSeP', 'Imp. Cargos ERSeP',
'Ajustes ERSeP', 'Imp. Ajustes ERSeP', 'Unid. Bonif. Exc', 'Imp. Bonif. Exc.', 'Unid. Reajustes',
'Imp. Reajustes', 'Unid. COIE', 'Imp. COIE', 'Unid. COIE Dem.', 'Imp. COIE Dem', 'Unid. TRA1', 'Imp.
TRA1', 'Unid. TRA2', 'Imp. TRA2', 'Unid. TSCA', 'Imp. TSCA', 'Unid. TSSA', 'Imp. TSSA', 'Unid. Bonif.
Cemdo', 'Imp. Bonif. Cemdo', 'Unid. TSPC', 'Imp. TSPC', 'Unid. TSPI', 'Imp. TSPI'));
FOR regTemp IN curTemp(regLoc.IdLocalidad) LOOP
DBMS_OUTPUT.PUT_LINE(regLoc.IdLocalidad);
PIPE ROW (xxLxC1_row(regTemp.IdCategoria || '-' || regTemp.Descripcion, regTemp.Cargo_Fijo,
regTemp.Importe_C_Fijo, regTemp.kWh, regTemp.Importe_Consumo, regTemp.Cargo_Fijo_GC,
regTemp.Imp_C_Fijo_GC, regTemp.Energia_GC, regTemp.Importe_GC, regTemp.Unidades_Demanda,
regTemp.Importe_Demanda, regTemp.Cant_BEN, regTemp.BEN, regTemp.Ajuste_Coseno,
regTemp.Imp_Ajuste_Coseno, regTemp.Cant_Cargos_Ersep, regTemp.Imp_Cargos_Ersep,
regTemp.Cant_Ajustes_Ersep, regTemp.Imp_Ajustes_Ersep, regTemp.Unid_Bonif_Exc,
regTemp.Imp_Bonif_Exc, regTemp.Unid_Reajustes, regTemp.Imp_Reajustes, regTemp.Unid_Coie,
regTemp.Imp_Coie, regTemp.Unid_Coie_Dem, regTemp.Imp_Coie_Dem, regTemp.Unid_TRA1,
regTemp.Imp_TRA1, regTemp.Unid_TRA2, regTemp.Imp_TRA2, regTemp.Unid_TSCA, regTemp.Imp_TSCA,
regTemp.Unid_TSSA, regTemp.Imp_TSSA, regTemp.UnidBonifCemdo, regTemp.ImpBonifCemdo,
regTemp.UnidTSPC, regTemp.ImpTSPC, regTemp.UnidTSPI, regTemp.ImpTSPI));
END LOOP;
END LOOP;
END;
/
以及PIPE ROW和VIRTUAL的代码TABLE:
CREATE OR REPLACE TYPE xxLxC1_row AS OBJECT (c1 Varchar2(50), c2 Varchar2(20), c3 Varchar2(20), c4 Varchar2(20), c5 Varchar2(20), c6 Varchar2(20), c7 Varchar2(20), c8 Varchar2(20), c9 Varchar2(20), c10 Varchar2(20), c11 Varchar2(20), c12 Varchar2(20), c13 Varchar2(20), c14 Varchar2(20), c15 Varchar2(20), c16 Varchar2(20), c17 Varchar2(20), c18 Varchar2(20), c19 Varchar2(20), c20 Varchar2(20), c21 Varchar2(20), c22 Varchar2(20), c23 Varchar2(20), c24 Varchar2(20), c25 Varchar2(20), c26 Varchar2(20), c27 Varchar2(20), c28 Varchar2(20), c29 Varchar2(20), c30 Varchar2(20), c31 Varchar2(20), c32 Varchar2(20), c33 Varchar2(20), c34 Varchar2(20), c35 Varchar2(20), c36 Varchar2(20), c37 Varchar2(20), c38 Varchar2(20), c39 Varchar2(20), c40 Varchar2(20), c41 Varchar2(20));
/
CREATE OR REPLACE TYPE xxLxC1_tab AS TABLE OF xxLxC1_row;
/
您的对象类型的每个元素都是 VARCHAR2(20),因此您输出的其中一个值很可能大于 20 个字节。
对于第一个竖线行,假设您要输出的所有值都是常量并且这些常量少于 20 个字符,那么唯一可能出错的是
TO_CHAR(regLoc.IdLocalidad) || '-' || regLoc.Localidad
超过 20 个字符。但是,对于第二个管道行,这些值中的每一个都来自游标提取,因此这些值中的任何一个都可能是罪魁祸首。
循环数据的一种简单方法是稍微更改您的函数以暂时成为非流水线函数,然后循环数据并执行对象分配以检查,即
CREATE OR REPLACE FUNCTION xxLocalidadPorCategoria1( pAnio NUMBER, pNroPer NUMBER ) RETURN number IS
my_row xxLxC1_row;
CURSOR curLoc IS
SELECT cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion Localidad
FROM Cbtes_Coop cc, Cbtes_Cptos ccp, Suministros s, SubFincas sf, Fincas f, Categorias cat,
Localidades l -----, OUTER( Sim_Cbtes sc, OUTER( Categorias cat, Suministros s, Localidades l ))
WHERE cc.Anio = pAnio
AND cc.NroPer = pNroPer
AND cc.Estado != 'X'
AND cc.IdTipo_Srv = 1
----AND cc.IdSuministro = 1078 ----Agregada para control
AND cc.IdEmpresa = ccp.IdEmpresa
AND cc.IdSucursal = ccp.IdSucursal
AND cc.Tipo_Cbte = ccp.Tipo_Cbte
AND cc.Grupo_Cbte = ccp.Grupo_Cbte
AND cc.Letra_Cbte = ccp.Letra_Cbte
AND cc.NroCbte = ccp.NroCbte
AND ccp.IdConcepto IN ( SELECT IdConcepto FROM Conceptos WHERE IdTipo_Srv = 1 )
AND NOT EXISTS ( SELECT IdEmpresa
FROM Cbtes_Coop
WHERE IdCbte_Padre = cc.IdCbte
AND IdSucursal IN ( 4, 47, 48 )
AND Tipo_Cbte = 'NC'
AND IdTipo_ModoFac > 0
AND Estado != 'X'
AND ABS( Totalimp ) = ABS( cc.Totalimp ))
AND cc.IdSuministro = s.IdSuministro
AND s.IdSubFinca = sf.IdSubFinca
AND sf.IdFinca = f.IdFinca
AND f.IdLocalidad = l.IdLocalidad
AND cc.IdTipo_Srv = cat.IdTipo_Srv
AND cc.IdCategoria = cat.IdCategoria
GROUP BY cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion
ORDER BY 1;
CURSOR curTemp (pIdLocalidad NUMBER) IS
SELECT cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion Localidad, SUM( CASE WHEN
ccp.IdConcepto = 5 THEN 1 END ) Cargo_Fijo, SUM( CASE WHEN ccp.IdConcepto = 5 THEN ccp.Importe
END ) Importe_C_Fijo, SUM( CASE WHEN ccp.IdConcepto = 10 THEN ROUND( ccp.Unidades, 2 ) END ) kWh,
SUM( CASE WHEN ccp.IdConcepto = 10 THEN ccp.Importe END ) Importe_Consumo, SUM( CASE WHEN
ccp.IdConcepto IN( 35, 38 ) THEN 1 END) Cargo_Fijo_GC, SUM( CASE WHEN ccp.IdConcepto IN( 35, 38 )
THEN ccp.Importe END ) Imp_C_Fijo_GC, SUM( CASE WHEN ccp.IdConcepto IN( 30, 31, 32 ) THEN ROUND(
ccp.Unidades, 2 ) END ) Energia_GC, SUM( CASE WHEN ccp.IdConcepto IN( 30, 31, 32 ) THEN
ccp.Importe END ) Importe_GC, SUM( CASE WHEN ccp.IdConcepto IN( 40, 41 ) THEN ROUND(
ccp.Unidades, 2 ) END ) Unidades_Demanda, SUM( CASE WHEN ccp.IdConcepto IN( 40, 41 ) THEN
ccp.Importe END ) Importe_Demanda, SUM( CASE WHEN ccp.IdConcepto IN( 101, 109 ) THEN 1 END )
Cant_BEN, SUM( CASE WHEN ccp.IdConcepto IN( 101, 109 ) THEN ccp.Importe END ) BEN, SUM( CASE WHEN
ccp.IdConcepto = 62 AND ccp.Importe != 0 THEN 1 END ) Ajuste_Coseno, SUM(CASE WHEN ccp.IdConcepto
= 62 AND ccp.Importe != 0 THEN ccp.Importe END ) Imp_Ajuste_Coseno, SUM(CASE WHEN ccp.IdConcepto
IN ( 25, 26, 27, 29, 291,292, 293, 294, 295 ) THEN 1 END )
Cant_Cargos_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 25, 26, 27, 29, 291,292, 293, 294, 295 )
THEN ccp.Importe END ) Imp_Cargos_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 20, 21, 23, 24, 64,
100, 432, 433, 434 ) THEN 1 END ) Cant_Ajustes_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 20, 21,
23, 24, 64, 100, 432, 433, 434 ) THEN ccp.Importe END ) Imp_Ajustes_Ersep, SUM( CASE WHEN
ccp.IdConcepto IN( 28, 97, 98 ) AND ccp.IdSubConcepto IN( 0,1,2,3 ) THEN 1 END ) Unid_Bonif_Exc,
SUM( CASE WHEN ccp.IdConcepto IN( 28, 97, 98 ) AND ccp.IdSubConcepto IN( 0,1,2,3 ) THEN
ccp.Importe END ) Imp_Bonif_Exc, SUM( CASE WHEN ccp.IdConcepto IN( 438, 439 ) AND
ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Reajustes, SUM( CASE WHEN
ccp.IdConcepto IN( 438, 439 ) AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Reajustes, SUM(
CASE WHEN ccp.IdConcepto = 58 AND ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Coie, SUM( CASE WHEN
ccp.IdConcepto = 58 AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Coie, SUM( CASE WHEN
ccp.IdConcepto = 296 AND ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Coie_Dem, SUM( CASE WHEN
ccp.IdConcepto = 296 AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Coie_Dem, SUM( CASE WHEN
ccp.IdConcepto = 103 AND ccp.Importe < 0 THEN 1 END ) Unid_TRA1, SUM( CASE WHEN ccp.IdConcepto =
103 AND ccp.Importe < 0 THEN ccp.Importe END ) Imp_TRA1, SUM( CASE WHEN ccp.IdConcepto = 104 AND
ccp.Importe < 0 THEN 1 END ) Unid_TRA2, SUM( CASE WHEN ccp.IdConcepto = 104 AND ccp.Importe < 0
THEN ccp.Importe END ) Imp_TRA2, SUM( CASE WHEN ccp.IdConcepto = 102 AND ccp.Importe < 0 THEN 1
END ) Unid_TSCA, SUM( CASE WHEN ccp.IdConcepto = 102 AND ccp.Importe < 0 THEN ccp.Importe END )
Imp_TSCA, SUM( CASE WHEN ccp.IdConcepto = 105 AND ccp.Importe < 0 THEN 1 END ) Unid_TSSA, SUM(
CASE WHEN ccp.IdConcepto = 105 AND ccp.Importe < 0 THEN ccp.Importe END ) Imp_TSSA, SUM( CASE WHEN
ccp.IdConcepto = 443 AND ccp.Importe < 0 THEN 1 END ) UnidBonifCemdo, SUM( CASE WHEN
ccp.IdConcepto = 443 AND ccp.Importe < 0 THEN ccp.Importe END ) ImpBonifCemdo, SUM( CASE WHEN
ccp.IdConcepto = 121 AND ccp.Importe < 0 THEN 1 END ) UnidTSPC, SUM( CASE WHEN ccp.IdConcepto =
121 AND ccp.Importe < 0 THEN ccp.Importe END ) ImpTSPC, SUM( CASE WHEN ccp.IdConcepto = 122 AND
ccp.Importe < 0 THEN 1 END ) UnidTSPI, SUM( CASE WHEN ccp.IdConcepto = 122 AND ccp.Importe < 0
THEN ccp.Importe END ) ImpTSPI
FROM Cbtes_Coop cc, Cbtes_Cptos ccp, Suministros s, SubFincas sf, Fincas f, Categorias cat,
Localidades l
WHERE cc.Anio = pAnio
AND cc.NroPer = pNroPer
AND cc.Estado != 'X'
AND cc.IdTipo_Srv = 1
----AND cc.IdSuministro = 1078 ----Agregada para control
AND cc.IdEmpresa = ccp.IdEmpresa
AND cc.IdSucursal = ccp.IdSucursal
AND cc.Tipo_Cbte = ccp.Tipo_Cbte
AND cc.Grupo_Cbte = ccp.Grupo_Cbte
AND cc.Letra_Cbte = ccp.Letra_Cbte
AND cc.NroCbte = ccp.NroCbte
AND ccp.IdConcepto IN ( SELECT IdConcepto FROM Conceptos WHERE IdTipo_Srv = 1 )
AND NOT EXISTS ( SELECT IdEmpresa
FROM Cbtes_Coop
WHERE IdCbte_Padre = cc.IdCbte
AND IdSucursal IN ( 4, 47, 48 )
AND Tipo_Cbte = 'NC'
AND IdTipo_ModoFac > 0
AND Estado != 'X'
AND ABS( Totalimp ) = ABS( cc.Totalimp ))
AND cc.IdSuministro = s.IdSuministro
AND s.IdSubFinca = sf.IdSubFinca
AND sf.IdFinca = f.IdFinca
AND f.IdLocalidad = l.IdLocalidad
AND cc.IdTipo_Srv = cat.IdTipo_Srv
AND cc.IdCategoria = cat.IdCategoria
AND f.IdLocalidad = pIdLocalidad
GROUP BY f.IdLocalidad, l.Descripcion, cc.IdCategoria, cat.Descripcion
/*GROUPING SETS((f.IdLocalidad, l.Descripcion, cc.IdCategoria, cat.Descripcion))*/
ORDER BY f.IdLocalidad, cc.IdCategoria;
BEGIN
FOR regLoc IN curLoc LOOP
--
-- now we make sure this assignment works ok
--
DBMS_OUTPUT.PUT_LINE(TO_CHAR(regLoc.IdLocalidad));
my_row := xxLxC1_row( TO_CHAR(regLoc.IdLocalidad) || '-' || regLoc.Localidad, 'Cargo Fijo',
'Imp. Cargo Fijo', 'Consumo', 'Imp. Consumo', 'C. Fijo GC', 'Imp. C. Fijo GC', 'Consumo GC', 'Imp.
Consumo GC', 'Unid. Demanda', 'Imp. Demanda', 'Bonificaciones', 'Imp. Bonificaciones', 'Coseno PHI',
'Imp. Coseno PHI', 'Cargos ERSeP', 'Imp. Cargos ERSeP',
'Ajustes ERSeP', 'Imp. Ajustes ERSeP', 'Unid. Bonif. Exc', 'Imp. Bonif. Exc.', 'Unid. Reajustes',
'Imp. Reajustes', 'Unid. COIE', 'Imp. COIE', 'Unid. COIE Dem.', 'Imp. COIE Dem', 'Unid. TRA1', 'Imp.
TRA1', 'Unid. TRA2', 'Imp. TRA2', 'Unid. TSCA', 'Imp. TSCA', 'Unid. TSSA', 'Imp. TSSA', 'Unid. Bonif.
Cemdo', 'Imp. Bonif. Cemdo', 'Unid. TSPC', 'Imp. TSPC', 'Unid. TSPI', 'Imp. TSPI');
FOR regTemp IN curTemp(regLoc.IdLocalidad) LOOP
--
-- now we make sure this assignment works ok
--
DBMS_OUTPUT.PUT_LINE(regTemp.IdCategoria);
my_row :=xxLxC1_row(regTemp.IdCategoria || '-' || regTemp.Descripcion, regTemp.Cargo_Fijo,
regTemp.Importe_C_Fijo, regTemp.kWh, regTemp.Importe_Consumo, regTemp.Cargo_Fijo_GC,
regTemp.Imp_C_Fijo_GC, regTemp.Energia_GC, regTemp.Importe_GC, regTemp.Unidades_Demanda,
regTemp.Importe_Demanda, regTemp.Cant_BEN, regTemp.BEN, regTemp.Ajuste_Coseno,
regTemp.Imp_Ajuste_Coseno, regTemp.Cant_Cargos_Ersep, regTemp.Imp_Cargos_Ersep,
regTemp.Cant_Ajustes_Ersep, regTemp.Imp_Ajustes_Ersep, regTemp.Unid_Bonif_Exc,
regTemp.Imp_Bonif_Exc, regTemp.Unid_Reajustes, regTemp.Imp_Reajustes, regTemp.Unid_Coie,
regTemp.Imp_Coie, regTemp.Unid_Coie_Dem, regTemp.Imp_Coie_Dem, regTemp.Unid_TRA1,
regTemp.Imp_TRA1, regTemp.Unid_TRA2, regTemp.Imp_TRA2, regTemp.Unid_TSCA, regTemp.Imp_TSCA,
regTemp.Unid_TSSA, regTemp.Imp_TSSA, regTemp.UnidBonifCemdo, regTemp.ImpBonifCemdo,
regTemp.UnidTSPC, regTemp.ImpTSPC, regTemp.UnidTSPI, regTemp.ImpTSPI);
END LOOP;
END LOOP;
END;
/
variable x number
set serverout on
exec :x := xxLocalidadPorCategoria1(...)
我正在Oracle 12c中开发一个函数,它从几个表中获取数据并且return是一个header行并且在每个header之后是与其相关的值列表. 更好地解释一下,我有几个地方或城市,其中有电力消费者,根据他们对电力的使用和他们的消耗量(千瓦时)来确定类别。 该函数必须 return header 行中的每个城镇(加上标题),然后对该城镇的每个类别进行分组;每个城市依此类推。 我想我会用两 (2) 个光标来解决这个问题,一个按位置分组,另一个在第一个光标内部按类别分组。 当我编译时没有出现错误,但在执行时,Oracle 警告我这个错误:
ORA-06502: PL / SQL: error: numeric or value string buffer too small
ORA-06512: in "CEMDO_DB.XXLOCALIDADPORCATEGORIA1", line 87
ORA-06512:in "CEMDO_DB.XXLOCALIDADPORCATEGORIA1", line 87
- 00000 - "PL / SQL: numeric or value error% s"
- Cause: An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER (2).
- Action: Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.*
它没有说明原因,因为我对值类型或变量容量没有问题。我在错误行上唯一拥有的是 PIPE ROW。 在函数的Debug中,报错信息如下:
ORA-06550: line 10, column 3:
PL / SQL: ORA-00904: "XXLXC1_ROW": invalid identifier
ORA-06550: line 9, column 5:
PL / SQL: SQL Statement ignored
这里的错误是明确的,但我找不到解决它的方法,因为 PIPE ROW xxLxC1 类型已声明并且存在于架构中 objects.
很抱歉给您带来不便,但这是我为 Oracle 编写的第三个特性,因为我已经使用 Informix 20 年了。
以后谢谢大家的关注
我复制了函数的代码:
CREATE OR REPLACE FUNCTION xxLocalidadPorCategoria1( pAnio NUMBER, pNroPer NUMBER ) RETURN xxLxC1_tab PIPELINED IS
CURSOR curLoc IS
SELECT cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion Localidad
FROM Cbtes_Coop cc, Cbtes_Cptos ccp, Suministros s, SubFincas sf, Fincas f, Categorias cat,
Localidades l -----, OUTER( Sim_Cbtes sc, OUTER( Categorias cat, Suministros s, Localidades l ))
WHERE cc.Anio = pAnio
AND cc.NroPer = pNroPer
AND cc.Estado != 'X'
AND cc.IdTipo_Srv = 1
----AND cc.IdSuministro = 1078 ----Agregada para control
AND cc.IdEmpresa = ccp.IdEmpresa
AND cc.IdSucursal = ccp.IdSucursal
AND cc.Tipo_Cbte = ccp.Tipo_Cbte
AND cc.Grupo_Cbte = ccp.Grupo_Cbte
AND cc.Letra_Cbte = ccp.Letra_Cbte
AND cc.NroCbte = ccp.NroCbte
AND ccp.IdConcepto IN ( SELECT IdConcepto FROM Conceptos WHERE IdTipo_Srv = 1 )
AND NOT EXISTS ( SELECT IdEmpresa
FROM Cbtes_Coop
WHERE IdCbte_Padre = cc.IdCbte
AND IdSucursal IN ( 4, 47, 48 )
AND Tipo_Cbte = 'NC'
AND IdTipo_ModoFac > 0
AND Estado != 'X'
AND ABS( Totalimp ) = ABS( cc.Totalimp ))
AND cc.IdSuministro = s.IdSuministro
AND s.IdSubFinca = sf.IdSubFinca
AND sf.IdFinca = f.IdFinca
AND f.IdLocalidad = l.IdLocalidad
AND cc.IdTipo_Srv = cat.IdTipo_Srv
AND cc.IdCategoria = cat.IdCategoria
GROUP BY cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion
ORDER BY 1;
CURSOR curTemp (pIdLocalidad NUMBER) IS
SELECT cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion Localidad, SUM( CASE WHEN
ccp.IdConcepto = 5 THEN 1 END ) Cargo_Fijo, SUM( CASE WHEN ccp.IdConcepto = 5 THEN ccp.Importe
END ) Importe_C_Fijo, SUM( CASE WHEN ccp.IdConcepto = 10 THEN ROUND( ccp.Unidades, 2 ) END ) kWh,
SUM( CASE WHEN ccp.IdConcepto = 10 THEN ccp.Importe END ) Importe_Consumo, SUM( CASE WHEN
ccp.IdConcepto IN( 35, 38 ) THEN 1 END) Cargo_Fijo_GC, SUM( CASE WHEN ccp.IdConcepto IN( 35, 38 )
THEN ccp.Importe END ) Imp_C_Fijo_GC, SUM( CASE WHEN ccp.IdConcepto IN( 30, 31, 32 ) THEN ROUND(
ccp.Unidades, 2 ) END ) Energia_GC, SUM( CASE WHEN ccp.IdConcepto IN( 30, 31, 32 ) THEN
ccp.Importe END ) Importe_GC, SUM( CASE WHEN ccp.IdConcepto IN( 40, 41 ) THEN ROUND(
ccp.Unidades, 2 ) END ) Unidades_Demanda, SUM( CASE WHEN ccp.IdConcepto IN( 40, 41 ) THEN
ccp.Importe END ) Importe_Demanda, SUM( CASE WHEN ccp.IdConcepto IN( 101, 109 ) THEN 1 END )
Cant_BEN, SUM( CASE WHEN ccp.IdConcepto IN( 101, 109 ) THEN ccp.Importe END ) BEN, SUM( CASE WHEN
ccp.IdConcepto = 62 AND ccp.Importe != 0 THEN 1 END ) Ajuste_Coseno, SUM(CASE WHEN ccp.IdConcepto
= 62 AND ccp.Importe != 0 THEN ccp.Importe END ) Imp_Ajuste_Coseno, SUM(CASE WHEN ccp.IdConcepto
IN ( 25, 26, 27, 29, 291,292, 293, 294, 295 ) THEN 1 END )
Cant_Cargos_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 25, 26, 27, 29, 291,292, 293, 294, 295 )
THEN ccp.Importe END ) Imp_Cargos_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 20, 21, 23, 24, 64,
100, 432, 433, 434 ) THEN 1 END ) Cant_Ajustes_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 20, 21,
23, 24, 64, 100, 432, 433, 434 ) THEN ccp.Importe END ) Imp_Ajustes_Ersep, SUM( CASE WHEN
ccp.IdConcepto IN( 28, 97, 98 ) AND ccp.IdSubConcepto IN( 0,1,2,3 ) THEN 1 END ) Unid_Bonif_Exc,
SUM( CASE WHEN ccp.IdConcepto IN( 28, 97, 98 ) AND ccp.IdSubConcepto IN( 0,1,2,3 ) THEN
ccp.Importe END ) Imp_Bonif_Exc, SUM( CASE WHEN ccp.IdConcepto IN( 438, 439 ) AND
ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Reajustes, SUM( CASE WHEN
ccp.IdConcepto IN( 438, 439 ) AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Reajustes, SUM(
CASE WHEN ccp.IdConcepto = 58 AND ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Coie, SUM( CASE WHEN
ccp.IdConcepto = 58 AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Coie, SUM( CASE WHEN
ccp.IdConcepto = 296 AND ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Coie_Dem, SUM( CASE WHEN
ccp.IdConcepto = 296 AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Coie_Dem, SUM( CASE WHEN
ccp.IdConcepto = 103 AND ccp.Importe < 0 THEN 1 END ) Unid_TRA1, SUM( CASE WHEN ccp.IdConcepto =
103 AND ccp.Importe < 0 THEN ccp.Importe END ) Imp_TRA1, SUM( CASE WHEN ccp.IdConcepto = 104 AND
ccp.Importe < 0 THEN 1 END ) Unid_TRA2, SUM( CASE WHEN ccp.IdConcepto = 104 AND ccp.Importe < 0
THEN ccp.Importe END ) Imp_TRA2, SUM( CASE WHEN ccp.IdConcepto = 102 AND ccp.Importe < 0 THEN 1
END ) Unid_TSCA, SUM( CASE WHEN ccp.IdConcepto = 102 AND ccp.Importe < 0 THEN ccp.Importe END )
Imp_TSCA, SUM( CASE WHEN ccp.IdConcepto = 105 AND ccp.Importe < 0 THEN 1 END ) Unid_TSSA, SUM(
CASE WHEN ccp.IdConcepto = 105 AND ccp.Importe < 0 THEN ccp.Importe END ) Imp_TSSA, SUM( CASE WHEN
ccp.IdConcepto = 443 AND ccp.Importe < 0 THEN 1 END ) UnidBonifCemdo, SUM( CASE WHEN
ccp.IdConcepto = 443 AND ccp.Importe < 0 THEN ccp.Importe END ) ImpBonifCemdo, SUM( CASE WHEN
ccp.IdConcepto = 121 AND ccp.Importe < 0 THEN 1 END ) UnidTSPC, SUM( CASE WHEN ccp.IdConcepto =
121 AND ccp.Importe < 0 THEN ccp.Importe END ) ImpTSPC, SUM( CASE WHEN ccp.IdConcepto = 122 AND
ccp.Importe < 0 THEN 1 END ) UnidTSPI, SUM( CASE WHEN ccp.IdConcepto = 122 AND ccp.Importe < 0
THEN ccp.Importe END ) ImpTSPI
FROM Cbtes_Coop cc, Cbtes_Cptos ccp, Suministros s, SubFincas sf, Fincas f, Categorias cat,
Localidades l
WHERE cc.Anio = pAnio
AND cc.NroPer = pNroPer
AND cc.Estado != 'X'
AND cc.IdTipo_Srv = 1
----AND cc.IdSuministro = 1078 ----Agregada para control
AND cc.IdEmpresa = ccp.IdEmpresa
AND cc.IdSucursal = ccp.IdSucursal
AND cc.Tipo_Cbte = ccp.Tipo_Cbte
AND cc.Grupo_Cbte = ccp.Grupo_Cbte
AND cc.Letra_Cbte = ccp.Letra_Cbte
AND cc.NroCbte = ccp.NroCbte
AND ccp.IdConcepto IN ( SELECT IdConcepto FROM Conceptos WHERE IdTipo_Srv = 1 )
AND NOT EXISTS ( SELECT IdEmpresa
FROM Cbtes_Coop
WHERE IdCbte_Padre = cc.IdCbte
AND IdSucursal IN ( 4, 47, 48 )
AND Tipo_Cbte = 'NC'
AND IdTipo_ModoFac > 0
AND Estado != 'X'
AND ABS( Totalimp ) = ABS( cc.Totalimp ))
AND cc.IdSuministro = s.IdSuministro
AND s.IdSubFinca = sf.IdSubFinca
AND sf.IdFinca = f.IdFinca
AND f.IdLocalidad = l.IdLocalidad
AND cc.IdTipo_Srv = cat.IdTipo_Srv
AND cc.IdCategoria = cat.IdCategoria
AND f.IdLocalidad = pIdLocalidad
GROUP BY f.IdLocalidad, l.Descripcion, cc.IdCategoria, cat.Descripcion
/*GROUPING SETS((f.IdLocalidad, l.Descripcion, cc.IdCategoria, cat.Descripcion))*/
ORDER BY f.IdLocalidad, cc.IdCategoria;
BEGIN
FOR regLoc IN curLoc LOOP
PIPE ROW (xxLxC1_row( TO_CHAR(regLoc.IdLocalidad) || '-' || regLoc.Localidad, 'Cargo Fijo',
'Imp. Cargo Fijo', 'Consumo', 'Imp. Consumo', 'C. Fijo GC', 'Imp. C. Fijo GC', 'Consumo GC', 'Imp.
Consumo GC', 'Unid. Demanda', 'Imp. Demanda', 'Bonificaciones', 'Imp. Bonificaciones', 'Coseno PHI',
'Imp. Coseno PHI', 'Cargos ERSeP', 'Imp. Cargos ERSeP',
'Ajustes ERSeP', 'Imp. Ajustes ERSeP', 'Unid. Bonif. Exc', 'Imp. Bonif. Exc.', 'Unid. Reajustes',
'Imp. Reajustes', 'Unid. COIE', 'Imp. COIE', 'Unid. COIE Dem.', 'Imp. COIE Dem', 'Unid. TRA1', 'Imp.
TRA1', 'Unid. TRA2', 'Imp. TRA2', 'Unid. TSCA', 'Imp. TSCA', 'Unid. TSSA', 'Imp. TSSA', 'Unid. Bonif.
Cemdo', 'Imp. Bonif. Cemdo', 'Unid. TSPC', 'Imp. TSPC', 'Unid. TSPI', 'Imp. TSPI'));
FOR regTemp IN curTemp(regLoc.IdLocalidad) LOOP
DBMS_OUTPUT.PUT_LINE(regLoc.IdLocalidad);
PIPE ROW (xxLxC1_row(regTemp.IdCategoria || '-' || regTemp.Descripcion, regTemp.Cargo_Fijo,
regTemp.Importe_C_Fijo, regTemp.kWh, regTemp.Importe_Consumo, regTemp.Cargo_Fijo_GC,
regTemp.Imp_C_Fijo_GC, regTemp.Energia_GC, regTemp.Importe_GC, regTemp.Unidades_Demanda,
regTemp.Importe_Demanda, regTemp.Cant_BEN, regTemp.BEN, regTemp.Ajuste_Coseno,
regTemp.Imp_Ajuste_Coseno, regTemp.Cant_Cargos_Ersep, regTemp.Imp_Cargos_Ersep,
regTemp.Cant_Ajustes_Ersep, regTemp.Imp_Ajustes_Ersep, regTemp.Unid_Bonif_Exc,
regTemp.Imp_Bonif_Exc, regTemp.Unid_Reajustes, regTemp.Imp_Reajustes, regTemp.Unid_Coie,
regTemp.Imp_Coie, regTemp.Unid_Coie_Dem, regTemp.Imp_Coie_Dem, regTemp.Unid_TRA1,
regTemp.Imp_TRA1, regTemp.Unid_TRA2, regTemp.Imp_TRA2, regTemp.Unid_TSCA, regTemp.Imp_TSCA,
regTemp.Unid_TSSA, regTemp.Imp_TSSA, regTemp.UnidBonifCemdo, regTemp.ImpBonifCemdo,
regTemp.UnidTSPC, regTemp.ImpTSPC, regTemp.UnidTSPI, regTemp.ImpTSPI));
END LOOP;
END LOOP;
END;
/
以及PIPE ROW和VIRTUAL的代码TABLE:
CREATE OR REPLACE TYPE xxLxC1_row AS OBJECT (c1 Varchar2(50), c2 Varchar2(20), c3 Varchar2(20), c4 Varchar2(20), c5 Varchar2(20), c6 Varchar2(20), c7 Varchar2(20), c8 Varchar2(20), c9 Varchar2(20), c10 Varchar2(20), c11 Varchar2(20), c12 Varchar2(20), c13 Varchar2(20), c14 Varchar2(20), c15 Varchar2(20), c16 Varchar2(20), c17 Varchar2(20), c18 Varchar2(20), c19 Varchar2(20), c20 Varchar2(20), c21 Varchar2(20), c22 Varchar2(20), c23 Varchar2(20), c24 Varchar2(20), c25 Varchar2(20), c26 Varchar2(20), c27 Varchar2(20), c28 Varchar2(20), c29 Varchar2(20), c30 Varchar2(20), c31 Varchar2(20), c32 Varchar2(20), c33 Varchar2(20), c34 Varchar2(20), c35 Varchar2(20), c36 Varchar2(20), c37 Varchar2(20), c38 Varchar2(20), c39 Varchar2(20), c40 Varchar2(20), c41 Varchar2(20));
/
CREATE OR REPLACE TYPE xxLxC1_tab AS TABLE OF xxLxC1_row;
/
您的对象类型的每个元素都是 VARCHAR2(20),因此您输出的其中一个值很可能大于 20 个字节。
对于第一个竖线行,假设您要输出的所有值都是常量并且这些常量少于 20 个字符,那么唯一可能出错的是
TO_CHAR(regLoc.IdLocalidad) || '-' || regLoc.Localidad
超过 20 个字符。但是,对于第二个管道行,这些值中的每一个都来自游标提取,因此这些值中的任何一个都可能是罪魁祸首。
循环数据的一种简单方法是稍微更改您的函数以暂时成为非流水线函数,然后循环数据并执行对象分配以检查,即
CREATE OR REPLACE FUNCTION xxLocalidadPorCategoria1( pAnio NUMBER, pNroPer NUMBER ) RETURN number IS
my_row xxLxC1_row;
CURSOR curLoc IS
SELECT cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion Localidad
FROM Cbtes_Coop cc, Cbtes_Cptos ccp, Suministros s, SubFincas sf, Fincas f, Categorias cat,
Localidades l -----, OUTER( Sim_Cbtes sc, OUTER( Categorias cat, Suministros s, Localidades l ))
WHERE cc.Anio = pAnio
AND cc.NroPer = pNroPer
AND cc.Estado != 'X'
AND cc.IdTipo_Srv = 1
----AND cc.IdSuministro = 1078 ----Agregada para control
AND cc.IdEmpresa = ccp.IdEmpresa
AND cc.IdSucursal = ccp.IdSucursal
AND cc.Tipo_Cbte = ccp.Tipo_Cbte
AND cc.Grupo_Cbte = ccp.Grupo_Cbte
AND cc.Letra_Cbte = ccp.Letra_Cbte
AND cc.NroCbte = ccp.NroCbte
AND ccp.IdConcepto IN ( SELECT IdConcepto FROM Conceptos WHERE IdTipo_Srv = 1 )
AND NOT EXISTS ( SELECT IdEmpresa
FROM Cbtes_Coop
WHERE IdCbte_Padre = cc.IdCbte
AND IdSucursal IN ( 4, 47, 48 )
AND Tipo_Cbte = 'NC'
AND IdTipo_ModoFac > 0
AND Estado != 'X'
AND ABS( Totalimp ) = ABS( cc.Totalimp ))
AND cc.IdSuministro = s.IdSuministro
AND s.IdSubFinca = sf.IdSubFinca
AND sf.IdFinca = f.IdFinca
AND f.IdLocalidad = l.IdLocalidad
AND cc.IdTipo_Srv = cat.IdTipo_Srv
AND cc.IdCategoria = cat.IdCategoria
GROUP BY cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion
ORDER BY 1;
CURSOR curTemp (pIdLocalidad NUMBER) IS
SELECT cc.IdCategoria, cat.Descripcion, f.IdLocalidad, l.Descripcion Localidad, SUM( CASE WHEN
ccp.IdConcepto = 5 THEN 1 END ) Cargo_Fijo, SUM( CASE WHEN ccp.IdConcepto = 5 THEN ccp.Importe
END ) Importe_C_Fijo, SUM( CASE WHEN ccp.IdConcepto = 10 THEN ROUND( ccp.Unidades, 2 ) END ) kWh,
SUM( CASE WHEN ccp.IdConcepto = 10 THEN ccp.Importe END ) Importe_Consumo, SUM( CASE WHEN
ccp.IdConcepto IN( 35, 38 ) THEN 1 END) Cargo_Fijo_GC, SUM( CASE WHEN ccp.IdConcepto IN( 35, 38 )
THEN ccp.Importe END ) Imp_C_Fijo_GC, SUM( CASE WHEN ccp.IdConcepto IN( 30, 31, 32 ) THEN ROUND(
ccp.Unidades, 2 ) END ) Energia_GC, SUM( CASE WHEN ccp.IdConcepto IN( 30, 31, 32 ) THEN
ccp.Importe END ) Importe_GC, SUM( CASE WHEN ccp.IdConcepto IN( 40, 41 ) THEN ROUND(
ccp.Unidades, 2 ) END ) Unidades_Demanda, SUM( CASE WHEN ccp.IdConcepto IN( 40, 41 ) THEN
ccp.Importe END ) Importe_Demanda, SUM( CASE WHEN ccp.IdConcepto IN( 101, 109 ) THEN 1 END )
Cant_BEN, SUM( CASE WHEN ccp.IdConcepto IN( 101, 109 ) THEN ccp.Importe END ) BEN, SUM( CASE WHEN
ccp.IdConcepto = 62 AND ccp.Importe != 0 THEN 1 END ) Ajuste_Coseno, SUM(CASE WHEN ccp.IdConcepto
= 62 AND ccp.Importe != 0 THEN ccp.Importe END ) Imp_Ajuste_Coseno, SUM(CASE WHEN ccp.IdConcepto
IN ( 25, 26, 27, 29, 291,292, 293, 294, 295 ) THEN 1 END )
Cant_Cargos_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 25, 26, 27, 29, 291,292, 293, 294, 295 )
THEN ccp.Importe END ) Imp_Cargos_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 20, 21, 23, 24, 64,
100, 432, 433, 434 ) THEN 1 END ) Cant_Ajustes_Ersep, SUM( CASE WHEN ccp.IdConcepto IN ( 20, 21,
23, 24, 64, 100, 432, 433, 434 ) THEN ccp.Importe END ) Imp_Ajustes_Ersep, SUM( CASE WHEN
ccp.IdConcepto IN( 28, 97, 98 ) AND ccp.IdSubConcepto IN( 0,1,2,3 ) THEN 1 END ) Unid_Bonif_Exc,
SUM( CASE WHEN ccp.IdConcepto IN( 28, 97, 98 ) AND ccp.IdSubConcepto IN( 0,1,2,3 ) THEN
ccp.Importe END ) Imp_Bonif_Exc, SUM( CASE WHEN ccp.IdConcepto IN( 438, 439 ) AND
ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Reajustes, SUM( CASE WHEN
ccp.IdConcepto IN( 438, 439 ) AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Reajustes, SUM(
CASE WHEN ccp.IdConcepto = 58 AND ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Coie, SUM( CASE WHEN
ccp.IdConcepto = 58 AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Coie, SUM( CASE WHEN
ccp.IdConcepto = 296 AND ccp.IdSubConcepto = 0 THEN 1 END ) Unid_Coie_Dem, SUM( CASE WHEN
ccp.IdConcepto = 296 AND ccp.IdSubConcepto = 0 THEN ccp.Importe END ) Imp_Coie_Dem, SUM( CASE WHEN
ccp.IdConcepto = 103 AND ccp.Importe < 0 THEN 1 END ) Unid_TRA1, SUM( CASE WHEN ccp.IdConcepto =
103 AND ccp.Importe < 0 THEN ccp.Importe END ) Imp_TRA1, SUM( CASE WHEN ccp.IdConcepto = 104 AND
ccp.Importe < 0 THEN 1 END ) Unid_TRA2, SUM( CASE WHEN ccp.IdConcepto = 104 AND ccp.Importe < 0
THEN ccp.Importe END ) Imp_TRA2, SUM( CASE WHEN ccp.IdConcepto = 102 AND ccp.Importe < 0 THEN 1
END ) Unid_TSCA, SUM( CASE WHEN ccp.IdConcepto = 102 AND ccp.Importe < 0 THEN ccp.Importe END )
Imp_TSCA, SUM( CASE WHEN ccp.IdConcepto = 105 AND ccp.Importe < 0 THEN 1 END ) Unid_TSSA, SUM(
CASE WHEN ccp.IdConcepto = 105 AND ccp.Importe < 0 THEN ccp.Importe END ) Imp_TSSA, SUM( CASE WHEN
ccp.IdConcepto = 443 AND ccp.Importe < 0 THEN 1 END ) UnidBonifCemdo, SUM( CASE WHEN
ccp.IdConcepto = 443 AND ccp.Importe < 0 THEN ccp.Importe END ) ImpBonifCemdo, SUM( CASE WHEN
ccp.IdConcepto = 121 AND ccp.Importe < 0 THEN 1 END ) UnidTSPC, SUM( CASE WHEN ccp.IdConcepto =
121 AND ccp.Importe < 0 THEN ccp.Importe END ) ImpTSPC, SUM( CASE WHEN ccp.IdConcepto = 122 AND
ccp.Importe < 0 THEN 1 END ) UnidTSPI, SUM( CASE WHEN ccp.IdConcepto = 122 AND ccp.Importe < 0
THEN ccp.Importe END ) ImpTSPI
FROM Cbtes_Coop cc, Cbtes_Cptos ccp, Suministros s, SubFincas sf, Fincas f, Categorias cat,
Localidades l
WHERE cc.Anio = pAnio
AND cc.NroPer = pNroPer
AND cc.Estado != 'X'
AND cc.IdTipo_Srv = 1
----AND cc.IdSuministro = 1078 ----Agregada para control
AND cc.IdEmpresa = ccp.IdEmpresa
AND cc.IdSucursal = ccp.IdSucursal
AND cc.Tipo_Cbte = ccp.Tipo_Cbte
AND cc.Grupo_Cbte = ccp.Grupo_Cbte
AND cc.Letra_Cbte = ccp.Letra_Cbte
AND cc.NroCbte = ccp.NroCbte
AND ccp.IdConcepto IN ( SELECT IdConcepto FROM Conceptos WHERE IdTipo_Srv = 1 )
AND NOT EXISTS ( SELECT IdEmpresa
FROM Cbtes_Coop
WHERE IdCbte_Padre = cc.IdCbte
AND IdSucursal IN ( 4, 47, 48 )
AND Tipo_Cbte = 'NC'
AND IdTipo_ModoFac > 0
AND Estado != 'X'
AND ABS( Totalimp ) = ABS( cc.Totalimp ))
AND cc.IdSuministro = s.IdSuministro
AND s.IdSubFinca = sf.IdSubFinca
AND sf.IdFinca = f.IdFinca
AND f.IdLocalidad = l.IdLocalidad
AND cc.IdTipo_Srv = cat.IdTipo_Srv
AND cc.IdCategoria = cat.IdCategoria
AND f.IdLocalidad = pIdLocalidad
GROUP BY f.IdLocalidad, l.Descripcion, cc.IdCategoria, cat.Descripcion
/*GROUPING SETS((f.IdLocalidad, l.Descripcion, cc.IdCategoria, cat.Descripcion))*/
ORDER BY f.IdLocalidad, cc.IdCategoria;
BEGIN
FOR regLoc IN curLoc LOOP
--
-- now we make sure this assignment works ok
--
DBMS_OUTPUT.PUT_LINE(TO_CHAR(regLoc.IdLocalidad));
my_row := xxLxC1_row( TO_CHAR(regLoc.IdLocalidad) || '-' || regLoc.Localidad, 'Cargo Fijo',
'Imp. Cargo Fijo', 'Consumo', 'Imp. Consumo', 'C. Fijo GC', 'Imp. C. Fijo GC', 'Consumo GC', 'Imp.
Consumo GC', 'Unid. Demanda', 'Imp. Demanda', 'Bonificaciones', 'Imp. Bonificaciones', 'Coseno PHI',
'Imp. Coseno PHI', 'Cargos ERSeP', 'Imp. Cargos ERSeP',
'Ajustes ERSeP', 'Imp. Ajustes ERSeP', 'Unid. Bonif. Exc', 'Imp. Bonif. Exc.', 'Unid. Reajustes',
'Imp. Reajustes', 'Unid. COIE', 'Imp. COIE', 'Unid. COIE Dem.', 'Imp. COIE Dem', 'Unid. TRA1', 'Imp.
TRA1', 'Unid. TRA2', 'Imp. TRA2', 'Unid. TSCA', 'Imp. TSCA', 'Unid. TSSA', 'Imp. TSSA', 'Unid. Bonif.
Cemdo', 'Imp. Bonif. Cemdo', 'Unid. TSPC', 'Imp. TSPC', 'Unid. TSPI', 'Imp. TSPI');
FOR regTemp IN curTemp(regLoc.IdLocalidad) LOOP
--
-- now we make sure this assignment works ok
--
DBMS_OUTPUT.PUT_LINE(regTemp.IdCategoria);
my_row :=xxLxC1_row(regTemp.IdCategoria || '-' || regTemp.Descripcion, regTemp.Cargo_Fijo,
regTemp.Importe_C_Fijo, regTemp.kWh, regTemp.Importe_Consumo, regTemp.Cargo_Fijo_GC,
regTemp.Imp_C_Fijo_GC, regTemp.Energia_GC, regTemp.Importe_GC, regTemp.Unidades_Demanda,
regTemp.Importe_Demanda, regTemp.Cant_BEN, regTemp.BEN, regTemp.Ajuste_Coseno,
regTemp.Imp_Ajuste_Coseno, regTemp.Cant_Cargos_Ersep, regTemp.Imp_Cargos_Ersep,
regTemp.Cant_Ajustes_Ersep, regTemp.Imp_Ajustes_Ersep, regTemp.Unid_Bonif_Exc,
regTemp.Imp_Bonif_Exc, regTemp.Unid_Reajustes, regTemp.Imp_Reajustes, regTemp.Unid_Coie,
regTemp.Imp_Coie, regTemp.Unid_Coie_Dem, regTemp.Imp_Coie_Dem, regTemp.Unid_TRA1,
regTemp.Imp_TRA1, regTemp.Unid_TRA2, regTemp.Imp_TRA2, regTemp.Unid_TSCA, regTemp.Imp_TSCA,
regTemp.Unid_TSSA, regTemp.Imp_TSSA, regTemp.UnidBonifCemdo, regTemp.ImpBonifCemdo,
regTemp.UnidTSPC, regTemp.ImpTSPC, regTemp.UnidTSPI, regTemp.ImpTSPI);
END LOOP;
END LOOP;
END;
/
variable x number
set serverout on
exec :x := xxLocalidadPorCategoria1(...)