Tenha um início rápido com o DB2 V9 pureXML, Parte 4: Consulte dados XML do DB2 com XQuery

Retornar ao artigo

Um exemplo simples em Java

Como foi mencionado no artigo principal, não teremos tempo para discutir aqui em detalhes tópicos relacionados ao desenvolvimento de aplicativos. Porém, caso você esteja se perguntando como um aplicativo Java pode integrar uma XQuery, incluímos um trecho de código a seguir. Esse trecho mostra como recuperar os endereços de clientes que residem em um determinado CEP.

Como XQuery não fornece uma maneira de resolver marcadores de parâmetro, a integração de XQuery a um aplicativo Java requer o agrupamento (ou integração) do código XQuery em uma instrução SQL. A Parte 3 desta série discutiu a função XMLQuery de SQL/XML, que será usada neste exemplo.

Se você está familiarizado com JDBC, verá que a maior parte deste exemplo é fácil de entender. Após declarar e definir as variáveis necessárias, estabeleça uma conexão de banco de dados segundo o processo padrão do DB2. Em seguida, crie uma cadeia de caractere contendo a instrução de consulta. Neste exemplo, definimos duas cadeias de caractere de consulta diferentes, mas equivalentes: query1 e query2. Query1 usa uma expressão FLWOR, em conformidade com os exemplos anteriores. Query2 usa uma expressão de caminho mais simples, mas equivalente.

Logicamente, o código neste exemplo é equivalente a um exemplo anterior (Listagem 12. Expressão FLWOR com uma nova cláusula "where"), exceto quanto ao seguinte:

  • Ele integra a XQuery a uma instrução SQL SELECT. Quando é incluída em uma instrução SQL, a XQuery não precisa mais chamar db2-fn:xmlcolumn ou db2-fn:sqlquery para obter dados de entrada. Em vez disso, a XQuery obtém sua entrada de variáveis que lhe são passadas pela SQL por meio de uma cláusula PASSING.
  • Ela usa um marcador de parâmetro para o valor do CEP.
  • Ela usa caracteres de escape Java (barras invertidas) sempre que são necessárias aspas duplas na cadeia de caractere da consulta. Neste exemplo, elas são usados na cláusula PASSING para delimitar as variáveis "t", "y" e "z".
  • Ela converte explicitamente o valor do parâmetro de entrada para um tipo de dados apropriado.

Em seguida, você prepara a instrução SELECT, definindo o parâmetro de entrada dessa instrução como o valor de destino, que é definido na variável Java "zipCode". Usamos um tipo String aqui porque a definição do esquema XML criada na Parte 1 definiu os CEPs como cadeias de caractere XML. Finalmente, execute a instrução, processe o conjunto de resultados retornado como desejar e feche a conexão com o banco de dados.

Trecho de código de um aplicativo Java que emite uma 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) {  . . .  }

Retornar ao artigo