Примеры
Эти примеры выполняются под пользователем HR , который
является образцом из "Human Resources" схемы, поставляемой
вместе с базой данных Oracle. Возможно потребуется разблокировать этот аккаунт
и переустановить для него пароль, чтобы использовать его.
Примеры подключаются к базе данных XE на вашем компьютере.
Вы можете заменить строки с подключением для использования своих баз данных.
Пример #1 Простой запрос
Данный пример показывает запрос и результат. Выражения в OCI8 используют
последовательность из шагов подготовка-выполнение-выборка.
<?php $conn = oci_connect ( 'hr' , 'welcome' , 'localhost/XE' ); if (! $conn ) { $e = oci_error (); trigger_error ( htmlentities ( $e [ 'message' ], ENT_QUOTES ), E_USER_ERROR ); } // Подготовка выражения $stid = oci_parse ( $conn , 'SELECT * FROM departments' ); if (! $stid ) { $e = oci_error ( $conn ); trigger_error ( htmlentities ( $e [ 'message' ], ENT_QUOTES ), E_USER_ERROR ); } // Выполним логику запроса $r = oci_execute ( $stid ); if (! $r ) { $e = oci_error ( $stid ); trigger_error ( htmlentities ( $e [ 'message' ], ENT_QUOTES ), E_USER_ERROR ); } // Получим результат запроса print "<table border='1'>\n" ; while ( $row = oci_fetch_array ( $stid , OCI_ASSOC + OCI_RETURN_NULLS )) { print "<tr>\n" ; foreach ( $row as $item ) { print " <td>" . ( $item !== null ? htmlentities ( $item , ENT_QUOTES ) : "" ) . "</td>\n" ; } print "</tr>\n" ; } print "</table>\n" ; oci_free_statement ( $stid ); oci_close ( $conn ); ?>
Пример #2 Вставка с использованием привязанных переменных
Привязывание переменных повышают производительность за счет повторного
использования контекста запроса и кеширования. Также они повышают
безопасность блокируя некоторые типы SQL-инъекций.
<?php // Создайте таблицу перед выполнением: // CREATE TABLE MYTABLE (mid NUMBER, myd VARCHAR2(20)); $conn = oci_connect ( 'hr' , 'welcome' , 'localhost/XE' ); if (! $conn ) { $e = oci_error (); trigger_error ( htmlentities ( $e [ 'message' ], ENT_QUOTES ), E_USER_ERROR ); } $stid = oci_parse ( $conn , 'INSERT INTO MYTABLE (mid, myd) VALUES(:myid, :mydata)' ); $id = 60 ; $data = 'Some data' ; oci_bind_by_name ( $stid , ':myid' , $id ); oci_bind_by_name ( $stid , ':mydata' , $data ); $r = oci_execute ( $stid ); // выполнение и фиксация if ( $r ) { print "Была вставлена одна строка" ; } oci_free_statement ( $stid ); oci_close ( $conn ); ?>
Пример #3 Вставка данных в поле типа CLOB
Для больших данных используйте длинные двоичные объекты (BLOB) или
длинные символьные объекты (CLOB). Данный пример использует тип данных CLOB.
<?php // Создайте таблицу перед выполнением: // CREATE TABLE MYTABLE (mykey NUMBER, myclob CLOB); $conn = oci_connect ( 'hr' , 'welcome' , 'localhost/XE' ); if (! $conn ) { $e = oci_error (); trigger_error ( htmlentities ( $e [ 'message' ], ENT_QUOTES ), E_USER_ERROR ); } $mykey = 12343 ; // произвольный ключ для данного примера; $sql = "INSERT INTO mytable (mykey, myclob) VALUES (:mykey, EMPTY_CLOB()) RETURNING myclob INTO :myclob" ; $stid = oci_parse ( $conn , $sql ); $clob = oci_new_descriptor ( $conn , OCI_D_LOB ); oci_bind_by_name ( $stid , ":mykey" , $mykey , 5 ); oci_bind_by_name ( $stid , ":myclob" , $clob , - 1 , OCI_B_CLOB ); oci_execute ( $stid , OCI_NO_AUTO_COMMIT ); // используйте OCI_DEFAULT для PHP <= 5.3.1 $clob -> save ( "A very long string" ); oci_commit ( $conn ); // Получение CLOB данных $query = 'SELECT myclob FROM mytable WHERE mykey = :mykey' ; $stid = oci_parse ( $conn , $query ); oci_bind_by_name ( $stid , ":mykey" , $mykey , 5 ); oci_execute ( $stid ); print '<table border="1">' ; while ( $row = oci_fetch_array ( $stid , OCI_ASSOC )) { $result = $row [ 'MYCLOB' ]-> load (); print '<tr><td>' . $result . '</td></tr>' ; } print '</table>' ; ?>
Пример #4 Использование PL/SQL хранимых процедур
Вы должны привязывать переменную для каждого возвращаемого значения
и опционально для каждого аргумента функции.
<?php /* До выполнения PHP скрипта сойздайте хранимую процедуру в SQL*Plus или SQL Developer: CREATE OR REPLACE FUNCTION myfunc(p IN NUMBER) RETURN NUMBER AS BEGIN RETURN p * 3; END; */ $conn = oci_connect ( 'hr' , 'welcome' , 'localhost/XE' ); if (! $conn ) { $e = oci_error (); trigger_error ( htmlentities ( $e [ 'message' ], ENT_QUOTES ), E_USER_ERROR ); } $p = 8 ; $stid = oci_parse ( $conn , 'begin :r := myfunc(:p); end;' ); oci_bind_by_name ( $stid , ':p' , $p ); oci_bind_by_name ( $stid , ':r' , $r , 40 ); oci_execute ( $stid ); print " $r \n" ; // выведет 24 oci_free_statement ( $stid ); oci_close ( $conn ); ?>
Пример #5 Использование PL/SQL хранимых процедур
При использовании хранимых процедур желательно привязывать переменные
к каждому аргументу.
<?php /* До выполнения PHP скрипта сойздайте хранимую процедуру в SQL*Plus или SQL Developer: CREATE OR REPLACE PROCEDURE myproc(p1 IN NUMBER, p2 OUT NUMBER) AS BEGIN p2 := p1 * 2; END; */ $conn = oci_connect ( 'hr' , 'welcome' , 'localhost/XE' ); if (! $conn ) { $e = oci_error (); trigger_error ( htmlentities ( $e [ 'message' ], ENT_QUOTES ), E_USER_ERROR ); } $p1 = 8 ; $stid = oci_parse ( $conn , 'begin myproc(:p1, :p2); end;' ); oci_bind_by_name ( $stid , ':p1' , $p1 ); oci_bind_by_name ( $stid , ':p2' , $p2 , 40 ); oci_execute ( $stid ); print " $p2 \n" ; // выведет 16 oci_free_statement ( $stid ); oci_close ( $conn ); ?>
Пример #6 Вызов PL/SQL процедур, возвращающих REF CURSOR
Каждое возвращаемое значение из запроса является REF
CURSOR .
<?php /* Создайте PL/SQL хранимую процедуру: CREATE OR REPLACE FUNCTION myfunc(p1 IN NUMBER) RETURN SYS_REFCURSOR AS rc SYS_REFCURSOR; BEGIN OPEN rc FOR SELECT city FROM locations WHERE ROWNUM < p1; RETURN rc; END; */ $conn = oci_connect ( 'hr' , 'welcome' , 'localhost/XE' ); $stid = oci_parse ( $conn , 'SELECT myfunc(5) AS mfrc FROM dual' ); oci_execute ( $stid ); echo "<table border='1'>\n" ; while (( $row = oci_fetch_array ( $stid , OCI_ASSOC ))) { echo "<tr>\n" ; $rc = $row [ 'MFRC' ]; oci_execute ( $rc ); // возвращает значение поля из запроса в виде указателя while (( $rc_row = oci_fetch_array ( $rc , OCI_ASSOC ))) { echo " <td>" . $rc_row [ 'CITY' ] . "</td>\n" ; } oci_free_statement ( $rc ); echo "</tr>\n" ; } echo "</table>\n" ; // Выведет: // Beijing // Bern // Bombay // Geneva oci_free_statement ( $stid ); oci_close ( $conn ); ?>