Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Примеры
Эти примеры выполняются под пользователем 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 "<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-инъекций.
// Создайте таблицу перед выполнением:
// 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.
// Создайте таблицу перед выполнением:
// 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 скрипта сойздайте хранимую процедуру в
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 скрипта сойздайте хранимую процедуру в
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.
/*
Создайте 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);
Смотрите также:
Описание на ru2.php.net
Описание на php.ru