last from oracle plsql exception-handling oracle11g max

oracle - from - sql max date



la excepción no viene con la función sql max (2)

Mucho más simple:

SELECT COALESCE((SELECT MAX(A_id) from table_A), (SELECT MAX(A_id) from table_A_archive)) + 1 FROM DUAL INTO id_variable;

Aún obtiene una fila de la consulta máxima, incluso si no hay filas, pero el valor es nulo, por eso no hay excepción.

Use el hecho de que un valor nulo se devuelve ventajoso mediante el uso de coalesce() , que devuelve el primer valor no nulo en la lista.

Escribí la consulta siguiente esperando que se lanzara la excepción NO_DATA_FOUND cuando no se encontraron filas.

BEGIN SELECT MAX(A_id) + 1 INTO id_variable from table_A; EXCEPTION WHEN NO_DATA_FOUND THEN SELECT MAX(A_id) + 1 INTO id_variable from table_A_archive; END;

no hay datos en la tabla_A, pero no se lanzó ninguna excepción y, finalmente, el valor id_variable obtiene nulo. He buscado en google y noté que la función MAX ignora los valores nulos, pero no pude encontrar ningún remedio que pueda hacer que arroje una excepción.

Cómo hacer para lanzar una excepción para que el control vaya por la excepción y busque en la tabla de archivos.

¿hay alguna otra alternativa que tomar el conteo ( ) y luego obtener el valor solo si count ( )> 0.


No, no entrará en la excepción. MAX no generará ningún_data_found ya que devolverá un valor NULL .

Mira esto:

SQL> select max(a_id) from table_a; MAX(A_ID) ---------- SQL> select a_id from table_a; no rows selected SQL>

¿hay alguna otra alternativa que tomar el conteo () y luego obtener el valor solo si count ()> 0.

Podría tener su excepción personalizada y luego aumentarla cuando el valor sea NULO .

Por ejemplo,

SQL> CREATE TABLE table_A(a_id NUMBER); Table created. SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 id_variable NUMBER; 3 is_null EXCEPTION; 4 BEGIN 5 SELECT MAX(A_id) + 1 INTO id_variable FROM table_A; 6 IF id_variable IS NULL THEN 7 raise is_null; 8 END IF; 9 EXCEPTION 10 WHEN is_null THEN 11 DBMS_OUTPUT.PUT_LINE(''Came into Exception''); 12 END; 13 / Came into Exception PL/SQL procedure successfully completed. SQL>

Actualización Si no desea generar una excepción y solo desea seleccionar de otra tabla cuando MAX devuelve NULL, agregue un bloque IF-ELSE .

Por ejemplo,

SQL> CREATE TABLE table_A(a_id NUMBER); Table created. SQL> CREATE TABLE table_b(a_id NUMBER); Table created. SQL> INSERT INTO table_b VALUES(1); 1 row created. SQL> COMMIT; Commit complete. SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 id_variable NUMBER; 3 BEGIN 4 SELECT max(A_id) + 1 INTO id_variable from table_A; 5 IF id_variable IS NULL 6 THEN 7 SELECT A_id + 1 INTO id_variable FROM table_b; 8 END IF; 9 DBMS_OUTPUT.PUT_LINE(''ID value is ''||id_variable); 10 END; 11 / ID value is 2 PL/SQL procedure successfully completed.