SQLJ عنوانی کاربردی برای تلاش برای ترکیب جاوا و SQL است. این تلاش مشترک در حدود سال 1997 توسط مهندسان IBM Oracle، Compaq ، Informix ، Sybase ، Cloudscape و Sun Microsystems بود.
از سه بخش 0، 1 و 2 تشکیل شده است. قسمت 0 تعبیه عبارات SQL در برنامه های جاوا را توصیف میکند .QLJ قسمت 0 اساس بخش 10 استاندارد SQL:1999 است که با نام SQL Object Language Bindings (SQL/OLB) شناخته می شود. بخشهای 1 و 2 SQLJ امکان معکوس استفاده از کلاسهای جاوا (روالها و انواع) از دستورات SQL را توضیح میدهد. بخشهای 1 و 2 مبنای قسمت 13 استاندارد SQL، روالها و انواع SQL با استفاده از زبان برنامهنویسی جاوا (SQL/JRT) هستند.
"SQLJ" معمولاً برای اشاره به بخش 0 SQLJ استفاده می شود، معمولاً زمانی که با سایر ابزارهای جاسازی SQL در جاوا، مانند JDBC ، در تضاد است.
قسمت 0 برای سازگاری JDBC 2.0 به روز شد و در سال 2000 توسط ISO تأیید شد. دو بخش آخر هنگام ارسال به ISO با هم ترکیب شدند. قسمت 2 اساساً برای ارسال ISO بازنویسی شد زیرا نسخه ANSI به اندازه کافی رسمی برای یک مشخصات نبود و به سبک یک کتابچه راهنمای کاربر نزدیکتر بود. نسخه ترکیبی در سال 2002 تصویب شد.
مشخصات بخش 0 SQLJ عمدتاً از اوراکل نشات گرفته است که اولین پیاده سازی مرجع را نیز ارائه کرد.
در زیر SQLJ مترادف SQLJ قسمت 0 است.
در حالی که JDBC یک API ارائه می دهد، SQLJ از یک پسوند زبان تشکیل شده است. بنابراین برنامه های حاوی SQLJ باید قبل از کامپایل شدن از طریق یک پیش پردازنده (مترجم SQLJ) اجرا شوند.
برخی از مزایای SQLJ نسبت به JDBC عبارتند از:
مثالهای زیر سینتکس SQLJ را با استفاده از JDBC مقایسه میکنند.
JDBC | SQLJ |
---|---|
PreparedStatement stmt = conn.prepareStatement( "SELECT LASTNAME" + " , FIRSTNME" + " , SALARY" + " FROM DSN8710.EMP" + " WHERE SALARY BETWEEN ? AND ?"); stmt.setBigDecimal(1, min); stmt.setBigDecimal(2, max); ResultSet rs = stmt.executeQuery(); while (rs.next()) { lastname = rs.getString(1); firstname = rs.getString(2); salary = rs.getBigDecimal(3); // Print row... } rs.close(); stmt.close(); |
#sql private static iterator EmployeeIterator(String, String, BigDecimal); ... EmployeeIterator iter; #sql [ctx] iter = { SELECT LASTNAME , FIRSTNME , SALARY FROM DSN8710.EMP WHERE SALARY BETWEEN :min AND :max }; do { #sql { FETCH :iter INTO :lastname, :firstname, :salary }; // Print row... } while (!iter.endFetch()); iter.close(); |
JDBC | SQLJ |
---|---|
PreparedStatement stmt = conn.prepareStatement( "SELECT MAX(SALARY), AVG(SALARY)" + " FROM DSN8710.EMP"); rs = stmt.executeQuery(); if (!rs.next()) { // Error—no rows found } maxSalary = rs.getBigDecimal(1); avgSalary = rs.getBigDecimal(2); if (rs.next()) { // Error—more than one row found } rs.close(); stmt.close(); |
#sql [ctx] { SELECT MAX(SALARY), AVG(SALARY) INTO :maxSalary, :avgSalary FROM DSN8710.EMP }; |
JDBC | SQLJ |
---|---|
stmt = conn.prepareStatement( "INSERT INTO DSN8710.EMP " + "(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) " + "VALUES (?, ?, ?, ?, CURRENT DATE, ?)"); stmt.setString(1, empno); stmt.setString(2, firstname); stmt.setString(3, midinit); stmt.setString(4, lastname); stmt.setBigDecimal(5, salary); stmt.executeUpdate(); stmt.close(); |
#sql [ctx] { INSERT INTO DSN8710.EMP (EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) VALUES (:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary) }; |
Jim Melton (2003). Advanced SQL: 1999. Morgan Kaufmann. pp. 352-364. ISBN 978-1-55860-677-7.