范例

这些示例作为HR用户连接,这是神通数据库提供的示例“人力资源”模式。帐户可能需要解锁并重置密码才能使用。

这些示例连接到您机器上的OSRDB数据库。在运行示例之前,更改数据库的连接字符串。

示例

#1 基本查询

这将显示查询和显示结果。ACI中的语句使用准备-执行-获取步骤序列

<?php

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');
if (!$conn) {
 $e = aci_error();
 trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// 语句准备
$stid = aci_parse($conn, 'SELECT * FROM departments');
if (!$stid) {
    $e = aci_error($conn);
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// 执行
$r = aci_execute($stid);
if (!$r) {
    $e = aci_error($stid);
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

// 获取结果
print "<table border='1'>\n";
while ($row = aci_fetch_array($stid, ACI_ASSOC+ACI_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";


aci_free_statement($stid);
aci_close($conn);
?>

示例 #2 使用绑定变量插入

绑定变量通过允许重用执行上下文和缓存来提高性能。绑定变量通过防止某些SQL注入问题来提高安全性。

<?php

// 在执行前先建表
// CREATE TABLE MYTABLE (mid NUMBER, myd VARCHAR2(20));

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');
if (!$conn) {
    $e = aci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = aci_parse($conn, 'INSERT INTO MYTABLE (mid, myd) VALUES(:myid, :mydata)');

$id = 60;
$data = 'Some data';

aci_bind_by_name($stid, ':myid', $id);
aci_bind_by_name($stid, ':mydata', $data);

$r = aci_execute($stid);

if ($r) {
    print "One row inserted";
}

aci_free_statement($stid);
aci_close($conn);

?>

示例 #3 查询的WHERE子句中的绑定

这显示了单个标量绑定

<?php

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');
if (!$conn) {
    $m = aci_error();
    trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$sql = 'SELECT last_name FROM employees WHERE department_id = :didbv ORDER BY last_name';
$stid = aci_parse($conn, $sql);
$didbv = 60;
aci_bind_by_name($stid, ':didbv', $didbv);
aci_execute($stid);
while (($row = aci_fetch_array($stid, ACI_ASSOC)) != false) {
    echo $row['LAST_NAME'] ."<br>\n";
}

// 输出一下结果
//    Austin
//    Ernst
//    Hunold
//    Lorentz
//    Pataballa

aci_free_statement($stid);
aci_close($conn);

?>

示例 #4 插入和获取CLOB

对于大数据,请使用二进制长对象(BLOB)或字符长对象(CLOB)类型。本例使用CLOB。

<?php

// 在执行前先建表
// CREATE TABLE MYTABLE (mykey NUMBER, myclob CLOB);

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');
if (!$conn) {
    $e = aci_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 = aci_parse($conn, $sql);
$clob = aci_new_descriptor($conn, ACI_D_LOB);
aci_bind_by_name($stid, ":mykey", $mykey, 5);
aci_bind_by_name($stid, ":myclob", $clob, -1, ACI_B_CLOB);
aci_execute($stid, ACI_NO_AUTO_COMMIT); // use ACI_DEFAULT for PHP <= 5.3.1
$clob->save("A very long string");

aci_commit($conn);

// 获取lob数据

$query = 'SELECT myclob FROM mytable WHERE mykey = :mykey';

$stid = aci_parse ($conn, $query);
aci_bind_by_name($stid, ":mykey", $mykey, 5);
aci_execute($stid);

print '<table border="1">';
while ($row = aci_fetch_array($stid, ACI_ASSOC+ACI_RETURN_LOBS)) {
    print '<tr><td>'.$row['MYCLOB'].'</td></tr>';
    unset($row);
}
print '</table>';

?>

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

必须为返回值和任何PL/SQL函数参数绑定变量。

<?php

/*
  执行前先创建函数

  CREATE OR REPLACE FUNCTION myfunc(p IN NUMBER) RETURN NUMBER AS
  BEGIN
      RETURN p * 3;
  END;

*/

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');
if (!$conn) {
    $e = aci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$p = 8;

$stid = aci_parse($conn, 'begin :r := myfunc(:p); end;');
aci_bind_by_name($stid, ':p', $p);
aci_bind_by_name($stid, ':r', $r, 40);

aci_execute($stid);

print "$r\n";   // prints 24

aci_free_statement($stid);
aci_close($conn);

?>

示例 #6 使用PL/SQL存储过程

对于存储过程,您应该为任何参数绑定变量。

<?php

/*
  执行前先创建存储过程

  CREATE OR REPLACE PROCEDURE myproc(p1 IN NUMBER, p2 OUT NUMBER) AS
  BEGIN
      p2 := p1 * 2;
  END;

*/

$conn = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');
if (!$conn) {
    $e = aci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$p1 = 8;

$stid = aci_parse($conn, 'begin myproc(:p1, :p2); end;');
aci_bind_by_name($stid, ':p1', $p1);
aci_bind_by_name($stid, ':p2', $p2, 40);

aci_execute($stid);

print "$p2\n";   // prints 16

aci_free_statement($stid);
aci_close($conn);

?>

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

查询返回的每个值都是一个REF CURSOR,可以从中获取。

<?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 = aci_connect('sysdba', 'szoscar55', 'localhost:2003/OSRDB');

$stid = aci_parse($conn, 'SELECT myfunc(5) AS mfrc FROM dual');
aci_execute($stid);

echo "<table border='1'>\n";
while (($row = aci_fetch_array($stid, OCI_ASSOC))) {
    echo "<tr>\n";
    $rc = $row['MFRC'];
    aci_execute($rc);  // returned column value from the query is a ref cursor
    while (($rc_row = aci_fetch_array($rc, OCI_ASSOC))) {
        echo "    <td>" . $rc_row['CITY'] . "</td>\n";
    }
    aci_free_statement($rc);
    echo "</tr>\n";
}
echo "</table>\n";

// 输出以下结果
//   Beijing
//   Bern
//   Bombay
//   Geneva

aci_free_statement($stid);
aci_close($conn);

?>