¿Es posible crear excepciones definidas por el usuario y poder cambiar el SQLERRM?Oracle PL/SQL - Elevar la excepción definida por el usuario con SQLERRM personalizado
Por ejemplo:
DECLARE
ex_custom EXCEPTION;
BEGIN
RAISE ex_custom;
EXCEPTION
WHEN ex_custom THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
la salida es "Excepción definido por el usuario". ¿Es posible cambiar ese mensaje?
EDITAR: Aquí hay más detalles.
Espero que este ilustre lo que trato de hacer mejor.
DECLARE
l_table_status VARCHAR2(8);
l_index_status VARCHAR2(8);
l_table_name VARCHAR2(30) := 'TEST';
l_index_name VARCHAR2(30) := 'IDX_TEST';
ex_no_metadata EXCEPTION;
BEGIN
BEGIN
SELECT STATUS
INTO l_table_status
FROM USER_TABLES
WHERE TABLE_NAME = l_table_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- raise exception here with message saying
-- "Table metadata does not exist."
RAISE ex_no_metadata;
END;
BEGIN
SELECT STATUS
INTO l_index_status
FROM USER_INDEXES
WHERE INDEX_NAME = l_index_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- raise exception here with message saying
-- "Index metadata does not exist."
RAISE ex_no_metadata;
END;
EXCEPTION
WHEN ex_no_metadata THEN
DBMS_OUTPUT.PUT_LINE('Exception will be handled by handle_no_metadata_exception(SQLERRM) procedure here.');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
En realidad, hay docenas de esos sub-bloques. Me pregunto si hay una forma de hacer que una única excepción definida por el usuario para cada uno de esos subbloques se eleve, pero que proporcione un mensaje diferente, en lugar de crear una excepción separada definida por el usuario para cada subbloque.
En .NET, sería algo así como tener una excepción personalizada así:
public class ColorException : Exception
{
public ColorException(string message)
: base(message)
{
}
}
Y entonces, un método tendría algo como esto:
if (isRed)
{
throw new ColorException("Red is not allowed!");
}
if (isBlack)
{
throw new ColorException("Black is not allowed!");
}
if (isBlue)
{
throw new ColorException("Blue is not allowed!");
}
Lo siento si yo no estaba clara. Agregaré otro ejemplo. – tgxiii