English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في الوقت الذي نتعلمتعليمات JDBCفي هذا الفصل، تعلمنا كيفية استخدام العملية التخزينية في JDBC. هذا الفصل مشابه ولكن سيعطيك معلومات إضافية حول قواعد النصوص في JDBC.
مثلما يتم إنشاء عمولة Connection لإنشاء Statement و PreparedStatement، يتم إنشاء عمولة CallableStatement أيضًا، والتي سيتم استخدامها لتنفيذ الاتصال بالعملية التخزينية في قاعدة البيانات.
افترض أنك بحاجة إلى تنفيذ عملية التخزين التالية لـ Oracle-
CREATE OR REPLACE PROCEDURE getEmpName (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END;
ملاحظة: النموذج التخزيني المقدم تم كتابته لـ Oracle، ولكننا نستخدم قاعدة بيانات MySQL، لذا دعونا نكتب عملية التخزين المماثلة لـ MySQL، كما يلي، لإنشاءها في قاعدة بيانات EMP-
DELIMITER $$ DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$ CREATE PROCEDURE `EMP`.`getEmpName` (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255)) BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END $$ DELIMITER ;
هناك ثلاثة أنواع من المعاملات: IN، OUT و INOUT. يستخدم كائن PreparedStatement فقط المعاملات IN. يمكن استخدام كائن CallableStatement لجميع هذه المعاملات الثلاث.
هذا هو تعريف كل منهم-
النطاق | الوصف |
---|---|
IN | تمثل المعاملات التي تكون قيمها غير معروفة عند إنشاء جملة SQL. يمكنك ربط القيم إليها باستخدام طريقة setXXX(). |
OUT | تمثل القيم المعاملات التي تقدمها جملة SQL العائدة. استخدم طريقة getXXX() لاستخراج القيم من معاملات OUT. |
INOUT | يقدم معاملات تحتوي على قيم إدخال وإخراج. يمكنك ربط المتغيرات باستخدام طريقة setXXX() وتحديد القيم باستخدام طريقة getXXX(). |
يوضح الفقاع المقدمة كيفية استحداث كائن باستخدام هذه الطريقة بناءً على الإجراء المخزن السابق-Connection.prepareCall()CallableStatement
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt = conn.prepareCall(SQL); . . . } catch (SQLException e) { . . . } finally { . . . }
تمثل المتغيرات النصية SQL إجراء مخزن يحتوي على مرشحات معاملات.
يبدو استخدامه لكائن CallableStatement مشابهًا جدًا لاستخدامه لكائن PreparedStatement. يجب عليك ربط القيم مع جميع المعاملات قبل تنفيذ هذه الجملة، وإلا ستحصل على SQLException.
إذا كان هناك معاملات IN، فما عليك سوى اتباع نفس القواعد والتقنيات المطبقة على كائن PreparedStatement; استخدم طريقة setXXX() التي تتوافق مع نوع البيانات Java المربوط.
عند استخدام معاملات OUT و INOUT، يجب استخدام طريقة CallableStatement الإضافية registerOutParameter(). تقوم طريقة registerOutParameter() بربط نوع البيانات JDBC إلى نوع البيانات المتوقع للإجراء المخزن العائد.
بعد استدعاء الإجراء المخزن، يمكنك استخدام طريقة getXXX() المناسبة لاستخراج القيم من معاملات OUT. ستقوم هذه الطريقة بتحويل القيم النوعية SQL إلى نوع البيانات Java.
مثل إغلاق كائنات Statement الأخرى، لذات السبب يجب أيضًا إغلاق كائن CallableStatement.
بإمكانك إغلاق طريقة close() ببساطة. إذا تم إغلاق كائن الاتصال Connection أولاً، فإنه سيغلق أيضًا كائن CallableStatement. ولكن يجب عليك دائمًا إغلاق كائن CallableStatement بشكل صريح لضمان تنظيف صحيح.
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt = conn.prepareCall(SQL); . . . } catch (SQLException e) { . . . } finally { cstmt.close(); }
درسنا فيفي مثال الكود القابل للإدعاءتم دراسة المزيد من التفاصيل.
لغة الحرف المبدل تسمح لك بالاستفادة من الميزات المحددة للقاعدة البيانات التي لا يمكن استخدامها من خلال طرق JDBC القياسية أو الخاصيات.
تنسيق لغة الحرف المبدل العامة لـ SQL كالتالي-
{keyword 'parameters'}
إليك سلسلة الحروف المبدلة التالية، التي ستكون مفيدة جدًا عند تنفيذ برمجة JDBC-
يمكن لهذه الأنواع أن تساعد في تحديد النصوص للتواريخ والوقت وعلامات التوقيت. كما تعلمون، لا تُمثل جميع قواعد البيانات التواريخ والوقت بنفس الطريقة. تقول هذه لغة الحرف المبدل للدفع بالبرنامج لتقديم التواريخ أو الوقت بصيغة قاعدة البيانات الهدف. على سبيل المثال:
{d 'yyyy-mm-dd'}
حيث yyyy = السنة، mm = الشهر، dd = اليوم. باستخدام هذا النوع من الجملة {d'2009-09-03'} هو 9 سبتمبر 2009.
هذا مثال بسيط يوضح كيفية إدراج تاريخ في الجدول
//إنشاء Statement object stmt = conn.createStatement(); //إدراج البيانات ==> ID، الاسم الأول، الاسم الأخير، تاريخ الميلاد String sql="INSERT INTO STUDENTS VALUES" + "(100,'Zara','Ali', {d '2001-12-16'})"; stmt.executeUpdate(sql);
بالمثل، يمكنك استخدام أحد هذين النوعين من اللغات،tأوts:
{t 'hh:mm:ss'}
حيث hh = الساعة، mm = الدقيقة، ss = الثانية. باستخدام هذا النوع من الجملة {t '13:30:29'} هي 1:30:29 مساءً.
{ts 'yyyy-mm-dd hh:mm:ss'}
هذه هي لغة الجملة المدمجة للنوعين السابقين، حيث 'd' و 't' تمثلان علامات التوقيت.
هذا الكلمة المفتاحية تعرف الحرف المبدل المستخدم في جملة LIKE. يُستخدم هذا الحرف المبدل بشكل فعال عند استخدام علامات الاستبدال SQL %، حيث يُناسب صفر أو أكثر من الأحرف. على سبيل المثال:
String sql = "SELECT symbol FROM MathSymbols" WHERE symbol LIKE '\%' {escape '\'}"; stmt.execute(sql);
إذا كنت تستخدم رمز البكرة (\) كحرف استبدال، فلازم أن تستخدم نفس عدد الحروف الباكرة في نص Java String، لأن البكرة هي أيضًا حرف استبدال في Java.
كلمة المفتاح هذه تعني الدوال البسيطة المستخدمة في DBMS. على سبيل المثال، يمكنك استخدام دالة SQLlengthللحصول على طول الكلمة-
{fn length('Hello World')}
سيقوم هذا بالعودة 11، وهو طول الكلمة “Hello World”.
كلمة المفتاح هذه تستخدم للإتصال بالإجراءات. على سبيل المثال، للإجراءات التي تحتاج إلى متغيرات الدخول، استخدم الجملة التالية-
{call my_procedure(?)};
للإجراءات التي تحتاج إلى متغيرات الدخول وتبدأ في متغيرات الخروج، استخدم الجملة التالية-
{? = call my_procedure(?)};
كلمة المفتاح هذه تستخدم لتمثيل الاتصال الخارجي. الجملة النمطية كالتالي-
{oj outer-join}
من حيث، الاتصال الخارجي = جدول {LEFT | RIGHT | FULL} OUTERJOIN {table | شرط البحث. على سبيل المثال-
String sql = "SELECT Employees FROM {oj ThisTable RIGHT OUTER JOIN ThatTable ON id = '100'; stmt.execute(sql);