Oracle-club: Советы по Delphi


Новости | FAQ | Ссылки | Темы | Утилиты | Documentation | Семинары
Вопрос : 
почему в Delphi4 нельзя сделать TQuery (запрос select * from some_table) 
со свойством RequestLive равным True (при открытии Query возникает эксепшн 
"table or view doesn't exists" ?

Ответ :
Если не ошибаюсь, то название таблицы должно быть написано большими буквами
(чтоб Delphi увидел :) и указана схема, в которой таблица находится
(последнее - это как возможная причина эксепшна), т.е.

SELECT * FROM OWNER.TABLE_NAME;

Есть файл с картинкой (формат я думаю не имеет значения). Как ее запихать в >поле LONG RAW базы Oracle 7.3.2 ? >Вопрос 2. >Если запихали, как написать процедуру формирования HTML для Oracle Web >Aplication Server 3.0 чтоб ее там показать? >Заранее благодарен за советы! >mishel >mishel@yartelecom.ru > для этого в Delphi, можно использовать примерно следующая строка: taSignsSIGN.LoadFromFile(edFileName.Text); где соответственно taSignsSIGN - это поле LONG RAW, edFileName.Text - имя файла. В OracleObjects for OLE есть методы AppendChunk и DbAppendChunk для тех же действий, но попытки попользовать их привели к фиаско при длине данных больше 64К, почему пока не знаю. 1. Delphi В Delphi это делается тремя способами, которые отличаются скорее по синтаксису, нежели по сути. У полей типа TBlobField есть два метода LoadFromFile и LoadFromStream, аргументами которой в первом случае выступает имя файла, а во втором идентификатор потока ввода (соответственно любой потомок TStream). В результате получаем примерно следующий код: procedure TfmAgreement.sbSaveClick(Sender: TObject); begin taAgreement.Append; taAgreementPAPER.LoadFromFile(edFileName.Text); taAgreement.Post; end; который запихивает некий файл в поле LONG RAW базы. Через TStream это будет выглядеть следующим образом. procedure TfmAgreement.sbSaveClick(Sender: TObject); var Stream1 : TBlobStream; Stream2 : TFileStream; begin taAgreement.Append; Stream2 := TFileStream.Create(edFileName.Text, fmOpenRead); try Stream1 := TBlobStream.Create(taAgreementPAPER, bmWrite); try Stream1.CopyFrom(Stream2, Stream2.Size); finally Stream1.Free; end; finally Stream2.Free; end; taAgreement.Post; end; Есть еще и третий вариант использовать метод LoadFromStream и предать ему в качестве параметра нечто типа Stream2, но я его лично не пробовал. Выгрузка из базы производится в обратном порядке используя функцию SaveToFile или с использованием потоков (код не привожу ибо он очевиден). Но при использовании Delphi (вернее BDE) существует один наворот, жить от которого никак не легче. В параметрах BDE драйвера для Oracle есть две фенечки, BLOB SIZE and BLOBS TO CACHE, которые соответственно показывают размер блоба который может быть кэширован и их количество в локальном кэше. Так вот если BLOB SIZE будет меньше реального размера данных в поле то эта гадость выгружает только часть данных размером равным BLOB SIZE. Есть оговорка, этот прикол работает только с данными полученными через TQuery. Если пользоваться TTable все нормально. Так что заведомо устанавливай BLOB SIZE больше размера реальных данных. 2. VBA и Oracle Objects For OLE. Пример описан в хелпе OO4O. AppendChunk Method Example ---------------------------------------------------------------------------- ------------------------------------------------------------------------ This example demonstrates the use of AppendChunk to read a file into a LONG RAW column of a database. This example expects a valid dynaset named OraDynaset representing a table with a column named "longraw". Copy this code into the definition section of a form. Call this procedure with a valid filename. Sub AppendChunkExample (FName As String) 'Declare various variables. Dim NumChunks As Integer, RemChunkSize As Integer Dim TotalSize As Long, CurChunk As String Dim I As Integer, FNum As Integer, ChunkSize As Integer 'Set the size of each chunk. ChunkSize = 10240 frmChunk.MousePointer = HOURGLASS 'Begin an add operation. OraDynaset.DbAddNew 'Clear the LONGRAW field. OraDynaset.Fields("LONGRAW").Value = "" 'Get a free file number. FNum = FreeFile 'Open the file. Open FName For Binary As #FNum 'Get the total size of the file. TotalSize = LOF(FNum) 'Set number of chunks. NumChunks = TotalSize \ ChunkSize 'Set number of remaining bytes. RemChunkSize = TotalSize Mod ChunkSize 'Loop through the file. For I = 0 To NumChunks 'Calculate the new chunk size. If I = NumChunks Then ChunkSize = RemChunkSize End If CurChunk = String$(ChunkSize, 32) 'Read a chunk from the file. Get #FNum, , CurChunk 'Append chunk to LONGRAW field. OraDynaset.Fields("LONGRAW").DbAppendChunk (CurChunk) Next I 'Complete the add operation and update the database. OraDynaset.DbUpdate 'Close the file. Close FNum frmChunk.MousePointer = DEFAULT End Sub ---------------------------------------------------------------------------- -------------------------------------------------------------------------- GetChunk Method Example This example demonstrates the use of GetChunk to retrieve a LONG RAW column of a database and save it into a file. This example expects a valid dynaset named OraDynaset representing a table with a column named 'longraw'. Copy and paste this code into the definition section of a form. Call this procedure with a valid filename. Sub GetChunkExample (FName As String) 'Declare various variables Dim CurSize As Integer, ChunkSize As Long Dim I As Integer, FNum As Integer, CurChunk As String 'Set the size of each chunk ChunkSize = 10240 frmChunk.MousePointer = HOURGLASS 'Get a free file number FNum = FreeFile 'Open the file Open FName For Binary As #FNum I = 0 'Loop through all of the chunks 'Oracle does not return the size of columns > 64KB. 'We should loop until the length of our block is 'less than we asked for. Do CurChunk = OraDynaset.Fields("LONGRAW").DbGetChunk(I * ChunkSize, ChunkSize) CurSize = Len(CurChunk) 'Get the length of the current chunk. Put #FNum, , CurChunk 'Write chunk to file. I = I + 1 Loop Until CurSize < ChunkSize 'Close the file. Close FNum frmChunk.MousePointer = DEFAULT End Sub ---------------------------------------- Ограничение в VBA только одно за одну посылку дергать или заталкивать не более 64К данных. Удачи, Igor N. Kolomiyets (ink@gts.lg.ua)
Тема : Задержка в доступе через синонимы (BDE) Вопрос: >Подскажите, в чем может быть задержка в доступе к таблицам базы через синонимы (через BDE). >Я уже обращался с этим вопросом, но трассировка не помогла в том смысле,что если >работать напрямую через клиента ORACLE (например, SQL*plus), все быстро, > >но если работает клиент Delphi 4.0, то задержка значительная, иногда до >минуты. > >Не хочется в клиенте перед именем таблицы ставить владельца, хотелось >бы работать с синонимами. > >Может, какой нибудь флажок установить? Ответ (1) : Похоже, что Дэльфа тормозит. 1. Попробуй пограться с регистром букв и кавычками в запросе. Шаманство, но иногда помогает. 2. Включи в Оракле трэйс на сессию Делфи. SQL>select sid, serial# from v$session where username='DELPHI'; SQL>exec dbms_systeml.set_sqltrace_in_session(SID,SERIAL#,TRUE); ...Дельфи делает запрос SQL>exec dbms_system.set_sqltrace_in_session(SID,SERIAL#,FALSE); И смотри потом, в трэйс-файле статистику запроса. (можешь его для удобства ч-з TKPROF пропустить) Там и увидишь где время теряется и в каком виде приходит заброс в Оракл. Да поставь в файле параметров timed_statistics = true. Марк (markm@pelitec.kts.ru) Ответ (2) : Можно установить в настройках BDE для Oracle SQLLinks параметр TRACE MODE в значение 0x1FF. После этого можно пользоваться утилитой из комплекта Delphi под названием SQLMonitor. Эта штука показывает все вызовы Oracle из BDE.
Тема : Delphi4 + Oracle 8, Cursor problem Вопрос: >Возникла следующая проблема: >для возврата набора строк из хранимой процедуры используется >оракловский тип данных Ref Cursor и Делфийский параметр типа ftCursor. >Процедура выглядит так: > procedure TEST(P$CURSOR in out REFCURSOR) is > begin > CLOSE_CURSOR(P$CURSOR); > open P$CURSOR for > select * from AnyTable; > end; > > type REFCURSOR IS REF CURSOR; > > procedure CLOSE_CURSOR(P$CURSOR in out REFCURSOR) is > begin > if P$CURSOR%isopen then > close P$CURSOR; > end if; > end; > >Т.е. в самой процедуре если курсор открыт - он закрывался - это на >случай >многократного открытия/закрытия запроса к процедуре. >Это работает на Оракле 7. >На 8-ке - нет. В результате, при неоднократном вызове процедуры >курсоры накапливаются. > >Накопал следующие: при повторном вызове процедуры P$CURSOR закрыт, >т.е. он не передается из Делфи. >Когда неоднократный вызов происходит без участия Делфи - все работает. >Есть подозрение на BDE-шную sqlora8.dll >Посмотреть список открытых курсоров можно запросом: >select * from V$OPEN_CURSOR > >Oracle 8.0.3.2.2 EE, Delphi 4 Update Pack 2 (5.104) Ответ : Это известная ошибка SQL Net 8 Oracle обещает скоро исправить Проблема заключается в следующем Вызов функции из библиотеки OCI 8.0.4 OCIHandleFree((dvoid *) stmthp, OCI_HTYPE_STMT)); По идее должен освободить дескриптор выражения и закрыть все курсоры открытые этим выражением но... они не закрываются. Используйте BDE драйвер который использует при работе SQL Net 2.3 Aleksey (bereg-msk2@dateline.ru)

Тема : Delphi + BDE + Oracle X, Connect problem

Вопрос:

Суть в следующем - поставил себе BDE 5.01, в DLL32 - sqlora8.dll, в vendor init он предложил oci.dll, но при попытке коннекта -сообщение об ошибке "cannot load an IDAPI service library. File: SQLORA8.dll" Может что еще надо обязательно прописать?

Ответ :

Имеем : Oracle X.0.Y , Delphi Z... Библитеку ORAX0Y.DLL скопировать под именем OCI.DLL. Оная dll должна находиться в одном из каталогов, которые просматривает система при поиске файлов.

Вопрос:

Суть проблемы - в Oracle 7.2 создан пакет, имеющий в своем составе несколько хранимых процедур без возвращаемых параметров. Необходимо получить доступ к ним из компонентов Delphi 4. Доступ получается через промежуточную хранимую процедуру, которая видит процедуру из пакета и в свою очередь видна из компонента TStoredProc. (Например, bn.In.vvod - вызов процедуры из пакета). Доступ получен, но можно ли упростить ?

Ответ :

в StoredProcName надо руками записть полную спецификацию процедуры или функции из пакета (в списке присутствуют только обычные процедуры и функции): .. -- WBR, Dmitry A. Pimenov mailto:dmitry.pimenov@scm.ru

Новости | FAQ | Ссылки | Темы | Утилиты | Documentation | Семинары