mirror of
https://github.com/php/doc-ru.git
synced 2025-07-22 18:26:31 +00:00
365 lines
10 KiB
XML
365 lines
10 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 5e41012cfdf8f2eff5fa56de446c7656afac536c Maintainer: irker Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<chapter xml:id="oci8.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
&reftitle.examples;
|
||
<para>
|
||
Эти примеры выполняются под пользователем <literal>HR</literal>, который
|
||
является образцом из "Human Resources" схемы, поставляемой
|
||
вместе с базой данных Oracle. Возможно потребуется разблокировать этот аккаунт
|
||
и переустановить для него пароль, чтобы использовать его.
|
||
</para>
|
||
|
||
<para>
|
||
Примеры подключаются к базе данных <literal>XE</literal> на вашем компьютере.
|
||
Вы можете заменить строки с подключением для использования своих баз данных.
|
||
</para>
|
||
|
||
<example>
|
||
<title>Простой запрос</title>
|
||
<para>
|
||
Данный пример показывает запрос и результат. Выражения в OCI8 используют
|
||
последовательность из шагов подготовка-выполнение-выборка.
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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);
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<example>
|
||
<title>Вставка с использованием привязанных переменных</title>
|
||
<para>
|
||
Привязывание переменных повышают производительность за счёт повторного
|
||
использования контекста запроса и кеширования. Также они повышают
|
||
безопасность блокируя некоторые типы SQL-инъекций.
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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);
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<example>
|
||
<title>Привязка в WHERE выражении запроса</title>
|
||
<para>
|
||
Пример единичной привязки скаляра.
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
$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'] ."<br>\n";
|
||
}
|
||
|
||
// Выведет
|
||
// Austin
|
||
// Ernst
|
||
// Hunold
|
||
// Lorentz
|
||
// Pataballa
|
||
|
||
oci_free_statement($stid);
|
||
oci_close($conn);
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<example>
|
||
<title>Вставка данных в поле типа CLOB</title>
|
||
<para>
|
||
Для больших данных используйте длинные двоичные объекты (BLOB) или
|
||
длинные символьные объекты (CLOB). Данный пример использует тип данных CLOB.
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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);
|
||
$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+OCI_RETURN_LOBS)) {
|
||
print '<tr><td>'.$row['MYCLOB'].'</td></tr>';
|
||
// В цикле, очищение больших переменных перед повторным получением данных, уменьшает пиковое потребление памяти PHP
|
||
unset($row);
|
||
}
|
||
print '</table>';
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<example>
|
||
<title>Использование PL/SQL хранимых процедур</title>
|
||
<para>
|
||
Вы должны привязывать переменную для каждого возвращаемого значения
|
||
и опционально для каждого аргумента функции.
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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);
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<example>
|
||
<title>Использование PL/SQL хранимых процедур</title>
|
||
<para>
|
||
При использовании хранимых процедур желательно привязывать переменные
|
||
к каждому аргументу.
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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);
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
|
||
<example>
|
||
<title>Вызов PL/SQL процедур, возвращающих <literal>REF CURSOR</literal></title>
|
||
<para>
|
||
Каждое возвращаемое значение из запроса является <literal>REF
|
||
CURSOR</literal>.
|
||
</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?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);
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</chapter>
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|