يقدم مؤلف هذه المقالة كيفية استدعاء إجراءات SQL Server المخزنة من خلال Java، ويشرح بالتفصيل خمسة أنواع مختلفة من التخزين. يرجى الاطلاع أدناه للحصول على التفاصيل
1. استخدم الإجراء المخزن بدون معلمات
عند استخدام برنامج تشغيل JDBC لاستدعاء إجراء مخزن بدون معلمات، يجب عليك استخدام تسلسل هروب استدعاء SQL. يكون بناء جملة تسلسل هروب المكالمة بدون معلمات كما يلي:
انسخ رمز الكود كما يلي:
{اسم إجراء الاتصال}
على سبيل المثال، قم بإنشاء الإجراء المخزن التالي في نموذج قاعدة بيانات SQL Server 2005 AdventureWorks:
انسخ رمز الكود كما يلي:
إنشاء إجراء GetContactFormalNames
مثل
يبدأ
حدد أفضل 10 عناوين + ' ' + الاسم الأول + ' ' + LastName AS FormalName
من الشخص.الاتصال
نهاية
يقوم هذا الإجراء المخزن بإرجاع مجموعة نتائج واحدة تحتوي على عمود بيانات يتكون من العنوان والاسم الأول واسم العائلة لجهات الاتصال العشرة الأولى في جدول Person.Contact.
في المثال التالي، يتم تمرير هذه الوظيفة اتصالاً مفتوحًا بقاعدة بيانات نموذج AdventureWorks، ثم يتم استدعاء الإجراء GetContactFormalNames المخزن باستخدام أسلوب ExecuteQuery.
انسخ رمز الكود كما يلي:
الفراغ الثابت العام ExecuteSprocNoParams(Connection con) ...{
يحاول...{
البيان stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("{call dbo.GetContactFormalNames}");
بينما (rs.next()) ...{
System.out.println(rs.getString("FormalName"));
}
rs. Close();
stmt. Close();
}
قبض (استثناء ه) ...{
printStackTrace();
}
}
2. استخدم الإجراء المخزن مع معلمات الإدخال
عند استخدام برنامج تشغيل JDBC لاستدعاء إجراء مخزن مع معلمات، يجب عليك استخدام تسلسل هروب SQL للاتصال بالتزامن مع أسلوب PreparCall لفئة SQLServerConnection. يكون بناء جملة تسلسل هروب المكالمة بمعلمة IN كما يلي:
انسخ رمز الكود كما يلي:
{اسم إجراء الاستدعاء[([المعلمة][,[المعلمة]]...)]}
عند إنشاء تسلسل هروب مكالمة، استخدم الحرف ? (علامة الاستفهام) لتحديد معلمة IN. يعمل هذا الحرف كعنصر نائب لقيمة المعلمة التي سيتم تمريرها إلى الإجراء المخزن. يمكنك استخدام إحدى طرق الضبط لفئة SQLServerPreparedStatement لتحديد قيم المعلمات. يتم تحديد طرق الضبط المتاحة حسب نوع بيانات معلمة IN.
عند تمرير قيمة إلى طريقة ضبط، يجب عليك تحديد ليس فقط القيمة الفعلية التي سيتم استخدامها في المعلمة، ولكن أيضًا الموضع الترتيبي للمعلمة داخل الإجراء المخزن. على سبيل المثال، إذا كان الإجراء المخزن يحتوي على معلمة IN واحدة، فإن قيمته الترتيبية هي 1. إذا كان الإجراء المخزن يحتوي على معلمتين، فإن القيمة الترتيبية الأولى هي 1 والقيمة الترتيبية الثانية هي 2.
كمثال لكيفية استدعاء إجراء مخزن يحتوي على معلمة IN، استخدم الإجراء uspGetEmployeeManagers المخزن في نموذج قاعدة بيانات SQL Server 2005 AdventureWorks. يقبل هذا الإجراء المخزن معلمة إدخال واحدة تسمى "معرف الموظف"، وهي قيمة عددية، ويقوم بإرجاع قائمة متكررة للموظفين ومديريهم بناءً على معرف الموظف المحدد. إليك كود Java الذي يستدعي هذا الإجراء المخزن:
انسخ رمز الكود كما يلي:
الفراغ الثابت العام ExecuteSprocInParams(Connection con) ...{
يحاول...{
PreparedStatement pstmt = con.prepareStatement("{call dbo.uspGetEmployeeManagers(?)}");
pstmt.setInt(1, 50);
ResultSet rs = pstmt.executeQuery();
بينما (rs.next()) ...{
System.out.println("الموظف:");
System.out.println(rs.getString("اسم العائلة") + ", " + rs.getString("الاسم الأول"));
System.out.println("المدير:");
System.out.println(rs.getString("ManagerLastName") + ", " + rs.getString("ManagerFirstName"));
System.out.println();
}
rs. Close();
pstmt. Close();
}
قبض (استثناء ه) ...{
printStackTrace();
}
}
3. استخدم الإجراء المخزن مع معلمات الإخراج
عند استدعاء مثل هذه الإجراءات المخزنة باستخدام برنامج تشغيل JDBC، يجب عليك استخدام تسلسل هروب استدعاء SQL بالتزامن مع أسلوب PreparCall لفئة SQLServerConnection. يكون بناء جملة تسلسل هروب المكالمة بمعلمة OUT كما يلي:
انسخ رمز الكود كما يلي:
{اسم إجراء الاستدعاء[([المعلمة][,[المعلمة]]...)]}
عند إنشاء تسلسل هروب المكالمة، استخدم الحرف ? (علامة الاستفهام) لتحديد المعلمة OUT. يعمل هذا الحرف كعنصر نائب لقيمة المعلمة التي سيتم إرجاعها من هذا الإجراء المخزن. لتحديد قيم معلمات OUT، يجب عليك استخدام طريقة RegisterOutParameter لفئة SQLServerCallableStatement لتحديد نوع البيانات لكل معلمة قبل تشغيل الإجراء المخزن.
يجب أن تكون القيمة المحددة للمعلمة OUT باستخدام أسلوب RegisterOutParameter أحد أنواع بيانات JDBC الموجودة في java.sql.Types، والتي بدورها يتم تعيينها إلى أحد أنواع بيانات SQL Server الأصلية. لمزيد من المعلومات حول أنواع بيانات JDBC وSQL Server، راجع فهم أنواع بيانات برنامج تشغيل JDBC.
عند تمرير قيمة إلى أسلوب RegisterOutParameter لمعلمة OUT، لا يجب عليك فقط تحديد نوع البيانات المراد استخدامه للمعلمة، ولكن يجب عليك أيضًا تحديد الموضع الترتيبي للمعلمة أو اسم المعلمة في الإجراء المخزن. على سبيل المثال، إذا كان الإجراء المخزن يحتوي على معلمة OUT واحدة، فإن قيمته الترتيبية هي 1؛ وإذا كان الإجراء المخزن يحتوي على معلمتين، فإن القيمة الترتيبية الأولى هي 1 والقيمة الترتيبية الثانية هي 2.
على سبيل المثال، قم بإنشاء الإجراء المخزن التالي في قاعدة بيانات نموذج SQL Server 2005 AdventureWorks: استنادًا إلى معلمة IN للعدد الصحيح المحدد (employeeID)، يقوم هذا الإجراء المخزن أيضًا بإرجاع معلمة OUT لعدد صحيح واحد (managerID). استناداً إلى معرف الموظف الموجود في جدول HumanResources.Employee، فإن القيمة التي يتم إرجاعها في المعلمة OUT هي ManagerID.
في المثال التالي، يتم تمرير هذه الوظيفة اتصالاً مفتوحًا بقاعدة بيانات نموذج AdventureWorks، ثم يتم استدعاء الإجراء GetImmediateManager المخزن باستخدام طريقة التنفيذ:
انسخ رمز الكود كما يلي:
الفراغ الثابت العام ExecutedStoredProcedure(Connection con) ...{
يحاول...{
CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
cstmt.setInt(1, 5);
cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
cstmt.execute();
System.out.println("معرف المدير:" + cstmt.getInt(2));
}
قبض (استثناء ه) ...{
printStackTrace();
}
}
يستخدم هذا المثال الموضع الترتيبي لتحديد المعلمات. وبدلاً من ذلك، يمكن تعريف المعلمة باسمها بدلاً من موضعها الترتيبي. يعدل مثال التعليمات البرمجية التالي المثال السابق لتوضيح كيفية استخدام المعلمات المسماة في تطبيق Java. لاحظ أن أسماء المعلمات هذه تتوافق مع أسماء المعلمات في تعريف الإجراء المخزن: 11x16CREATE PROCEDURE GetImmediateManager
انسخ رمز الكود كما يلي:
@employeeID INT،
@managerID INT الإخراج
مثل
يبدأ
SELECT @managerID = ManagerID
من HumanResources.Employee
حيث معرف الموظف = @employeeID
نهاية
قد ترجع الإجراءات المخزنة أعداد التحديثات ومجموعات النتائج المتعددة. يتوافق برنامج تشغيل Microsoft SQL Server 2005 JDBC مع مواصفات JDBC 3.0، التي تنص على أنه يجب استرداد مجموعات النتائج المتعددة وعدد التحديثات قبل استرداد معلمات OUT. أي أنه يجب على التطبيق أولاً استرداد كافة كائنات ResultSet وتحديث العدد، ثم استخدام أسلوب CallableStatement.getter لاسترداد معلمات OUT. وبخلاف ذلك، عند استرداد المعلمة OUT، سيتم فقدان كائن ResultSet وعدد التحديثات التي لم يتم استردادها بعد.
4. استخدم الإجراءات المخزنة مع حالة الإرجاع
عند استدعاء مثل هذا الإجراء المخزن باستخدام برنامج تشغيل JDBC، يجب عليك استخدام تسلسل هروب استدعاء SQL بالتزامن مع أسلوب PreparCall لفئة SQLServerConnection. يكون بناء جملة تسلسل هروب المكالمة الذي يُرجع معلمة الحالة كما يلي:
انسخ رمز الكود كما يلي:
{[?=]اسم إجراء الاتصال[([المعلمة][,[المعلمة]]...)]}
عند إنشاء تسلسل هروب المكالمة، استخدم الحرف ? (علامة الاستفهام) لتحديد معلمة حالة الإرجاع. يعمل هذا الحرف كعنصر نائب لقيمة المعلمة التي سيتم إرجاعها من هذا الإجراء المخزن. لتحديد قيمة لمعلمة حالة الإرجاع، يجب عليك تحديد نوع بيانات المعلمة باستخدام أسلوب RegisterOutParameter لفئة SQLServerCallableStatement قبل تنفيذ الإجراء المخزن.
بالإضافة إلى ذلك، عند تمرير قيمة معلمة حالة الإرجاع إلى طريقة RegisterOutParameter، يجب عليك تحديد ليس فقط نوع بيانات المعلمة المراد استخدامها، ولكن أيضًا الموضع الترتيبي للمعلمة في الإجراء المخزن. الموضع الترتيبي لمعلمة حالة الإرجاع هو دائمًا 1 لأنه دائمًا المعلمة الأولى عند استدعاء الإجراء المخزن. على الرغم من أن فئة SQLServerCallableStatement تدعم استخدام اسم المعلمة للإشارة إلى معلمة معينة، إلا أنه يمكنك فقط استخدام رقم الموضع الترتيبي للمعلمة لمعلمات حالة الإرجاع.
على سبيل المثال، قم بإنشاء الإجراء المخزن التالي في نموذج قاعدة بيانات SQL Server 2005 AdventureWorks:
انسخ رمز الكود كما يلي:
إنشاء إجراء CheckContactCity
(@cityName CHAR(50))
مثل
يبدأ
إذا ((حدد العدد (*)
من الشخص.العنوان
أين المدينة = @cityName) > 1)
العودة 1
آخر
العودة 0
نهاية
يقوم الإجراء المخزن بإرجاع قيمة حالة 1 أو 0، اعتمادًا على ما إذا كان من الممكن العثور على المدينة المحددة بواسطة معلمة cityName في جدول Person.Address.
في المثال التالي، يتم تمرير هذه الوظيفة اتصالاً مفتوحًا بقاعدة بيانات نموذج AdventureWorks، ثم يتم استدعاء الإجراء المخزن CheckContactCity باستخدام طريقة التنفيذ:
انسخ رمز الكود كما يلي:
الفراغ الثابت العام ExecutedStoredProcedure(Connection con) ...{
يحاول...{
CallableStatement cstmt = con.prepareCall("{? = call dbo.CheckContactCity(?)}");
cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt.setString(2, "أتلانتا");
cstmt.execute();
System.out.println("حالة الإرجاع:" + cstmt.getInt(1));
}
cstmt. Close();
قبض (استثناء ه) ...{
printStackTrace();
}
}
5. استخدم الإجراء المخزن مع عدد التحديثات
بعد استخدام فئة SQLServerCallableStatement لإنشاء استدعاء لإجراء مخزن، يمكنك استخدام أساليب التنفيذ أو ExecuteUpdate لاستدعاء الإجراء المخزن. تقوم طريقة ExecuteUpdate بإرجاع قيمة int تحتوي على عدد الصفوف المتأثرة بهذا الإجراء المخزن، لكن طريقة التنفيذ لا تُرجع هذه القيمة. إذا كنت تستخدم طريقة التنفيذ وتريد الحصول على عدد الصفوف المتأثرة، فيمكنك استدعاء طريقة getUpdateCount بعد تشغيل الإجراء المخزن.
على سبيل المثال، قم بإنشاء الجداول والإجراءات المخزنة التالية في نموذج قاعدة بيانات SQL Server 2005 AdventureWorks:
انسخ رمز الكود كما يلي:
إنشاء جدول اختبار الجدول
(Col1 int IDENTITY،
Col2 فارشار (50)،
Col3 كثافة العمليات)؛
إنشاء إجراء UpdateTestTable
@ Col2 فارشار (50)،
@Col3 كثافة العمليات
مثل
يبدأ
تحديث جدول الاختبار
تعيين Col2 = @Col2، Col3 = @Col3
نهاية؛
في المثال التالي، يتم تمرير هذه الوظيفة اتصالاً مفتوحًا بقاعدة بيانات نموذج AdventureWorks، وتستخدم أسلوب التنفيذ لاستدعاء الإجراء UpdateTestTable المخزن، ثم تستخدم الأسلوب getUpdateCount لإرجاع عدد الصفوف المتأثرة بالإجراء المخزن.
انسخ رمز الكود كما يلي:
تنفيذ الفراغ الثابت العامUpdateStoredProcedure(Connection con) ...{
يحاول...{
CallableStatement cstmt = con.prepareCall("{call dbo.UpdateTestTable(?, ?)}");
cstmt.setString(1, "A");
cstmt.setInt(2, 100);
cstmt.execute();
int count = cstmt.getUpdateCount();
cstmt. Close();
System.out.println("الصفوف المتأثرة:" + count);
}
قبض (استثناء ه) ...{
printStackTrace();