پرش به محتوا

SQLJ

از ویکی‌پدیا، دانشنامهٔ آزاد

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 ، در تضاد است.

استانداردهای ANSI و ISO[ویرایش]

  • SQLJ قسمت 0: ANSI X3.135.10-1998، "SQL زبان پایگاه داده—بخش 10: اتصالات زبان شی (SQL/OLB)"
  • SQLJ قسمت 1: ANSI NCITS 331.1-1999، "SQLJ—Part 1: SQL Routines Using the Java Programming Language"
  • SQLJ قسمت 2: ANSI NCITS 331.2-2000، "SQLJ—بخش 2: انواع SQL با استفاده از زبان برنامه نویسی جاوا"

قسمت 0 برای سازگاری JDBC 2.0 به روز شد و در سال 2000 توسط ISO تأیید شد. دو بخش آخر هنگام ارسال به ISO با هم ترکیب شدند. قسمت 2 اساساً برای ارسال ISO بازنویسی شد زیرا نسخه ANSI به اندازه کافی رسمی برای یک مشخصات نبود و به سبک یک کتابچه راهنمای کاربر نزدیکتر بود. نسخه ترکیبی در سال 2002 تصویب شد.

  • ISO/IEC 9075-10:2000، فناوری اطلاعات-زبان های پایگاه داده-SQL-بخش 10: پیوندهای زبان شی (SQL/OLB)
  • ISO/IEC 9075-13:2002، فناوری اطلاعات-زبان های پایگاه داده-SQL-بخش 13: روال ها و انواع SQL با استفاده از زبان برنامه نویسی جاوا (SQL/JRT) .

SQLJ قسمت 0[ویرایش]

مشخصات بخش 0 SQLJ عمدتاً از اوراکل نشات گرفته است که اولین پیاده سازی مرجع را نیز ارائه کرد.

در زیر SQLJ مترادف SQLJ قسمت 0 است.

در حالی که JDBC یک API ارائه می دهد، SQLJ از یک پسوند زبان تشکیل شده است. بنابراین برنامه های حاوی SQLJ باید قبل از کامپایل شدن از طریق یک پیش پردازنده (مترجم SQLJ) اجرا شوند.

مزایا:[ویرایش]

برخی از مزایای SQLJ نسبت به JDBC عبارتند از:

  • دستورات SQLJ نسبت به برنامه های JDBC معادل کوتاه تر هستند.
  • دستورات SQL را می توان در زمان کامپایل بررسی کرد. نتایج پرس و جو برگشتی را نیز می توان به شدت بررسی کرد.
  • پیش پردازنده ممکن است SQL ثابت تولید کند که بهتر از SQL پویا عمل می کند زیرا کویری در زمان کامپایل برنامه ایجاد می شود، در پایگاه داده ذخیره می شود و در زمان اجرا مجددا استفاده می شود. Static SQL می تواند ثبات طرح دسترسی را تضمین کند. IBM DB2 از استفاده Static SQL در برنامه های SQLJ پشتیبانی می کند.

معایب:[ویرایش]

  • SQLJ به یک مرحله پیش پردازش نیاز دارد.
  • بسیاری از IDE ها از SQLJ پشتیبانی نمی کنند.
  • SQLJ از بسیاری از فروم ورک های پایداری رایج مانند Hibernate پشتیبانی نمی‌کند.
  • Oracle 18c (12.2) از SQLJ در پایگاه داده پشتیبانی نمی کند.

مثال ها:[ویرایش]

مثال‌های زیر سینتکس 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)
};

همچنین ببینید[ویرایش]

  • Embedded SQL
  • Language Integrated Query (LINQ)

منابع[ویرایش]

Jim Melton (2003). Advanced SQL: 1999. Morgan Kaufmann. pp. 352-364. ISBN 978-1-55860-677-7.

بیشتر خواندن[ویرایش]