الانتقال إلى المحتوى

Oracle And Java Stored Procedures


sky information

Recommended Posts

Oracle and Java Stored Procedures

السلام عليكم .........................................................
نبدأ اليوم بعون الله بموضوع جديد لكنه في الواقع ليس جديد في عالم الأوراكل وإنما جديد بالنسبة لنا في هذا المنتدى .
بعدما أطلعت على الكثير من المواضيع في المواقع والكتب أحببت ان أشارككم في هذه المعلومات القيمة


المقدمة

ابتداء من إصدار الأوراكل 8i قاعدة بيانات الأوراكل تتضمن (fully functional Java Virtual Machine ) وهو ما يسمى JVM Oracle من خلال هذه العلاقة الوثيقة بين الأوراكل والجافا تظهر تقنية مهمة للأوراكل ألا وهي من ناحية
المطورون : إجراءات الجافا المخزنة .
مع إجراءات الجافا المخزنة يتمكن المطورون من استغلال قوة الجافا أثناء بناء تطبيقات قاعدة البيانات , بعد إبراز فوائد إجراءات الجافا المخزنة سوف نتطرق لطريقة إنشائها و استخدامها في التطبيقات .

فوائد Java Stored Procedures :

إن استخدام الجافا يوفر لك اكتساب ميزة من لغة الجافا لتوسيع جودة وظيفة تطبيقات قواعد البيانات . أيضا الجافا تجعل من الممكن كتابة (database-neutral code)
كما تسمح بإعادة استخدام الكود الحالي وزيادة معدل الإنتاجية بشكل مثير . كما سترون فإن JAVA و PL/SQL يمكن أن يتواجدان في نفس التطبيق تماما مع بعض وبشكل رائع.تعتبر لغة PL/SQLلغة إجرائية ممتازة فحسنت بشكل كبير للتعامل مع قواعد بيانات الأوراكل و تطبيقات الجافا التي تنفذ في قواعد بيانات الأوراكل .

Java Stored Procedures خطوة بخطوة:

باختصار إن إجراءات الجافا المخزنة هي أصناف الجافا أو ما يعرف (Java classes )
تخزن ككائنات في مخطط الأوراكل .هنالك أربع خطوات ضرورية عندما نريد استخدام إجراءات الجافا المخزنة .
الخطوة الأولى :
Writing the Java Class-1 :
(هذه النقطة تتحدث عن مرحلة إنشاء صنف الجافا )

الشيء الجميل في الخطوة الأولى أنها لن نحتاج الشيء الكثير لعمله في قاعدة البيانات ,تطور ببساطة أصناف الجافا باستعمال (IDE ) المفضلة لديك مثل JDeveloper للأوراكل. إن (Java methods ) يجب أن تكون public ويجب أن تكون static إذا كانت ستستعمل كإجراءات مخزونة .
تستطيع كتابة و تجميع و حتى اختبار كود الجافا قبل نقله إلى قاعدة البيانات هنا مثال (Java class ) يسمى EmpManager يحتوي على Method فريدة لإدخال سجل في جدول emp في قاعدة البيانات :

import java.sql.*;
import oracle.jdbc.*;

public class EmpManager {

//Add an employee to the database.
public static void addEmp(int emp_id, String emp_f_name,
String emp_l_name,float emp_salary, int dept_id) {

System.out.println("Creating new employee...");

try {
Connection conn =
DriverManager.getConnection("jdbc:default:connection:");

String sql =
"INSERT INTO emp " +
"(emp_id,emp_f_name,emp_l_name,emp_salary,dept_id) " +
"VALUES(?,?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,emp_id);
pstmt.setString(2,emp_f_name);
pstmt.setString(3,emp_l_name);
pstmt.setFloat(4,emp_salary);
pstmt.setInt(5,dept_id);
pstmt.executeUpdate();
pstmt.close();
}
catch(SQLException e) {
System.err.println("ERROR! Adding Employee: "
+ e.getMessage());
}
}
}

رابط هذا التعليق
شارك

نلاحظ وجود المحرك JDBC في صنف الجافا
ما هو JDBC : هي الآلية القياسية و الأكثر شيوعا لدخول بيانات الأوراكل من الجافا .

الخطوة الثاني :
Loading Classes -2 :
هذه النقطة تتحدث عن مرحلة تحميل صنف الجافا إلى قاعدة بيانات الأوراكل
إن الصنف الان سيصبح كائن في المخطط , لذا يجب أن ينقل إلى قاعدة البيانات .
تزود الأوراكل بـ(command-line utility) تسمى loadjava لإنجاز هذه المهمة.
الأداة loadjava تزود واجهة لـSQL لإنشاء عبارات الجافا وأيضا ممكن أن تستخدم لترحيل الملفات ذو العلاقة بالجافا إلى قاعدة البيانات .
لأننا إلى الآن لم نعمل compile لـ EmpManager.
سوف نطلب من loadjava أن يقوم بهذه المهمة كجزء من عملية التحميل :

$ loadjava -u scott/tiger -v -resolve EmpManager.java



(-u) تحدد أسم المستخدم وكلمة المرور لقاعدة البيانات .
(-v) تأمر الأداة بتضمين المرفق.

لأننا طلبنا من loadjava أن يقوم بعملية compile لمصدر الملف فإن كلا من
source) & class files) سيصبح جزء من مخطط المستخدم scott , بعد هذه العملية يجب التحقق من سريان الأمور بشكل صحيح لذلك نرجع إلى العرض user_objects ونتحقق من الحالة هل هي 'VALID' :

SELECT object_name, object_type, status
FROM user_objects WHERE object_type LIKE 'JAVA%';

object_name	object_type		   status
----------------- ----------------	--------------
EmpManager JAVA CLASS	  VALID
EmpManager JAVA SOURCE  VALID



المهمة تمت بنجاح .
وبالطريقة المعاكسة, إذا حدثت أخطاء يمكن فحصها من خلال العرض user_errors.
ملاحظة يجب مراعاة التالي/
1- إذا اخترت تجميع باستخدام IDE سيتم تحميل ملفات (class ) ببساطة,ثم ستجد source في( version control on the file system) .

2- تقبل الأداة loadjava الملفات ذات الامتدادات :

. sqlj (a sqlj source file)
.properties
.ser
.jar
.zip


ماذا لو كانت الملفات بامتداد jar و zip ؟؟
في حالة كون الملفات بامتداد jar و zip فإن الأوراكل بشكل تلقائي تنتزع وتخزن كل جزء ككائن فريد في المخطط .

الخطوة الثالثة :
Publishing Classes-3 :
هذه النقطة تتحدث عن كيفية تمثيل صنف الجافا في الأوراكل

أي صنف سوف يستدعى من خلال SQL أو PL/SQL لابد أن يكون متاح بشكل عام وتكون أصناف الجافا متاحة من خلال إنشاء وتجميع ((call specification لها.إن specification call في أغلب الأحيان تدعى باسم spec أو حتى
wrapper PL/SQL .
هنا call specification(for the addEmp method) :

CREATE OR REPLACE PROCEDURE add_emp (emp_id NUMBER,emp_f_name VARCHAR2,
emp_l_name VARCHAR2, emp_salary NUMBER, dept_id NUMBER)
AS LANGUAGE JAVA
NAME 'EmpManager.addEmp(int, java.lang.String, java.lang.String, float, int)';
/


إن الإجراء add_emp يعتبر كوصلة بين SQL و Method (EmpManager.addEmp) لذلك يجب أن تحدد الـMethod الخاصة بالجافا بالكامل.

يجب ملاحظة التالي :

أن Method للجافا إذا لم تعود بقيم أو إذا كان نوع return هو void سوف تمثل في الأوراكل كإجراء.
أما إذا كانت تعود بقيم سيتم تمثيلها كوظيفة .
لذلك باعتبار Method الجافا الثانية في empManager التي تحصل على عدد الموظفين بإعطاء رقم القسم بأنها ستعود بقيمة Number ستمثل كوظيفة في الأوراكل

//Get the total number of employees for a given department.
public static int getEmpCountByDept(int dept_id) {

  Connection conn =
  DriverManager.getConnection("jdbc:default:connection:");

  String sql = "SELECT COUNT(1) FROM emp WHERE dept_id = ?";
  int cnt = 0;

  //Code here to add ResultSet value to cnt, trap SQLException, etc.

  return cnt;
} 


الآن نمثل هذه Method بالوظيفة التالية :

CREATE OR REPLACE FUNCTION get_emp_count_by_dept (dept_id NUMBER)
  RETURN NUMBER AS LANGUAGE JAVA
  NAME 'EmpManager.getEmpCountByDept(int) return int';
/



Calling the Procedures-4:
النقطة الأخيرة والتي تتحدث عن طريقة تنفيذ أصناف الجافا

لقد قمنا بتطوير وتحميل و إتاحة أصناف الجافا الخطوة الأخيرة هي تنفيذهم , في الوضع الافتراضي مخرجات الجافا تكتب لـ( Trace files ) لذلك تم تزويد الأوراكل بالحزمة DBMS_JAVA التي تقوم بإعادة توجيه الناتج إلى SQL*PLUS :

SQL> SET SERVEROUTPUT ON
SQL> CALL dbms_java.set_output(2000);



الآن مخرجات الجافا سوف تعرض بناء على التنفيذ

SQL> EXECUTE add_emp(1,'Joe', 'Smith',40000.00,1);
Creating new employee...
PL/SQL procedure successfully completed.



من الملاحظ أنه تم إدخال( رقم الموظف و أسمه الأول وأسمه الأخير والراتب و الإدارة)
ملاحظة/ يجب تحميل المرفقات لتطبيق المثال بشكل صحيح و حصلت على كتاب في الملف الثاني (White Paper)

نهــــــــــــــــــــــــــــــاية الموضوع ___.....................................____ تحياتي




السكربتات
java_stored_proceure.zip

الكتاب
JAVA_STORED_PROC.zip

رابط هذا التعليق
شارك

  • بعد 3 أسابيع...

بسم الله الرحمن الرحيم
لا واخ سكاي انا شخصيا متحمس جدا لمواصلة الكلام في هذا الموضوع واتمنى أن تتحفنا بمواصلة الكلام عن هذا الربط المتقدم والجميل بين اللغتين وكيفية استخدام الجافا في الاوراكل لتعويض بعض النقص وخاصة الموجود مع 10 جي واتمنى الاستمرار ....

كما أن عندي طلب واتمنى أن تحققه لي ولو كان الاجابة عليه صعب اتمنى ان تدلني على شخص يعرف الاجابة عليه.....

خطوات تنزيل الابليكشين سيرفر 10 جي
خطوات تشغيل الفورم
خطوات تشغيل التقارير ....وخاصة بصيقة بي دي اف


ولك تحياتي وتقديري....


أخوك

رابط هذا التعليق
شارك

  • بعد 1 شهر...

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية