Oracle XQJ und OXQDatasource - XQuery Beispiele

du-it

Grünschnabel
Hallo.

Ich beschäftige mich gerade mit Oracle's XQJ Implementierung und frage mich, wie ich damit gegen eine Daetnbank connecten kann?
Wenn ich
Code:
OXQDataSource xqds = new OXQDataSource();

und davon eine Connection hole, woher weiss Java(?), dass er gegen eine bestimmte Datenbank connecten soll?

Das Setzen von Properties auf der OXQDataSource wird nicht unterstützt, denn der Vesuch führt immer zu:
Code:
javax.xml.xquery.XQException: property name is not recognized. This implementation does not support any properties
	at oracle.xquery.xqj.OXQDataSource.setProperty(OXQDataSource.java:107)
 
Hallo, Tom.

Die Seite hatte ich schon gelesen, aber trotzdem: Danke.
Womöglich fehlt mir da ein wenig bzgl. des Handlings mit DataSources, aber wie teile ich Java denn mit, auf welche Datenbank bspw. zugegriffen werden soll?
Wenn ich jetzt eine DB mit XML Dokumenten habe (eine Spalte als Oracle's XMLType definiert). Woher weiss der Code:
Code:
OXQDataSource xqjd = new OXQDataSource();
XQConnection xqjc = xqjd.getConnection();

, dass er auf meine spezielle DB zugreifen soll? Ich will ja mit der XQuery, die ich habe, ein bestimmtes XML Dokument aus meiner speziellen DB holen, um darauf zu arbeiten. Ich habe da etwas von JNDI gelesen, doch damit habe ich noch keine Erfahrung.
 
Hallo,

wenn du mit XQuery unter Oracle XML Dokumente abfragen möchtest, musst du dich (IMHO), wie im Link gezeigt, erst explizit per JDBC mit der Datenbank verbinden.
Anschließend kannst du deine XQuery Abfrage gegen die Datenbank richten.

Java:
import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;
class JDBCXQuery
{
 public static void main (String args[]) throws SQLException
 {
  OracleDataSource ods = new OracleDataSource();
  ods.setURL("jdbc:oracle:thin:hr/hr@localhost:1521/orcl11g");
  Connection conn = ods.getConnection();
  Statement stmt = conn.createStatement();
  String qry = "SELECT * FROM XMLTable("+
      "'for $i in $h/employees/employee " +
       "return $i '" +
       "PASSING xmlparse(document " +
       "httpuritype('http://localhost/bonuses.xml').getCLOB()) as \"h\" " +
       "COLUMNS ename VARCHAR2(45) PATH '/employee/ename', " +
       "        bonus NUMBER(10,2) PATH '/employee/bonus' )";
  ResultSet rs = stmt.executeQuery(qry);
  System.out.println("Bonuses:");
  while(rs.next())
       System.out.println(rs.getString(1) + ": $" + rs.getFloat(2));
 }
}
Siehe auch:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14259/xdb_xquery.htm#sthref1673

Oracle verwendet wohl (IMHO) intern einfach diese Java basierte XQuery Implementierung (XQJ) zur Unterstützung von Abfragen mit XQuery in der Datenbank. Zusätzlich kann man nun die Bibliothek auch in anderen Java Anwendungen ohne Datenbank verwenden.
Java:
package de.tutorials.training;

import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQResultSequence;

import oracle.xquery.xqj.OXQDataSource;

public class OracleXQJExample {
    public static void main(String[] args) throws Exception {
	OXQDataSource xqjd = new OXQDataSource();
	XQConnection xqjc = xqjd.getConnection();

	System.out.println("Generate Data: ");
	XQPreparedExpression expression = xqjc.prepareExpression("for $n in 1 to 10 return <value>{$n*$n}</value>");
	XQResultSequence resultSequence = expression.executeQuery();
	while (resultSequence.next()) {
	    System.out.println(resultSequence.getItemAsString(null));
	}

	System.out.println("Query data from XML File: ");
	XQPreparedExpression pEx = xqjc.prepareExpression(
			"for $p in fn:doc('file:///D:/training/java/workspace/de.tutorials.training/NewFile.xml')//participant " +
			"return fn:concat($p/firstName, ' ', $p/lastName)");
	XQResultSequence rslt = pEx.executeQuery();
	while (rslt.next()) {
	    System.out.println(rslt.getAtomicValue());
	}
	xqjc.close();
    }
}

Ausgabe:
Code:
Generate Data: 
<value>1</value>
<value>4</value>
<value>9</value>
<value>16</value>
<value>25</value>
<value>36</value>
<value>49</value>
<value>64</value>
<value>81</value>
<value>100</value>
Query data from XML File: 
A AA
B BB
C CC
D DD

NewFile.xml:
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<course>
	<name>ABC</name>
	<participants>
		<participant>
			<fieldOfStudy>1</fieldOfStudy>
			<firstName>A</firstName>
			<lastName>AA</lastName>
			<matriculationNumber>X</matriculationNumber>
		</participant>
		<participant>
			<fieldOfStudy>2</fieldOfStudy>
			<firstName>B</firstName>
			<lastName>BB</lastName>
			<matriculationNumber>Y</matriculationNumber>
		</participant>
		<participant>
			<fieldOfStudy>3</fieldOfStudy>
			<firstName>C</firstName>
			<lastName>CC</lastName>
			<matriculationNumber>X</matriculationNumber>
		</participant>
		<participant>
			<fieldOfStudy>4</fieldOfStudy>
			<firstName>D</firstName>
			<lastName>DD</lastName>
			<matriculationNumber>Z</matriculationNumber>
		</participant>
	</participants>
</course>

Siehe auch:
http://www.tutorials.de/java/307708-xqj-beispiel-fuer-ein-xqdatasource-objekt.html

Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
Ich komme erst heute dazu, mir das anzugucken. Danke.

Ich dachte, dass XQueries, die für den Zugriff auf eine bisherige XML DB verwendet wurden, mit XQJ ohne weitere Veränderungen verwendet werden könnten, ohne dass eine Anpassung auf die XMLQuery/XMLTabel Funktion erfolgen müsste.
 
Zurück