该函数需要获取单行的平均值,即学生的成绩。 此外,它需要处理错误,将它们插入到另一个名为
ERRORES
的表中以存档它们。我想使用 SQLCODE
和 SQLERRM
,但它不允许我使用。它给了我以下错误:
Error(22,9): PL/SQL: SQL Statement ignored
Error(23,42): PL/SQL: ORA-00984: column not allowed here
表
ERRORES
是使用以下参数创建的:
CREATE TABLE ERRORES
(id_error NUMBER(10) NOT NULL,
subprograma_error VARCHAR2(50) NOT NULL,
descripcion_error VARCHAR2(500),
PRIMARY KEY (id_error));
这是功能:
CREATE OR REPLACE FUNCTION FN_PROMEDIO(cod_asig nota_alumno.cod_asignatura%TYPE)
RETURN NUMBER IS
promedio nota_alumno.nota1%TYPE := 0;
BEGIN
SELECT
ROUND((nota1 + nota2 + nota3 + nota4 + nota5) / 5, 1)
INTO
promedio
FROM
nota_alumno
WHERE
cod_asignatura = cod_asig;
RETURN
promedio;
EXCEPTION
WHEN OTHERS THEN
INSERT INTO ERRORES
VALUES(
SEQ_ERRORES.NEXTVAL,
'Error en función "FN_PROMEDIO',
TO_CHAR(SQLCODE) || ' - ' || SQLERRM);
END;
我该怎么办?错误信息是不是很长
ERRORES
?
将
SQLCODE
和 SQLERRM
分配给变量,而不是尝试直接在 INSERT
中使用它们:
CREATE OR REPLACE FUNCTION FN_PROMEDIO(
cod_asig nota_alumno.cod_asignatura%TYPE
) RETURN NUMBER IS
promedio nota_alumno.nota1%TYPE := 0;
v_error NUMBER;
v_errm VARCHAR2(1000);
BEGIN
SELECT ROUND((nota1 + nota2 + nota3 + nota4 + nota5) / 5, 1)
INTO promedio
FROM nota_alumno
WHERE cod_asignatura = cod_asig;
RETURN promedio;
EXCEPTION
WHEN OTHERS THEN
v_error := SQLCODE;
v_errm := SQLERRM;
INSERT INTO ERRORES (
id_error,
subprograma_error,
descripcion_error
) VALUES(
SEQ_ERRORES.NEXTVAL,
'Error en función "FN_PROMEDIO',
TO_CHAR(v_error) || ' - ' || v_errm
);
END;
/