Примеры
Эти примеры выполняются под пользователем HR , который является образцом из «Human Resources» схемы, поставляемой вместе с базой данных Oracle. Возможно потребуется разблокировать этот аккаунт и переустановить для него пароль, чтобы использовать его.
Примеры подключаются к базе данных XE на вашем компьютере. Вы можете заменить строки с подключением для использования своих баз данных.
Пример #1 Простой запрос
Данный пример показывает запрос и результат. Выражения в OCI8 используют последовательность из шагов подготовка-выполнение-выборка.
$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 «
» . ( $item !== null ? htmlentities ( $item , ENT_QUOTES ) : «» ) . « |
\n» ;
oci_free_statement ( $stid );
oci_close ( $conn );
Пример #2 Вставка с использованием привязанных переменных
Привязывание переменных повышают производительность за счёт повторного использования контекста запроса и кеширования. Также они повышают безопасность блокируя некоторые типы SQL-инъекций.
// Создайте таблицу перед выполнением:
// 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)’ );
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 Привязка в WHERE выражении запроса
Пример единичной привязки скаляра.
$conn = oci_connect ( «hr» , «hrpwd» , «localhost/XE» );
if (! $conn ) $m = oci_error ();
trigger_error ( htmlentities ( $m [ ‘message’ ]), E_USER_ERROR );
>
$sql = ‘SELECT last_name FROM employees WHERE department_id = :didbv ORDER BY last_name’ ;
$stid = oci_parse ( $conn , $sql );
$didbv = 60 ;
oci_bind_by_name ( $stid , ‘:didbv’ , $didbv );
oci_execute ( $stid );
while (( $row = oci_fetch_array ( $stid , OCI_ASSOC )) != false ) echo $row [ ‘LAST_NAME’ ] . «
\n» ;
>
// Выведет
// Austin
// Ernst
// Hunold
// Lorentz
// Pataballa
oci_free_statement ( $stid );
oci_close ( $conn );
Пример #4 Вставка данных в поле типа CLOB
Для больших данных используйте длинные двоичные объекты (BLOB) или длинные символьные объекты (CLOB). Данный пример использует тип данных CLOB.
// Создайте таблицу перед выполнением:
// 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 );
$clob -> save ( «A very long string» );
$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 ‘
‘ . $row [ ‘MYCLOB’ ]. ‘ |
‘ ;
Пример #5 Использование PL/SQL хранимых процедур
Вы должны привязывать переменную для каждого возвращаемого значения и опционально для каждого аргумента функции.
/*
До выполнения 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 );
>
$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_free_statement ( $stid );
oci_close ( $conn );
Пример #6 Использование PL/SQL хранимых процедур
При использовании хранимых процедур желательно привязывать переменные к каждому аргументу.
/*
До выполнения 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 );
>
$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_free_statement ( $stid );
oci_close ( $conn );
Пример #7 Вызов PL/SQL процедур, возвращающих REF CURSOR
Каждое возвращаемое значение из запроса является REF CURSOR .
/*
Создайте PL/SQL хранимую процедуру:
?php
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 «
» . $rc_row [ ‘CITY’ ] . « |
\n» ;
// Выведет:
// Beijing
// Bern
// Bombay
// Geneva
oci_free_statement ( $stid );
oci_close ( $conn );
Using Oracle
This tutorial covers the essentials you need to know to use Oracle with PHP.
- The environment variable ORACLE_HOME must be set so that PHP can find the client libraries.
- Windows users need the php.ini directive extension=php_oci8***.dll .
- PHP requires read access to the client libraries.
The oci_connect() tries to establish a connection to the server. The order of the parameters is first username and password, then the name of the service (that has been configured using the configuration assistant or is part of the tnsnames.ora file).
Connecting to Oracle:
'; echo $error['message']; exit; > echo 'Connected'; oci_close($conn);
Sending SQL to Oracle
'; echo $error['message']; exit; > $stmt = oci_parse($conn, 'INSERT INTO user_table (name, email) VALUES (:name, :email)'); oci_bind_by_name($stmt, ':name', $_POST['name']); oci_bind_by_name($stmt, ':email', $_POST['email']); oci_execute($stmt); echo 'Record saved.'; oci_close($conn);
To send SQL to Oracle, two steps are required. First, a call to oci_parse() parses an SQL string and returns a resource that can then be executed using oci_execute() .
The preceding code uses the prepared statements to escape the dangerous characters in the SQL string, prepared statements are a must but are also very easy to implement. For this, the SQL statement must contain placeholders that start with a colon:
Then, these placeholders have to be filled with values. For this, oci_bind_by_name() must be used:
The preceding code sends some form data to the database. No worries about special characters because oci_bind_by_name takes care of that.
Retrieving Results of a Query to Oracle
- oci_fetch_assoc() returns the current row in the resultset as an associative array.
- oci_fetch_object() returns the current row in the resultset as an object.
- oci_fetch_row() returns the current row in the resultset as a numeric array.
- oci_fetch_all() returns the complete resultset as an array of associative arrays. However, five parameters are required: the statement object from oci_parse() , the array that is used for the return data, the number of lines to skip, the maximum number of rows to be returned ( -1 means infinite), and whether to return a numeric ( OCI_NUM ) or associative ( OCI_ASSOC ) array. See https://php.net/manual/function.oci-fetch-all.php.
The listing in This uses a while loop and oci_fetch_object() to retrieve all data in the table.
Retrieving Data from Oracle
'; echo $error['message']; exit; > $stmt = oci_parse($conn, 'SELECT * FROM quotes'); oci_execute($stmt); while ($row = oci_fetch_object($stmt)) < echo $row->ID.', '.$row->NAME.', '.$row->EMAIL.'
'; > oci_close($db);
Oracle always returns column names in uppercase. Therefore, you have to use uppercase object properties or uppercase associative array keys when accessing the return values of an SQL query.
Working with Databases: