Empiece a usar pureXML en DB2 V9 ya mismo, Parte 4: Consulta de datos XML en DB2 con XQuery

Volver al artículo

Ejemplo de Java simple

Como mencionamos en el artículo principal, este documento no aborda temas de desarrollo en profundidad. Sin embargo, hemos incluido un fragmento de código para darle una idea de cómo una aplicación Java puede incrustar una consulta XQuery. Este fragmento muestra cómo recuperar las direcciones de clientes que viven en la zona de un determinado código postal.

XQuery carece de medios para resolver los marcadores de parámetros, por lo cual, para incrustar XQuery en una aplicación Java, la consulta XQuery deberá estar contenida (o incrustada) en una instrucción SQL. La Parte 3 de esta serie desarrolló la función XMLQuery de SQL/XML, la cual usaremos en este ejemplo.

Si usted usa JDBC, la mayor parte de este ejemplo le resultará fácil de comprender. Luego de declarar y definir las variables necesarias, establezca una conexión de base de datos siguiendo el proceso DB2 estándar. A continuación, cree una cadena que contenga la instrucción de consulta. En este ejemplo definimos dos cadenas de consulta diferentes pero equivalentes: query1 y query2. Query1 usa una expresión FLWOR al igual que los ejemplos anteriores. Query2 usa una expresión de ruta más sencilla pero equivalente.

Lógicamente, el código de este ejemplo es equivalente a un ejemplo anterior (Listado 12. Expresión FLWOR con una nueva cláusula "where"), con excepción de los siguientes aspectos:

  • Este código incrusta la consulta XQuery en una instrucción SELECT de SQL. Por estar incrustada en una instrucción SQL, XQuery ya no necesita llamar a db2-fn:xmlcolumn o db2-fn:sqlquery para obtener datos de entrada, sino que obtiene sus datos de entrada de variables que le transmite SQL mediante una cláusula PASSING.
  • Este código usa un marcador de parámetro para el valor zip code (código postal).
  • Este código usa los caracteres de escape Java (barras invertidas) cuando se requieren comillas dobles en la cadena de consulta. En este ejemplo, se usan caracteres de escape en la cláusula PASSING para encerrar las variables "t," "y," y "z."
  • Este código emite explícitamente el valor del parámetro de entrada a un tipo de dato adecuado.

Arme su instrucción SELECT configurando su parámetro de entrada hacia un valor de destino definido en la variable "zipCode" Java. Aquí usamos un tipo String (cadena) porque la definición de esquema XML creada en la Parte 1 definió a los códigos postales como cadenas XML. Finalmente, ejecute la instrucción, procese el conjunto de resultados devueltos como desee y cierre la conexión con la base de datos.

Fragmento de aplicación Java que emite una consulta XQuery
. . . // define variables String zipCode = "95116";
                PreparedStatement selectStmt = null; String output = null; ResultSet rs = null; try
                { . . . // get a DB2 database connection following the standard process . . . //
                create the string for our query. // we must embed our XQuery in SQL so we can pass
                in a parameter. // furthermore, we must use escape characters around double quotes.
                // // this query uses a FLWOR expression to // obtain addresses of customers who
                live in a specific zip code. String query1 = "select xmlquery("+ " 'for $t in
                $y/Client/Address where $y/zip=$z" + "return $t' passing contactinfo as \"y\", " +
                "cast (? as varchar(5)) as \"z\") " + "from clients"; // this equivalent query uses
                a path expression for the same purpose. String query2 = "select xmlquery("+ "
                '$y/Client/Address[zip=$z]' " + " passing contactinfo as \"y\", " + "cast (? as
                varchar(5)) as \"z\") " + "from clients"; // prepare the statement and set the input
                parameter. // since the two previous query strings are equivalent, // we can use
                either one. // we're using the shorter version (query2) here. selectStmt =
                conn.prepareStatement(query2); selectStmt.setString(1, zipCode); // execute the
                statement rs = selectStmt.executeQuery(); // process the results as desired . . . //
                release resources and close the connection . . . } catch (Exception e) { . . .
                }

Volver al artículo