Базы данных Oracle - статьи

         

Работа с ресурсами в программе


Заводить, изменять свойства и удалять ресурсы в репозитарии XML DB можно с помощью пакета PL/SQL DBMS_XDB.

Примеры:

CONNECT scott/tiger

DECLARE retb BOOLEAN; BEGIN retb := DBMS_XDB.CREATEFOLDER ( '/public/myfolder' );

retb := DBMS_XDB.CREATERESOURCE ( '/public/myfolder/file1.txt' , 'First line' CHR ( 10 ) 'Second line' );

retb := DBMS_XDB.CREATERESOURCE ( '/public/myfolder/file2.xml' , '<doc><line>First line</line><line>Second line</line></doc>' );

END; /

Проверка:

SQL> SELECT r.res.EXTRACT ( 'Resource/Contents' ) AS xml 2 FROM resource_view r 3 WHERE EQUALS_PATH ( res, '/public/myfolder/file2.xml' ) = 1;

XML -------------------------------------------------------------- <Contents xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd"> <doc xmlns=""> <line>First line</line> <line>Second line</line> </doc> </Contents>

SQL> SELECT r.res.EXTRACT ( 'Resource/Contents/text/text()' ) AS text 2 FROM resource_view r 3 WHERE EQUALS_PATH ( res, '/public/myfolder/file1.txt' ) = 1;

TEXT -------------------------------------------------------------- First line Second line

Обратите внимание, что XML DB по-разному хранит файл в зависимости от его расширения (упражнение: убедитесь, что XML DB интерпретирует содержимое именно по расширению файла, а не оттого, что внутри). Соответствие расширений файлов типам MIME устанавливается и выясняется в файле-ресурсе /xdbconfig.xml.

Создание связи (link):

BEGIN DBMS_XDB.LINK ( '/public/myfolder/file1.txt' , '/public' , 'myfolderfile1.txt'

); END; /

Проверка:



SQL> SELECT r.res.EXTRACT ( 'Resource/Contents/text/text()' ) AS text 2 FROM resource_view r 3 WHERE EQUALS_PATH ( res, '/public/myfolderfile1.txt' ) = 1 SQL> /

TEXT ---------------------------------------------------------------- First line Second line

SQL> SELECT 2 p.path AS path 3 , p.link.extract('/LINK/ChildName/text()') AS link 4 FROM path_view p 5* WHERE UNDER_PATH ( p.res, '/public' ) = 1 SQL> /


PATH LINK --------------------------------------------- --------------------- /public/myfolder myfolder /public/myfolderfile1.txt file1.txt /public/myfolder/file1.txt file1.txt /public/myfolder/file2.xml file2.xml

Обратите внимание на два пути доступа в репозитарии к одному и тому же файлу (ресурсу).

Удаление:

CALL DBMS_XDB.DELETERESOURCE ( '/public/myfolderfile1.txt' ); CALL DBMS_XDB.DELETERESOURCE ( '/public/myfolder/file1.txt' ); CALL DBMS_XDB.DELETERESOURCE ( '/public/myfolder/file2.xml' ); CALL DBMS_XDB.DELETERESOURCE ( '/public/myfolder' );

Упражнение. Проверьте реакцию XML DB на попытку удалить несуществующий файл или непустую папку.

В отличие от производных таблиц (view) словаря-стправочника в Oracle, производные таблицы RESOURCE_VIEW и PATH_VIEW обновляемы (на деле это "объектно-реляционные" таблицы). Это позвляет, например, удалить связь также и командой DELETE, или переместить существующий ресурс в другую папку обычной операцией UPDATE:

UPDATE path_view SET путь = новый_путь WHERE equals_path ( res, путь ) = 1 ;

Пример помещения в репозитарий файла ОС:

CONNECT / AS SYSDBA

CREATE DIRECTORY courses AS 'c:\crs';

GRANT READ ON DIRECTORY courses TO scott;

CONNECT scott/tiger

DECLARE retb BOOLEAN; BEGIN retb := DBMS_XDB.CREATERESOURCE ( '/public/OracleXML.doc' , BFILENAME ( 'COURSES', 'OracleXML.doc' ) ); END; /

Проверка:

SQL> SELECT res AS resource_description 2 FROM resource_view 3 WHERE EQUALS_PATH ( res, '/public/OracleXML.doc' ) = 1 4 ;

RESOURCE_DESCRIPTION ----------------------------------------------------------------- <Resource xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd"> <CreationDate>2006-09-05T12:47:57.547000</CreationDate> <ModificationDate>2006-09-05T12:47:57.547000</ModificationDate> <DisplayName>OracleXML.doc</DisplayName> <Language>en-US</Language> <CharacterSet>WINDOWS-1251</CharacterSet> <ContentType>application/msword</ContentType> <RefCount>1</RefCount> </Resource>

Технически файлы репозитария размещаются служебных таблицах БД (документы XML) или в объектах LOB (файлы всех остальных типов). Использование формата MIME для хранения двоичных файлов не является самым экономным, что относится к издержкам метода.


Содержание раздела