XSQL Pages
Vorteile von XSQL Pages
einfache Generierung von XML-Dokumenten auf der Basis von SQL Queries
erlaubt Insert-, Update- und Delete-Operationen
unterstützt XSL Transformation durch
Anwendung von XML Stylesheets, beliebige Zielformate wie z.B. HTML
dient als Input für den XSQL Page Processor
Trennung der Daten von ihrer Darstellung
XSQL Page Verarbeitung
Bestandteile
XSQL Pages
–
SQL Queries
–
DML und DDL in XML Tags
XSQL Page Processor (in Java)
–
nimmt XSQL Pages als Input
–
erzeugt dynamische XML Seiten mit den Ergebnissen der SQL- Queries
XSQL Servlet
–
erlaubt XSQL Page Verarbeitung im Web
Erweiterbare Stylesheets
–
optional während XSQL-Verarbeitung
–
XSL Transformationen zur Formatierung des Output
Verarbeitung von XSQL Pages
<?xml version=“1.0“ ?>
<xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“>
SELECT ‘Hello World‘ AS greeting FROM DUAL
</xsql:query>
<?xml version=“1.0“ ?>
<xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“>
SELECT ‘Hello World‘ AS greeting FROM DUAL
</xsql:query>
XSQL Page Input
XML Output
<ROWSET>
<ROW num=“1“>
<GREETING>Hello World</GREETING>
</ROW>
</ROWSET>
<ROWSET>
<ROW num=“1“>
<GREETING>Hello World</GREETING>
</ROW>
</ROWSET>
Einführendes Beispiel
XSQL Queries und Connections
XSQL Page erlaubt die Definition von SQL Queries
Query ist eingebettet in ein xsql:query Tag
Connection-Attribut definiert die Verbindungsinformaiton zur Datenbank
Connection Name wird aufgelöst in einer
Konfigurationsdatei XSQLConfig.xml (in xsql/lib )
Beispiel
<connectiondefs>
<connection name=“demo“>
<username>xuser</username>
<password>xuser</password>
<dburl>jdbc:oracle:thin:@localhost:1521:mydb</dburl>
<driver>oracle.jdbc.driver.OracleDriver</driver>
</connection>
...
</connectiondefs>
<connectiondefs>
<connection name=“demo“>
<username>xuser</username>
<password>xuser</password>
<dburl>jdbc:oracle:thin:@localhost:1521:mydb</dburl>
<driver>oracle.jdbc.driver.OracleDriver</driver>
</connection>
...
</connectiondefs>
XSQL Page Processor Architektur
XSL Stylesheet
XSQL Page
XML o.a.
Formate
XSQLConfig
Datenbank XSQL Page Processor
XSLT
XML Parser
XML Utility
JDBC
Überblick über XSQL Tags
<xsql:query>
–
Ausführung eines beliebigen SQL-Statements und Einfügen Result Set in kanonischem XML-Format
<xsql:dml>
–
Ausführung eines beliebigen DML-Statements oder anonymen PL/SQL-Blocks
<xsql:set-stylesheet-param>
–
Setze Top-Level-Stylesheet Parameter in XSLT-Stylesheet
–
value -Attribut oder SQL-Statement als Inhalt
<xsql:insert-request>
–
Einfügen XML-Dokument, das in Request gesendet wurde, in DB-Tabelle oder Sicht
<xsql:include-xml>
–
Einfügen beliebiges XML-Dokument durch Angabe URL
Überblick über XSQL Tags (2)
<xsql:include-request-params>
Einfügen XML-Fragment in der XSQL-Page:
– Namen und Werte aller HTTP-Parameter
– Cookies und Session Variable
<xsql:include-xsql>
– Einfügen des XML-Outputs einer anderen XSQL-Page
<xsql:include-owa>
– Ausführen eines PL/SQL Stored Procedure, die OWA-Package zur Erzeugung von XML-Inhalt verwendet
– Einfügen des XML-Fragments
<xsql:action>
– Aufruf eines benutzerdefinierten Action Handlers (implementiert in Java)
<xsql:ref-cursor-function>
– Einfügen der XML-Repräsentation eines Result Sets eines Cursors, der durch eine PL/SQL Stored Functions zurückgeliefert wird
Überblick über XSQL Tags (3)
<xsql:include-param>
–
Einfügen eines Parameters und seines Wertes als Element in der XSQL Page
<xsql:set-session-param>
–
Setze HTTP-Session-Parameter, deren Werte über Page Request hinaus erhalten bleiben
<xsql:set-page-param>
–
Setze Page-Parameter
–
Genutzt für parametrisierte SQL-Befehle
<xsql:set-cookie>
–
Setze den Wert von HTTP-Cookie (Alter, Domain)
<xsql:insert-param>
–
Einfügen von Parameterwerten in DB-Tabelle oder View
–
Nutzbar für XML-Dokumente als HTTP-Parameter
Anpassung von XSQL Queries
Attribute für xsql:query :
Name Beschreibung
rowset-element Elementname für Query-Ergebnis, Default ist
<ROWSET>, wenn leerer String: Element für Rowset wird unterdrückt
row-element Elementname für Zeile
max-rows Maximale Anzahl gewünschter Zeilen, sinnvoll z.B. für Top-N-Queries
skip-rows Anzahl zu überspringender Zeilen vor Rückgabe des Ergebnisses
id-attribute Attributname für id-Attribut in jeder Ergebniszeile
id-attribute-column Zu nutzender Spaltenname für id-Attribut
null-indicator Wenn y oder yes: Nutze null-indicator-Attribut für NULL-Werte (Default: Weglassen des jeweiligen Elements)
XSQL Query Parameter
Beispiel: Deklaration einer parametrisierten Query in einer XSQL Page
Die Parameterwerte können in einer URL geliefert werden, z.B.:
http://localhost/xsql/demo/emp.xsql?find=A&sort=SAL
<?xml version=“1.0“ ?>
<?xml-stylesheet type=“text/xsl“ href=“emp.xsl“?>
<xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“>
find=“%“ sort=“ENAME“ null-indicator=“yes“>
SELECT * FROM EMP WHERE ENAME LIKE ‘%{@find}%‘
ORDER BY {@sort}
</xsql:query>
<?xml version=“1.0“ ?>
<?xml-stylesheet type=“text/xsl“ href=“emp.xsl“?>
<xsql:query connection=“demo“ xmlns:xsql=“urn:oracle-xsql“>
find=“%“ sort=“ENAME“ null-indicator=“yes“>
SELECT * FROM EMP WHERE ENAME LIKE ‘%{@find}%‘
ORDER BY {@sort}
</xsql:query>
XSQL Tag Attribute für DML
Für alle DML-Operationen muß Zieltabelle spezifiziert werden:
<xsql:insert-request table=“purchase_order“
transform=“order-to-rowset.xsl“/>
<xsql:insert-request table=“purchase_order“
transform=“order-to-rowset.xsl“/>
Für Update und Delete Angabe eines Key notwendig
<xsql:update-request table=“dept“ transform=“doc-to-dept.xsl“
key-columns=“deptno“/>
<xsql:update-request table=“dept“ transform=“doc-to-dept.xsl“
key-columns=“deptno“/>
<xsql:delete-request table=“dept“ transform=“doc-to-dept.xsl“
key-column=“deptno“/>
<xsql:delete-request table=“dept“ transform=“doc-to-dept.xsl“
key-column=“deptno“/>
Angabe eines Stylesheets erforderlich für Umwandlung
kanonische <ROWSET>/<ROW>-Struktur
XSQL Tag Attribute für DML (Beispiel)
<?xml version = ‘1.0‘?>
<?xml-stylesheet type=“text/xsl“ href=“newsstorylist.xsl“?>
<page connection=“demo“ xmlns:xsql=“urn:oracl-xsql“>
<xsql:insert-request table=“newsstory“
transform=“moreover-to-newsstory.xsl“/>
<latestnews>
<xsql:query max-rows=“10“>
SELECT id,title,url AS h_url FROM newsstory ORDER BY id DESC
</xsql:query>
</latestnews>
</page>
<?xml version = ‘1.0‘?>
<?xml-stylesheet type=“text/xsl“ href=“newsstorylist.xsl“?>
<page connection=“demo“ xmlns:xsql=“urn:oracl-xsql“>
<xsql:insert-request table=“newsstory“
transform=“moreover-to-newsstory.xsl“/>
<latestnews>
<xsql:query max-rows=“10“>
SELECT id,title,url AS h_url FROM newsstory ORDER BY id DESC
</xsql:query>
</latestnews>
</page>
Aufruf von Stored Procs aus XSQL
Aufruf von Stored Procedures aus XSQL mittels
<xsql:dml> Tag:
- Stored Procedures in PL/SQL oder Java - Aufruf von anonymen PL/SQL erlaubt Beispiele:
<xsql:dml>
my_package.my_procedure(‘{@dname}‘);
</xsql:dml>
<xsql:dml>
my_package.my_procedure(‘{@dname}‘);
</xsql:dml>
<!– Anonymer Block, der Statements kombiniert -->
<xsql:dml>
BEGIN
INSERT INTO dept (deptno,dname)VALUES ({@dept},‘{@dname}‘);
my_package.my_procedure (‘{@dname}‘);
END;
</xsql:dml>
<!– Anonymer Block, der Statements kombiniert -->
<xsql:dml>
BEGIN
INSERT INTO dept (deptno,dname)VALUES ({@dept},‘{@dname}‘);
my_package.my_procedure (‘{@dname}‘);
END;
</xsql:dml>
XSQL Custom Actions (1)
Implementierung von benutzerdefinierten Action Handlers mittels xsql:action Tags:
<?xml version =‘1.0‘?>
<xsql:action handler=“JavaDate“ xmlns:xsql=“urn:oracle-xsql“
format=“dd.MM.yyyy“ mask=“{@format}“/>
<?xml version =‘1.0‘?>
<xsql:action handler=“JavaDate“ xmlns:xsql=“urn:oracle-xsql“
format=“dd.MM.yyyy“ mask=“{@format}“/>
Einbeziehung von Business-Logik, z.B.:
• Aufruf von DB-Sequenzen
• Formatierung von Daten
• Manipulation von XML-Dokumenten Klasse JavaDate = Action Handler
Attribut mask liefert Parameterwert für Java-Applikation
XSQL Custom Actions (2)
Java-Klasse ist entweder:
Implementation des XSQLActionHandler Interface
Erweiterung der Basis-Implementationsklasse XSQLActionandlerImpl
public class JavaDate extends XSQLActionHandlerImpl { public void handleAction (Node root) {
String mask = getAttributeAllowingParm (“mask“,getActionElement());
String dateValue = null;
SimpleDateFormat sdf = new SimpleDataFormat (mask);
dateValue = sdf.format (new Date()).toString());
addResultElement (root,“CurrentDate“,dateValue);
} }
public class JavaDate extends XSQLActionHandlerImpl { public void handleAction (Node root) {
String mask = getAttributeAllowingParm (“mask“,getActionElement());
String dateValue = null;
SimpleDateFormat sdf = new SimpleDataFormat (mask);
dateValue = sdf.format (new Date()).toString());
addResultElement (root,“CurrentDate“,dateValue);
} }
Aufruf des XSQL Page Processor
Kommando- zeile
XSQL Page Processor Java-
Applikation
XSQL- Servlet
Java Server Page
XSQL-Aufruf aus Kommandozeile
Beispiel:
Fluginformationen aus San Francisco mittels XSQL Command Line Utility abrufen:
>xsql airport.xsql airport=sfo xsql-stylesheet=none
Abhängig von XSQL-Page werden Aktionen
aufgerufen. URL spezifiziert XML-Quelle, die in XSQL-Page eingefügt werden soll
>xsql insertnewsstory.xsql
posted-xml=http://www.news.com/source
XSQL-Aufruf aus Java-Programm
Verwende oracle.xml.xsql.XSQLRequest() :
public static void main (String[] args) throws Exception { // Erzeuge Instanz einer XSQLRequest-Klasse
URL pageUrl = new URL(“file:///C:/foo/bar.xsql“);
XSQLRequest req = new XSQLRequest(pageUrl);
// Speichere Parameter in Hashtabelle Hashtable params = new Hashtable(3);
params.put(“param1“,“value1“);
params.put(“param2“,“value2“);
// Verarbeite Seite, übergebe Parameter // Gebe Ergebnis auf Out-Stream aus
req.process(params, new PrintWriter(System.out), new PrintWriter(System.err));
}
public static void main (String[] args) throws Exception { // Erzeuge Instanz einer XSQLRequest-Klasse
URL pageUrl = new URL(“file:///C:/foo/bar.xsql“);
XSQLRequest req = new XSQLRequest(pageUrl);
// Speichere Parameter in Hashtabelle Hashtable params = new Hashtable(3);
params.put(“param1“,“value1“);
params.put(“param2“,“value2“);
// Verarbeite Seite, übergebe Parameter // Gebe Ergebnis auf Out-Stream aus
req.process(params, new PrintWriter(System.out), new PrintWriter(System.err));
}
XSQL Servlet-Umgebung
Aufgaben von XSQL Servlets
– empfangen web-basierte Requests von Web-Clients
– verarbeiten XSQL-Pages
– liefern XML an den aufrufenden Client zurück
– (optional) transformieren die Information in irgendein anderes Format (z.B. XML, HTML, Text)
XSQL Servlets basieren auf Servlet Java-Klassen (Servlet 2.1-Spezifikation)
XSQL Page Processor XSQL Servlet
Web-Browser
Oracle-Datenbank Web Server mit Servlet Engine
http JDBC
XSQL und Java Server Pages (JSP)
Java Server Pages
–
ermöglichen dokumentzentrischen Ansatz zur Entwicklung von dynamischen Web-Content
–
werden vor Ausführung in Servlets übersetzt
JSP Tags zum Aufruf von XSQL-Pages
–
<jsp:include page=“foo.xsql“>
–
<jsp:forward page=“bar.xsql“>
Oracle Servlet Laufzeitumgebung
Oracle Servlet Engine (OSE)
–
komplette Laufzeitumgebung für XSQL Pages und Servlet-Verarbeitung
–
Konfiguration in
Oracle Datenbank (seit 8.1.7)
Internet Application Server (iAS)
Oracle HTTP-Server (powered by Apache)
Oracle Web-to-Go
–
Single-User Server, vorkonfiguriert für XSQL Pages
–
zum Entwickeln und Testen von XSQL Pages
–
unterstützt Servlet 2.1 API
–