بسم الله الرحمن الرحيم
هل لديك مشروع و تريد تخزين و استرجاع البيانات من صور و مقاطع صوتية و مرئية بقاعدة بيانات Oracle؟
هذا الدرس سوف تقوم من خلاله بعمل المطلوب. و سوف نقوم باستعراض الدرس بالشفرات البرمجية المطلوبة لفهم الموضوع على أكمل وجه (و الكمال لله تعالى).
الـ BLOB و الـ CLOB: و هي اختصار لـ Binary Large Object و اختصار لـ Character Large Object. من ناحية أخرى، هذان النوعان صمما لحفظ و استرجاع البيانات الضخمة بقاعدة البيانات. و التي تصل سعة التخزين إلى أربع جيجابايت (4 GB) من البيانات. و هما من الأنواع التي توجد بالـ SQL3، و التي هي مدعومة من الـ JDBC 2.0. الـ JDBC 2.0 تخدم نوعان جديدان و هما الـ BLOB و الـ CLOB للتعامل مع الأنواع الجديدة من الـ SQL3. و بهذا الدرس سوف نستخدم الـ BLOB لتخزين و استرجاع الصور من و إلى قاعدة البيانات.
أولاً سوف نقوم بإنشاء جدول جديد باستخدام SQL Plus أو بأي طريقة أخرى و نسميه demo:
CREATE TABLE demo (id NUMBER(6), image BLOB);
كما تلاحظ يوجد لدينا عمودان. الأول و هو مخصص لإضافة رقم خاص لكل صورة و هو من نوع NUMBER، و العمود الثاني و هو لتخزين البيانات (مثل: الصور و المقاطع الصوتية و المرئية) و هو من نوع BLOB.
سوف نقوم باستعراض أربع أمور:
- تخزين البيانات بقاعدة البيانات.
- استرجاع البيانات من قاعدة البيانات و حفظها على هيئة ملفات.
- حذف البيانات من قاعدة البيانات.
- إظهار البيانات و استخدامها ببرامج الجافا.
تخزين البيانات بقاعدة البيانات:
الآن سوف نقوم بكتابة شفرة برمجية بلغة الجافا لتخزين الصور بقاعدة بيانات Oracle.
الشفرة البرمجية:
import java.io.*;
import java.sql.*;
import oracle.sql.BLOB;
import oracle.jdbc.driver.*;
public class WriteBlob {
private Connection con;
private String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL2";
private String user = "scott";
private String password = "tiger";
public WriteBlob() {
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
con = DriverManager.getConnection(url, user, password);
}
catch (SQLException e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception, IOException {
new WriteBlob().process();
}
public void process() throws IOException, SQLException {
int rows = 0;
FileInputStream fin = null;
OutputStream out = null;
ResultSet rslt = null;
Statement stmt = null;
BLOB photo = null; // NOTE: oracle.sql.BLOB!!!
long person_id = 0;
try {
con.setAutoCommit(false);
stmt = con.createStatement();
rslt = stmt.executeQuery("SELECT image FROM demo WHERE id = 1 FOR UPDATE NOWAIT");
while (rslt.next()) {
rows++;
photo = (BLOB)rslt.getBlob("image");
}
rslt.close();
rslt = null;
/**
* If it doesn't exist, then insert a row in the information table
* This creates the LOB locators
*/
if (rows == 0) {
rows = stmt.executeUpdate("INSERT INTO demo VALUES (1, empty_blob())");
System.out.println(rows + " rows inserted");
// Retrieve the locator
rows = 0;
rslt = stmt.executeQuery("SELECT image FROM demo WHERE id = 1 FOR UPDATE NOWAIT");
rslt.next();
photo = ((OracleResultSet)rslt).getBLOB("image");
rslt.close();
rslt = null;
}
stmt.close();
stmt = null;
// Now that we have the locator, lets store the photo
File binaryFile = new File("jfc.gif");
fin = new FileInputStream(binaryFile);
out = photo.getBinaryOutputStream();
// Get the optimal buffer size from the BLOB
byte[] buffer = new byte[photo.getBufferSize()];
int length = 0;
while ((length = fin.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
// you need to close the output stream before
// you commit, or the changes are lost!
out.close();
out = null;
fin.close();
fin = null;
con.commit();
}
catch (SQLException e) {
<P class=

ساحة النقاش