<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=SQLJ</id>
	<title>SQLJ - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=SQLJ"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=SQLJ&amp;action=history"/>
	<updated>2026-05-17T13:34:05Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=SQLJ&amp;diff=279938&amp;oldid=prev</id>
		<title>imported&gt;Amraleth: /* growthexperiments-addlink-summary-summary:2|1|0 */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=SQLJ&amp;diff=279938&amp;oldid=prev"/>
		<updated>2024-10-16T00:01:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;growthexperiments-addlink-summary-summary:2|1|0&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;!--Bitte benachrichtigt mich beim Löschen! [[Benutzer:Flominator|Flominator]] 22:35, 12. Mär 2005 (CET)--&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SQLJ&amp;#039;&amp;#039;&amp;#039; ist ein mittlerweile veralteter Arbeitstitel für Bestrebungen, Java und SQL zusammenzuführen. SQLJ Teil 0 definiert die Möglichkeit, SQL Statements in Java-Programme einzubinden. Teil 0 wurde mittlerweile als Teil 10 &amp;#039;&amp;#039;[[SQL#Sprachstandard|Object Language Bindings (SQL/OLB)]]&amp;#039;&amp;#039; des Standards ISO/IEC 9075 der Datenbanksprache [[SQL]] übernommen. Die Teile 1 und 2 beschreiben den umgekehrten Weg, nämlich Java Klassen (Routines and Types) in SQL Statements anzusprechen. Teil 1 und 2 wurden als &amp;#039;&amp;#039;SQL Teil 13 SQL Routines and Types Using the Java Programming Language&amp;#039;&amp;#039; in SQL standardisiert.&lt;br /&gt;
&lt;br /&gt;
Im Folgenden steht der Begriff SQLJ als Synonym für SQLJ Part 0.&lt;br /&gt;
&lt;br /&gt;
Mit SQLJ ist [[Embedded SQL]] für Java definiert. Im Gegensatz dazu stellt [[Java Database Connectivity|JDBC]] eine [[Programmierschnittstelle|API]] bereit.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
Die eingebettete SQL-Anweisungen haben das folgende Format:&lt;br /&gt;
  &amp;#039;&amp;#039;&amp;#039;#sql [[&amp;lt;context&amp;gt;]] { &amp;lt;SQL-Anweisung&amp;gt; }&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
Sie beginnen mit der Zeichenfolge #sql, können mehrere Zeilen umfassen und enden mit einem Semikolon. Sie können Java-Variablen (:x) und Ausdrücke :(y + z) enthalten.&lt;br /&gt;
&lt;br /&gt;
== Vor- und Nachteile ==&lt;br /&gt;
SQLJ bietet mehrere Vorteile:&lt;br /&gt;
&lt;br /&gt;
* die Programmierung ist im Vergleich zu [[Java Database Connectivity|JDBC]] wesentlich einfacher, da SQLJ direkt auf Variablen des umgebenden Java-Codes zugreifen kann.&lt;br /&gt;
* im Falle von SQLJ für IBMs [[Db2|DB2]] besteht eine bessere Authentifizierungskontrolle, da Benutzerrechte nicht auf Basis von Tabellen, sondern auf Basis von gebundenen SQLJ Profilen (Packages) geprüft werden, damit ist eine programmorientierte Berechtigung möglich.&lt;br /&gt;
* Der SQLJ Translator überprüft die Syntax und Semantik von SQL-Anweisungen. Es besteht so die Möglichkeit, die Anweisungen gegen das Datenbankschema zu prüfen, wobei SQL-Fehler frühzeitig entdeckt und behoben werden können. Im Gegensatz hierzu werden bei Verwendung von JDBC Fehler erst zur Laufzeit erkannt.&lt;br /&gt;
&lt;br /&gt;
Nachteile sind:&lt;br /&gt;
&lt;br /&gt;
* SQLJ-Programme müssen mittels eines [[Präprozessor]]s in Java-Quelltext transformiert werden&lt;br /&gt;
* die SQLJ Syntax wird von vielen [[Integrierte Entwicklungsumgebung|Entwicklungsumgebungen]] nicht erkannt&lt;br /&gt;
* SQLJ wird durch gängige Persistenz-Frameworks wie [[Hibernate (Framework)|Hibernate]] nicht unterstützt&lt;br /&gt;
* Der Präprozessor versteht, Stand Anfang 2006, noch keine Elemente der [[Java-Syntax]], die mit den Versionen 1.4 ([[assert]]) und 5.0 ([[Generische Programmierung in Java 5.0|Generische Typen]], &amp;#039;&amp;#039;Extended For Loop&amp;#039;&amp;#039; u.&amp;amp;nbsp;a.) eingeführt wurden.&lt;br /&gt;
* Der Präprozessor lädt unter Umständen Klassen, von denen die zu übersetzende Klasse abhängt. Dadurch werden ggf. Klasseninitialisierer ausgeführt, was u.&amp;amp;nbsp;U. Nebenwirkungen auslöst oder die [[Übersetzungszeit]] verlängert.&lt;br /&gt;
&lt;br /&gt;
== Beispiele und Vergleich mit JDBC ==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Beispiele vergleichen SQLJ-Syntax mit [[Java Database Connectivity|JDBC]]-Aufrufen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; | JDBC&lt;br /&gt;
! width=&amp;quot;50%&amp;quot; | SQLJ&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | Abfrage&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
 PreparedStatement stmt = conn.prepareStatement(&lt;br /&gt;
    &amp;quot;SELECT LASTNAME&amp;quot;&lt;br /&gt;
  + &amp;quot; , FIRSTNAME&amp;quot;&lt;br /&gt;
  + &amp;quot; , SALARY&amp;quot;&lt;br /&gt;
  + &amp;quot; FROM DSN8710.EMP&amp;quot;&lt;br /&gt;
  + &amp;quot; WHERE SALARY BETWEEN ? AND ?&amp;quot;);&lt;br /&gt;
 stmt.setBigDecimal(1, min);&lt;br /&gt;
 stmt.setBigDecimal(2, max);&lt;br /&gt;
 ResultSet rs = stmt.executeQuery();&lt;br /&gt;
 while (rs.next()) {&lt;br /&gt;
   lastname = rs.getString(1);&lt;br /&gt;
   firstname = rs.getString(2);&lt;br /&gt;
   salary = rs.getBigDecimal(3);&lt;br /&gt;
   // Zeile drucken...&lt;br /&gt;
 }&lt;br /&gt;
 rs.close();&lt;br /&gt;
 stmt.close();&lt;br /&gt;
|&lt;br /&gt;
 #sql private static iterator EmployeeIterator(String, String, BigDecimal);&lt;br /&gt;
 ...&lt;br /&gt;
 EmployeeIterator iter;&lt;br /&gt;
 #sql [ctx] iter = {&lt;br /&gt;
   SELECT LASTNAME&lt;br /&gt;
        , FIRSTNME&lt;br /&gt;
        , SALARY&lt;br /&gt;
     FROM DSN8710.EMP&lt;br /&gt;
    WHERE SALARY BETWEEN :min AND :max&lt;br /&gt;
 };&lt;br /&gt;
 while (true) {&lt;br /&gt;
   #sql {&lt;br /&gt;
     FETCH :iter&lt;br /&gt;
      INTO :lastname, :firstname, :salary&lt;br /&gt;
   };&lt;br /&gt;
   if (iter.endFetch()) break;&lt;br /&gt;
   // Zeile drucken...&lt;br /&gt;
 }&lt;br /&gt;
 iter.close();&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | Abfrage, die genau eine Zeile liefert&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
 PreparedStatement stmt = conn.prepareStatement(&lt;br /&gt;
     &amp;quot;SELECT MAX(SALARY), AVG(SALARY)&amp;quot;&lt;br /&gt;
   + &amp;quot; FROM DSN8710.EMP&amp;quot;);&lt;br /&gt;
 rs = statement.executeQuery();&lt;br /&gt;
 if (!rs.next()) {&lt;br /&gt;
   // Fehler -- nichts gefunden&lt;br /&gt;
 }&lt;br /&gt;
 maxSalary = rs.getBigDecimal(1);&lt;br /&gt;
 avgSalary = rs.getBigDecimal(2);&lt;br /&gt;
 if (rs.next()) {&lt;br /&gt;
   // Fehler -- mehr als ein Treffer&lt;br /&gt;
 }&lt;br /&gt;
 rs.close();&lt;br /&gt;
 stmt.close();&lt;br /&gt;
|&lt;br /&gt;
 #sql [ctx] {&lt;br /&gt;
   SELECT MAX(SALARY), AVG(SALARY)&lt;br /&gt;
     INTO :maxSalary, :avgSalary&lt;br /&gt;
     FROM DSN8710.EMP&lt;br /&gt;
 };&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; | INSERT&lt;br /&gt;
|-&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
 PreparedStatement stmt = conn.prepareStatement(&lt;br /&gt;
    &amp;quot;INSERT INTO DSN8710.EMP &amp;quot; +&lt;br /&gt;
    &amp;quot;(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) &amp;quot;&lt;br /&gt;
  + &amp;quot;VALUES (?, ?, ?, ?, CURRENT DATE, ?)&amp;quot;);&lt;br /&gt;
 stmt.setString(1, empno);&lt;br /&gt;
 stmt.setString(2, firstname);&lt;br /&gt;
 stmt.setString(3, midinit);&lt;br /&gt;
 stmt.setString(4, lastname);&lt;br /&gt;
 stmt.setBigDecimal(5, salary);&lt;br /&gt;
 stmt.executeUpdate();&lt;br /&gt;
 stmt.close();&lt;br /&gt;
|&lt;br /&gt;
 #sql [ctx] {&lt;br /&gt;
   INSERT INTO DSN8710.EMP&lt;br /&gt;
     (EMPNO,  FIRSTNME,   MIDINIT,  LASTNAME,  HIREDATE,     SALARY)&lt;br /&gt;
   VALUES&lt;br /&gt;
     (:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary)&lt;br /&gt;
 };&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.redbooks.ibm.com/abstracts/sg246435.html IBM Redbook: DB2 for z/OS and OS/390: Ready for Java]&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Sqli}}&lt;br /&gt;
[[Kategorie:Datenbanksprache]]&lt;br /&gt;
[[Kategorie:SQL]]&lt;br /&gt;
[[Kategorie:Java (Programmiersprache)]]&lt;br /&gt;
[[Kategorie:Abkürzung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Amraleth</name></author>
	</entry>
</feed>