purebasic.info

PureBasic forum
Текущее время: Сб дек 16, 2017 11:33 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: Пт авг 15, 2014 2:51 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 930
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 15
OCILib является открытым кросплатформенным Oracle-драйвером, который обеспечивает эффективный доступ к базам данных Oracle.
Сайт проекта: http://orclib.sourceforge.net/
Для работы с библиотекой OCILib на компьютере должен быть установлен клиент Oracle.

Следующий код - подключение к библиотеке и инициализация:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
; подключаем библиотеку OCILib и импортируем процедуры из драйвера OCI
Import "E:\temp\libocilibw.a"  ; тут путь к файлу библиотеки, у вас может быть другой
  ; libociliba.a = ANSI, libocilibw.a = UNICODE, libocilibm.a = MIXED
  ; (Выбераем файл с Юникодом и в компиляторе выставляем "Создать файл в Unicode")
  OCI_Initialize(*ErrorHandler, *LibPath, Mode) As "_OCI_Initialize@12" ; Initialize the OCI library - Returns TRUE on success otherwise FALSE
  OCI_ConnectionCreate(Database$, User$, Password$, Mode) As "_OCI_ConnectionCreate@16" ; Create a physical connection to an Oracle database server - Connection handle on success or NULL on failure
  OCI_StatementCreate(hConnection) As "_OCI_StatementCreate@4" ; Create a statement object - Returns a statement handle on success otherwise NULL
  OCI_StatementFree(hStatement) As "_OCI_StatementFree@4" ; Free a statement and all resources associated to it (resultsets ...)
  OCI_ExecuteStmt(hStatement, SQL$) As "_OCI_ExecuteStmt@8" ; Execute a SQL statement or PL/SQL block - Returns TRUE on success otherwise FALSE
  OCI_GetResultset(hStatement) As "_OCI_GetResultset@4" ; Retrieve the resultset handle from an executed statement - Returns a resultset handle on success otherwise NULL
  OCI_GetColumnCount(hResultSet) As "_OCI_GetColumnCount@4" ; Return the number of columns in the resultset
  OCI_FetchNext(hResultSet) As "_OCI_FetchNext@4" ; Fetch the next row of the resultset - Returns TRUE on success otherwise FALSE (empty, last row already fetched, an error occurred)
  OCI_GetString_Pointer(hResultSet, ColumnIndex) As "_OCI_GetString@8" ; Return the current string value of the column at the given index in the resultset or NULL if index is out of bounds
  OCI_Cleanup() As "_OCI_Cleanup@0" ; Clean up all resources allocated by the library
  OCI_ErrorGetOCICode(hError) As "_OCI_ErrorGetOCICode@4" ; Retrieve Oracle Error code from error handle
  OCI_ErrorGetString(hError) As "_OCI_ErrorGetString@4" ; Retrieve error message from error handle
 
  OCI_BindInt(hStatement,b.l,c.l) As "_OCI_BindInt@12"
  OCI_BindString(hStatement,b.s,c.s,d.l) As "_OCI_BindString@16"
  OCI_BindStatement(hStatement,b.s,c.l) As "_OCI_BindStatement@12"
  OCI_Prepare(hStatement, SQL$) As "_OCI_Prepare@8"
  OCI_Execute(hStatement) As "_OCI_Execute@4"
  OCI_Commit(hConnection) As "_OCI_Commit@4"
  OCI_Rollback(hConnection) As "_OCI_Rollback@4"
EndImport
 
Procedure.s OCI_GetString(hResultSet, ColumnIndex) ; Return the current string value of the column at the given index in the resultset or '' if index is out of bounds
  Protected OCI_Result, ReturnValue.s
  OCI_Result = OCI_GetString_Pointer(hResultSet, ColumnIndex)
  If OCI_Result
    ReturnValue = PeekS(OCI_Result)
  EndIf
  ProcedureReturn ReturnValue
EndProcedure
 
ProcedureC OCI_ErrorHandler(hError) ; OCI error handler MUST be a ProcedureC !!!
  Shared OCI_ErrorNumber, OCI_ErrorString.s
  If hError
    OCI_ErrorNumber = OCI_ErrorGetOCICode(hError)
    OCI_ErrorString = PeekS(OCI_ErrorGetString(hError))
    OCI_ErrorString = RemoveString(OCI_ErrorString, Chr(10))
  EndIf
  ;Debug "+++ ОШИБКА OCI " + Str(OCI_ErrorNumber) + " (" + OCI_ErrorString + ") +++"
  MessageRequester("Error", "Ошибка: " + Str(OCI_ErrorNumber) + " (" + OCI_ErrorString + ")");
EndProcedure
 
#OCI_ENV_DEFAULT =                    0
#OCI_ENV_THREADED =                   1
#OCI_ENV_CONTEXT =                    2
#OCI_ENV_EVENTS =                     4
#OCI_SESSION_DEFAULT =                0
#OCI_SESSION_XA =                     1
#OCI_SESSION_SYSDBA =                 2
#OCI_SESSION_SYSOPER =                4
#OCI_SESSION_PRELIM_AUTH =            8
 
; Инициализируем драйвер OCI
If OCI_Initialize(@OCI_ErrorHandler(), #Null, #OCI_ENV_DEFAULT) ; Если драйвер подключен
Else ; Иначе выдаем ошибку
  MessageRequester("Ошибка", "Не могу инициализировать OCILIB!", #MB_ICONERROR)
  End;
EndIf
 




Подключаемся к БД:
Код:
1
2
3
 
hConnection = OCI_ConnectionCreate("ИМЯ_БАЗЫ", "USER", "PASS", #OCI_SESSION_DEFAULT) ; Задаем РегДанные
 


если подключение успешно в hConnection возвращается значение <>0.


Обрабатываем простой запрос:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
hStatement = OCI_StatementCreate(hConnection)           ; Создаем запрос
TexteSQL$ = "SELECT USERS.NAME FROM USERS WHERE  ID=1"    ;   текст SQL-запроса
If OCI_ExecuteStmt(hStatement, TexteSQL$)            ; Выполнить запрос
   hResultSet = OCI_GetResultset(hStatement)         ; Получить результат
   If hResultSet                                    ; Если результат получен
      NbColumns = OCI_GetColumnCount(hResultSet)      ; возвращает количество столбцов в наборе результатов
      While (OCI_FetchNext(hResultSet))
         For Index = 1 To NbColumns
            Debug OCI_GetString(hResultSet, Index)  ;
         Next
      Wend
   EndIf
EndIf
 




Делаем запись в одну из таблиц БД:
Код:
1
2
3
4
5
6
 
SQLText.s = "UPDATE USER_TABL T SET T.STATUS = 1 WHERE T.ID = 112378";
OCI_ExecuteStmt(hStatement, SQLText);
OCI_Commit(hConnection); не забываем "закоммитить" (сохранить) изменения в БД
; или отменить сделанные изменения с помощью OCI_Rollback(hConnection)
 




Вызываем процедуру, хранящуюся в БД и возвращающую строку:
Код:
1
2
3
4
5
6
7
8
9
10
11
 
code.s = "";
SQLCode.s = "begin Get_Name_By_id(112378, :code); end;"   ; SQL-код с анонимным блоком вызова процедуры
 
OCI_Prepare(hStatement, SQLCode)
OCI_BindString(hStatement, ":code", code, 20)
 
OCI_ExecuteStmt(hStatement, SQLCode);
hResult = OCI_GetResultset(hStatement);
Debug code;
 




Вызываем процедуру, хранящуюся в БД и возвращающую курсор:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
hStatement2 = OCI_StatementCreate(hConnection) ; Создаем второй запрос
SQLCode.s = "begin PGET_CURS(12, :code); end;"
 
OCI_Prepare(hStatement, SQLCode)
OCI_BindStatement(hStatement, ":code", hStatement2)
OCI_Execute(hStatement);
 
hResult = OCI_GetResultset(hStatement2); получаем результат и обрабатываем его
If hResult
  n = OCI_GetColumnCount(hResult)
  While (OCI_FetchNext(hResult))
    Debug OCI_GetString(hResult, 1) + " " + OCI_GetString(hResult, 2) + " " + OCI_GetString(hResult, 3);
  Wend
EndIf
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB