PDA

View Full Version : سوال: insert عکس در دیتابیس



alireza586
پنج شنبه 18 آبان 1391, 11:17 صبح
سلام
من می خوام داخل دیتابیس عکس ذخیره کنم
علاوه بر تعیین نوع فیلد می خوام بدونم چطوری دستور insert بنویسم

رسول_57
پنج شنبه 18 آبان 1391, 19:15 عصر
سلام
من می خوام داخل دیتابیس عکس ذخیره کنم
علاوه بر تعیین نوع فیلد می خوام بدونم چطوری دستور insert بنویسم

اگر می خواهید در بانک اطلاعاتی اوراکل تصاویررا وارد کنید باید به ترتیب زیر اقدام کنید :

1:ابتدا باید یک دایرکتوری در اوراکل ایجاد کنید ماند d:\ImageDir

2:باید از یک پروسیژر برای وارد کردن تصویر در جدول استفاده کنید بنابراین در ابتدا باید جدولی داشته باشید که تصاویر را در آن ذخیره کنید . دقت کنید که از نوع داده BLOB برای این کار استفاده کنید .

3: کد زیر کدی نمونه برای تعریف جدول است :
CREATE TABLE test_image ( ID NUMBER, image_filename VARCHAR2(50), image BLOB );

4:کد زیر کدی نمونه برای افزودن تصویر در جدول فوق است :
CREATE OR REPLACE PROCEDURE insert_image_file (p_id NUMBER, p_image_name IN VARCHAR2)
IS
src_file BFILE;
dst_file BLOB;
lgh_file BINARY_INTEGER;
BEGIN
src_file := BFILENAME ('image_DIR', p_image_name);
-- insert a NULL record to lock
INSERT INTO temp_image
(ID, image_name, image )
VALUES (p_id, p_image_name, EMPTY_BLOB () )
RETURNING image INTO dst_file;
-- lock record
SELECT image
INTO dst_file
FROM temp_image WHERE ID = p_id AND image_name = p_image_name
FOR UPDATE;
-- open the file DBMS_LOB.fileopen (src_file, DBMS_LOB.file_readonly);
-- determine length lgh_file := DBMS_LOB.getlength (src_file); -- read the file DBMS_LOB.loadfromfile (dst_file, src_file, lgh_file);
-- update the blob field UPDATE temp_image SET image = dst_file WHERE ID = p_id AND image_name = p_image_name;
-- close file DBMS_LOB.fileclose (src_file);
END
insert_image_file

5:حالا با دستور زیر پروسیژر را اجرا کنید :

EXECUTE insert_image_file(1,'test_image.jpg');

alireza586
شنبه 20 آبان 1391, 09:12 صبح
خیلی ممنونم
تونستم insert کنم اما نمی تونم اون را ببینم
من DataBase 9i دارم و form & report 5 که ظاهرا form & report 5 نوع متغیر image را پشتیبانی نمی کنه و داخل 9i هم این فیلد Brows نمی شه

رسول_57
شنبه 20 آبان 1391, 10:24 صبح
خیلی ممنونم
تونستم insert کنم اما نمی تونم اون را ببینم
من DataBase 9i دارم و form & report 5 که ظاهرا form & report 5 نوع متغیر image را پشتیبانی نمی کنه و داخل 9i هم این فیلد Brows نمی شه

نمی توانم آن را ببینم یعنی چی ؟ دقیقا متوجه نمی شوم . دقیق بگو شاید بشه کاری کرد .

alireza586
دوشنبه 22 آبان 1391, 08:07 صبح
با سلام و تشکر
عکسی که ذخیره شده را می خوام استفاده کنم در فرم یا گزارش ولی نمی تونم

رسول_57
جمعه 26 آبان 1391, 11:11 صبح
با سلام و تشکر
عکسی که ذخیره شده را می خوام استفاده کنم در فرم یا گزارش ولی نمی تونم

ببینید بهترین کار این است که شما آدرس تصویر را در پایگاه داده ذخیره کنید به دلایل زیر :

1-ذخیره سازی پایگاه داده ای بسیار گران تر از ذخیره سازی فایل سیستمی است .

2-دسترسی گزارش از طریق فایل سیستم بسیار سریع تر از دسترسی از طریق پایگاه داده است .

3-در این روش وب سرورها و ابزارهای مشابه به کدینگ خاصی برای دسترسی و یا پردازش تصویر نیاز ندارند .

4-جامعیت تراکنشی بین تصویر و متاداده در پایگاه داده بسیار مهم است .

alireza586
شنبه 27 آبان 1391, 07:40 صبح
سلام
من عکس را دقیقا با فانکشن شما ذخیره کردم حالا چطور اون را استفاده کنم
مثلا فرض کنین اون یه امضاء باشه و من می خوام اون را زیر یه گزارش چاپ کنم

رسول_57
شنبه 27 آبان 1391, 08:55 صبح
سلام
من عکس را دقیقا با فانکشن شما ذخیره کردم حالا چطور اون را استفاده کنم
مثلا فرض کنین اون یه امضاء باشه و من می خوام اون را زیر یه گزارش چاپ کنم

شما می توانید از نوع داده BLOB اوراکل برای ذخیره عکس ها و تصاویر در فرمت های jpg , Gif , tif , eps , mp3 یا هر فرمت دلخواه دیگر استفاده کنید . توجه داشته باشید که از SQL استاندارد برای بازیابی عکس از جداول اوراکل نمی توانید استفاده کنید و نیازمندید که از رویه های PL/SQL استفالده کنید :

به عنوان مثال کد زیر یک عکس با فرمت JPG را از بانک اوراکل بازیابی می کند :

declare t_blob blob ;
t_len number ;
t_file_name varchar2 (100);
t_output UTL_FILE.file_type ;
t_totalsize number ;
t_position number:=1 ;
t_chucklen number :=4096 ;
t_chuck raw(4096) ;
t_remain number ;
begin
--get length of blob
SELECT DBMS_LOB.getlength (PHOTO), ename || '_1.jpg'
INTO t_TotalSize, t_file_name FROM DEMO WHERE ENAME ='moon';
t_remain := t_TotalSize;
-- The directory TEMPDIR should exist before executing
t_output := UTL_FILE.fopen ('TEMPDIR', t_file_name, 'wb', 32760);
-- Get BLOB
SELECT PHOTO INTO t_blob FROM DEMO WHERE ENAME ='moon';
-- Retrieving BLOB
WHILE t_position < t_TotalSize
LOOP
DBMS_LOB.READ (t_blob, t_chucklen, t_position, t_chuck);
UTL_FILE.put_raw (t_output, t_chuck);
UTL_FILE.fflush (t_output);
t_position := t_position + t_chucklen;
t_remain := t_remain - t_chucklen;
IF t_remain < 4096
THEN
t_chucklen := t_remain;
END IF;
END LOOP;
END;