EXCEPTION 函数中存在 SELECT 子句错误

问题描述 投票:0回答:1

该函数需要获取单行的平均值,即学生的成绩。 此外,它需要处理错误,将它们插入到另一个名为

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

sql oracle-database plsql
1个回答
0
投票

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;
/

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.