Habrás visto que en los stored procedures, en los triggers y en los execute blocks se usa SET TERM (poner terminador) ¿por qué eso?

Cuando grabas un stored procedure, trigger o execute block el Firebird lo analiza para verificar que esté correcto y no tenga errores. Si tiene errores, te muestra un mensaje informándote del error encontrado.

¿Cuándo termina el stored procedure, trigger o execute block? ¿En qué momento el Firebird dice: “hasta aquí debo analizar”?

Cuando encuentra el caracter de terminación. El caracter de terminación es el punto y coma.

Pero…dentro de un stored procedure, trigger o execute block puede haber varias instrucciones, cada una de ellas terminando también con un punto y coma. ¿Y cuál es el problema? que al encontrar al primer punto y coma el analizador terminará su tarea y la instrucción quedará incompleta. Por ejemplo:

    CREATE PROCEDURE MiStoredProcedure
    AS
    BEGIN
        INSERT INTO MiTabla VALUES(123456);
    END;

El analizador finalizará su tarea al encontrar VALUES(123456); y eso es un error porque el BEGIN debe finalizar con un END y nunca se llegó hasta ese END.

¿Cómo se soluciona este problema?

Diciéndole al Firebird que para finalizar el stored procedure, trigger o execute block utilice otro caracter de terminación, no el punto y coma. Al escribir:

    SET TERM ^ ;

Lo que se le está diciendo es: “este stored procedure, trigger o execute block finaliza cuando encuentras el caracter ^”

Desde este momento el caracter de terminacion es el ^ ya no es el ;

Para evitar problemas con otras instrucciones, lo correcto es que vuelvas a poner al punto y coma como caracter de terminación al finalizar tu stored procedure, trigger o execute block.

    SET TERM ^ ;

Por lo tanto el ejemplo te quedará así y estará todo perfecto:

    SET TERM ^ ;
    CREATE PROCEDURE MiStoredProcedure
    AS
    BEGIN
        INSERT INTO MiTabla VALUES(123456);
    END^
    SET TERM ; ^

Un comentario final: como caracter de terminación puedes usar cualquiera que desees, no es obligación usar el ^ aunque sí es el más usado. El único requisito es que el caracter elegido no aparezca dentro de tu stored procedure, trigger o execute block. Por ejemplo, una letra sería una pésima elección porque la probabilidad de que aparezca ahora o en el futuro cuando lo modifiques es muy alta. Recuerda que el analizador finaliza su tarea cuando encuentra el caracter de terminación. Por eso, usar como caracter de terminación una letra (A, B, C, etc.) es lo peor que podrías hacer. Por otro lado, tampoco es obligatorio que se use un solo caracter para terminación, si lo deseas puedes usar varios, por ejemplo:

    SET TERM %&/ ;

es también perfectamente admisible.

Anuncios