Cuando escribes un stored procedure, un execute block, o una view hay un límite a la cantidad de contextos que puedes tener.

¿Qué es un contexto?

Es cualquier comando del Firebird que hace referencia a una tabla (o más de una).

Ese límite es por declaración, no por stored procedure, execute block o view. No hay que confundir.

Las declaraciones posibles son:

  • INSERT
  • UPDATE
  • DELETE
  • SELECT

Ninguna de esas declaraciones puede tener más de 255 contextos. Ese es el límite máximo.

Pero además, cada GROUP BY y cada UNION suma 1 contexto más.

Ejemplos:

  • Un SELECT a una tabla tiene un contexto
  • Un SELECT con un JOIN tiene dos contextos
  • Un SELECT con dos JOIN tiene tres contextos
  • Un SELECT con una subconsulta tiene dos contextos
  • Un SELECT con dos subconsultas tiene tres contextos
  • Un SELECT con una subconsulta y con un JOIN tiene tres contextos
  • Un SELECT autoreferenciado (ambas tablas del JOIN son la misma) tiene dos contextos
  • Un SELECT con un GROUP BY tiene dos contextos
  • Un INSERT que referencia a una view, tiene un contexto por cada tabla que es referenciada en la view
  • Un UPDATE que referencia a una view, tiene un contexto por cada tabla que es referenciada en la view

Cada INSERT, cada UPDATE y cada DELETE suma 2, por las seudo-variables NEW y OLD de los triggers. En los demás casos se suma 1.

La cantidad máxima de contextos que puedes tener (hasta la versión Firebird 3.0) es de 255, si superas esa cantidad entonces verás el mensaje de error que da título a este artículo.

Listado 1.


SELECT <mis_columnas_1> FROM MiTabla1;

UNION

SELECT <mis_columnas_2> FROM MiTabla2;

En el Listado 1. hay 3 contextos.

Listado 2.


INSERT INTO MiTabla <mis_columnas> VALUES <lista_valores>;

INSERT INTO MiTabla <mis_columnas> VALUES <otros_valores>;

En el Listado 2. el primer INSERT tiene 2 contextos y el segundo INSERT también tiene 2 contextos. Esos contextos no se suman, cada uno de ellos es independiente, porque lo que vale es la cantidad de contextos que cada declaración tiene.

Solución:

Si el Firebird te muestra este mensaje de error entonces tienes que disminuir la cantidad de contextos. Eso puedes hacerlo de varias maneras, por ejemplo usando una tabla CTE en lugar de varias subconsultas, o cambiando la condición de filtro del WHERE, o disminuyendo la cantidad de JOIN, etc.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21