Problemas con cursores dentro del procedimiento
Quisiera que por favor nos ayudara con un procedimiento que realice pero no me funciona.
Resulta que tengo un cursor dentro del procedimiento, el procedimiento debe tomar valores de 2 tablas y llenar una tercera tabla con esos valores, ademas debe realizar unas sumatorias de las tablas anteriores, para actualizar la tercera tabla, resulta que si la tercera tabla tiene datos el procedimiento debe actualizarlos, pero sino debe insertar datos, el error que me sale al ejecutar el procedimiento es
LINE/COL ERROR
-------- ----------------------------------------------------------------
27/1 PL/SQL: SQL Statement ignored
27/19 PLS-00403: la expresión 'R_UNO' no se puede utilizar como un
destino INTO de una sentencia SELECT/FETCH
29/1 PL/SQL: SQL Statement ignored
33/43 PLS-00330: uso incorrecto del nombre del tipo o del nombre del
subtipo
33/43 PL/SQL: ORA-00904: nombre de columna no válido
35/6 PL/SQL: SQL Statement ignored
40/14 PLS-00302: el componente 'VL_EXPRE' se debe declarar
40/14 PL/SQL: ORA-00984: columna no permitida aquí
El problema es que VL_EXPRE si esta declarada, por lo demás no entiendo de porque el error aquí le mando el procedimiento dentro del package para que por favor me pueda ayudar
CREATE OR REPLACE PACKAGE pk_totxabona AS
TYPE r_uno IS RECORD(
CONT_SAT NUMBER(6),
COD_CUENTA NUMBER(10),
ABONADOA VARCHAR2(15),
ANNO NUMBER(4),
MES NUMBER(2),
DESTINO VARCHAR2(15),
CLASE VARCHAR2(15),
NOVEDAD CHAR(1),
VLR_LLAM NUMBER(12,2),
VLR_MIN NUMBER(12,2),
VLR_DESC NUMBER(12,2),
VLR_EXPRESO NUMBER(12,2)
);
TYPE c_uno IS REF CURSOR ;
PROCEDURE pr_totxabonado(
salida out c_uno);
END;
/
CREATE OR REPLACE PACKAGE BODY pk_totxabona AS
PROCEDURE pr_totxabonado(
salida out c_uno)
IS
BEGIN
OPEN salida FOR
SELECT DISTINCT
A.CONT_SAT,
A.COD_CUENTA,
a.abonadoa,
B.ANNO,
B.MES,
b.destino,
B.CLASE,
b.novedad,
SUM(B.VLR_LLAM),
SUM(B.VLR_MIN),
SUM(B.VLR_LLAM)-SUM(B.VLR_EXPRESO),
SUM(B.VLR_EXPRESO)
FROM TELCUENT A, DETLD B
WHERE A.ABONADOA = '76322472'
AND A.ABONADOA = B.ABONADOA
GROUP BY A.CONT_SAT, A.COD_CUENTA, A.ABONADOA, B.ANNO,
B.MES, B.DESTINO, B.CLASE, B.NOVEDAD;
FETCH salida INTO r_uno;
IF SQL%FOUND THEN
UPDATE TOTXABONADO
SET VLR_ABONADO = VLR_ABONADO + R_UNO.VLR_LLAM,
MIN_ABONADO = MIN_ABONADO + R_UNO.VLR_MIN,
DESC_ABONADO = DESC_ABONADO + R_UNO.VLR_DESC,
EXPR_ABONADO = EXPR_ABONADO + R_UNO.VLR_EXPRESO;
ELSE IF SQL%NOTFOUND THEN
INSERT INTO TOTXABONADO
VALUES (R_UNO.VL_CONSAT,R_UNO.VL_CODCTA,R_UNO.VL_YEAR,
R_UNO.VL_MES,R_UNO.VL_ABONA,R_UNO.VL_DEST, R_UNO.VL_CLASE,
R_UNO.VL_NOVEDAD,R_UNO.VL_ABON, R_UNO.VL_MNABON,
R_UNO.VL_DESC,
R_UNO.VL_EXPRE);
END IF;
END IF;
COMMIT;
END;
END;
/
Resulta que tengo un cursor dentro del procedimiento, el procedimiento debe tomar valores de 2 tablas y llenar una tercera tabla con esos valores, ademas debe realizar unas sumatorias de las tablas anteriores, para actualizar la tercera tabla, resulta que si la tercera tabla tiene datos el procedimiento debe actualizarlos, pero sino debe insertar datos, el error que me sale al ejecutar el procedimiento es
LINE/COL ERROR
-------- ----------------------------------------------------------------
27/1 PL/SQL: SQL Statement ignored
27/19 PLS-00403: la expresión 'R_UNO' no se puede utilizar como un
destino INTO de una sentencia SELECT/FETCH
29/1 PL/SQL: SQL Statement ignored
33/43 PLS-00330: uso incorrecto del nombre del tipo o del nombre del
subtipo
33/43 PL/SQL: ORA-00904: nombre de columna no válido
35/6 PL/SQL: SQL Statement ignored
40/14 PLS-00302: el componente 'VL_EXPRE' se debe declarar
40/14 PL/SQL: ORA-00984: columna no permitida aquí
El problema es que VL_EXPRE si esta declarada, por lo demás no entiendo de porque el error aquí le mando el procedimiento dentro del package para que por favor me pueda ayudar
CREATE OR REPLACE PACKAGE pk_totxabona AS
TYPE r_uno IS RECORD(
CONT_SAT NUMBER(6),
COD_CUENTA NUMBER(10),
ABONADOA VARCHAR2(15),
ANNO NUMBER(4),
MES NUMBER(2),
DESTINO VARCHAR2(15),
CLASE VARCHAR2(15),
NOVEDAD CHAR(1),
VLR_LLAM NUMBER(12,2),
VLR_MIN NUMBER(12,2),
VLR_DESC NUMBER(12,2),
VLR_EXPRESO NUMBER(12,2)
);
TYPE c_uno IS REF CURSOR ;
PROCEDURE pr_totxabonado(
salida out c_uno);
END;
/
CREATE OR REPLACE PACKAGE BODY pk_totxabona AS
PROCEDURE pr_totxabonado(
salida out c_uno)
IS
BEGIN
OPEN salida FOR
SELECT DISTINCT
A.CONT_SAT,
A.COD_CUENTA,
a.abonadoa,
B.ANNO,
B.MES,
b.destino,
B.CLASE,
b.novedad,
SUM(B.VLR_LLAM),
SUM(B.VLR_MIN),
SUM(B.VLR_LLAM)-SUM(B.VLR_EXPRESO),
SUM(B.VLR_EXPRESO)
FROM TELCUENT A, DETLD B
WHERE A.ABONADOA = '76322472'
AND A.ABONADOA = B.ABONADOA
GROUP BY A.CONT_SAT, A.COD_CUENTA, A.ABONADOA, B.ANNO,
B.MES, B.DESTINO, B.CLASE, B.NOVEDAD;
FETCH salida INTO r_uno;
IF SQL%FOUND THEN
UPDATE TOTXABONADO
SET VLR_ABONADO = VLR_ABONADO + R_UNO.VLR_LLAM,
MIN_ABONADO = MIN_ABONADO + R_UNO.VLR_MIN,
DESC_ABONADO = DESC_ABONADO + R_UNO.VLR_DESC,
EXPR_ABONADO = EXPR_ABONADO + R_UNO.VLR_EXPRESO;
ELSE IF SQL%NOTFOUND THEN
INSERT INTO TOTXABONADO
VALUES (R_UNO.VL_CONSAT,R_UNO.VL_CODCTA,R_UNO.VL_YEAR,
R_UNO.VL_MES,R_UNO.VL_ABONA,R_UNO.VL_DEST, R_UNO.VL_CLASE,
R_UNO.VL_NOVEDAD,R_UNO.VL_ABON, R_UNO.VL_MNABON,
R_UNO.VL_DESC,
R_UNO.VL_EXPRE);
END IF;
END IF;
COMMIT;
END;
END;
/
1 Respuesta
Respuesta de walrus
1