Transformación de predicados de SQL en predicados de XML

Db2 a veces transforma una consulta SQL para cambiar el momento en que se aplica un predicado para mejorar el rendimiento de la consulta. Db2 podría utilizar dicha transformación para introducir predicados SQL en la expresión XPath incrustada en la función XMLTABLE.

Iniciar la información de la interfaz de programación específica del programa.

Por ejemplo, la consulta siguiente encuentra todos los libros que se publicaron después de 1991, y lista el año, el título y el editor de cada libro.

SELECT X.*
FROM T1,
	XMLTABLE('/bib/book'
						PASSING T1.bib_xml
						COLUMNS YEAR INT PATH '@year',
							TITLE VARCHAR(30) PATH 'title',
						PUBLISHER VARCHAR(30) PATH 'publisher') X
WHERE X.YEAR > 1991;

Db2 puede reescribir la consulta para procesar el predicado WHERE X.YEAR > 1991 en la función XMLTABLE. En la consulta reescrita, el predicado original se convierte en un predicado XPath que está asociado a la expresión row-xpath-expression de la función XMLTABLE:

SELECT X.*
FROM T1,
	XMLTABLE('/bib/book[@year>1991]'
					PASSING T1.bib_xml
					COLUMNS YEAR INT PATH '@year',
								TITLE VARCHAR(30) PATH 'title',
						PUBLISHER VARCHAR(30) PATH 'publisher') X

Implicaciones del truncamiento y los blancos de cola

A diferencia de lo que ocurre en SQL, donde los blancos de cola no tienen ninguna significación, los blancos de cola son significativos en XPath. Por ejemplo, la siguiente consulta contiene un predicado adicional, X.publisher = 'Addison-Wesley':

SELECT *
FROM T1,
	XMLTABLE('/bib/book'
					PASSING T1.bib_xml
					COLUMNS year INT PATH '@year',
								title VARCHAR(30) PATH 'title',
						 publisher VARCHAR(30) PATH 'publisher') X
WHERE X.year > 1991
	AND X.publisher = 'Addison-Wesley';

Debido al posible truncamiento cuando un editor se convierte en varchar(30) y a la posibilidad de blancos de cola en los datos XML originales, Db2 debe añadir un operador interno, db2:rtrim, para simular la semántica de SQL para poder insertar el predicado en XPath. Tal como se muestra a continuación. El predicado X.publisher = 'Addison-Wesley' se transforma en [db2:rtrim(publisher,30)="Addison-Wesley"].

Predicados que se pueden elegir para su transformación en predicados de XML en XMLTABLE

Un predicado se puede transformar a fin de ser procesado por la función XMLTABLE cuando cumple estos criterios:

  • El predicado debe tener una de las siguientes formas: (Donde op significa cualquiera de los operadores siguientes: =, <, >, <=. >= o <>.)
    • Columna op constante, parámetro o variable de lenguaje principal, donde la columna procede de la tabla de resultados.
    • Columna op columna, donde la columna a la izquierda del operador procede de la tabla de resultados y la columna a la derecha del operador procede de la tabla de resultados o de una de las tablas de entrada.
    • Columna op expresión, donde la columna procede de la tabla de resultados, y la expresión es cualquier expresión de SQL que solamente contiene columnas de la tabla de entrada,
    • Un predicado BETWEEN que se pueda transformar en uno de los formatos anteriores.
    • COLUMN IS (NOT) NULL
    • Un predicado que consta de los formatos anteriores en combinación con AND y OR.
    • COLUMNA (NO) EN (expresión 1,..., expresión n ), donde la columna es de la tabla de resultados y cada una de las expresiones en una columna de la tabla de resultados o una expresión SQL que no contiene columnas de la tabla de resultados ni columnas de una tabla que NO es una tabla de entrada.
  • El predicado es un predicado de términos booleanos.
  • El predicado se puede aplicar antes que cualquier operación de unión.
  • La columna de resultados de la función XMLTABLE que interviene en el predicado no pertenece a ninguno de estos tipos de datos:
    • FECHA
    • HORA
    • TIMESTAMP
    • DECFLOAT(16)
    • REAL
    • DOUBLE
    Esta restricción no es aplicable al predicado IS (NOT) NULL.
  • Las columnas de resultados de la función XMLTABLE que interviene en el predicado no tiene una cláusula por omisión.
  • La función XMLTABLE no tiene una columna FOR ORDINALITY.
Finalizar la información de la interfaz de programación específica del programa.