示例

这些示例以 HR 用户身份连接,该用户是 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) : "&nbsp;") . "</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 在查询的 WHERE 子句中绑定

这展示了单个标量绑定。

<?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);

?>

示例 #4 插入和获取 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);
$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>';

?>

示例 #5 使用 PL/SQL 存储函数

您必须绑定一个变量来表示返回值,并为任何 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);

?>

示例 #6 使用 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);

?>

示例 #7 调用返回 REF CURSOR 的 PL/SQL 函数

从查询中返回的每个值都是一个可以从中获取数据的 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); // 从查询返回的列值是一个 ref 游标
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";

// 输出为:
// 北京
// 伯尔尼
// 孟买
// 日内瓦

oci_free_statement($stid);
oci_close($conn);

?>
添加备注

用户贡献的笔记 1 个笔记

alvaro at demogracia dot com
9 年前
要运行过程,您可以使用 "CALL",例如:

CALL DBMS_MVIEW.REFRESH('SALES_MV');
To Top