PHP Conference Japan 2024

oci_new_cursor

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_new_cursor分配并返回一个新的游标(语句句柄)

描述

oci_new_cursor(资源 $connection): 资源|false

在指定的连接上分配一个新的语句句柄。

参数

connection

一个 Oracle 连接标识符,由 oci_connect()oci_pconnect() 返回。

返回值

返回一个新的语句句柄,或者在错误时返回 false

范例

示例 #1 在 Oracle 存储过程调用中绑定 REF 游标

<?php

// 预创建:
// create or replace procedure myproc(myrc out sys_refcursor) as
// begin
// open myrc for select first_name from employees;
// end;

$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!
$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}

$curs = oci_new_cursor($conn);
$stid = oci_parse($conn, "begin myproc(:cursbv); end;");
oci_bind_by_name($stid, ":cursbv", $curs, -1, OCI_B_CURSOR);
oci_execute($stid);

oci_execute($curs); // 执行 REF 游标就像一个普通的语句 ID
while (($row = oci_fetch_array($curs, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
echo
$row['FIRST_NAME'] . "<br />\n";
}

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

?>

添加注释

用户贡献的注释 3 条注释

mgumiel at mgait dot com
12 年前
Oracle 中的一些包是函数,这些函数返回游标。

例如

CREATE FUNCTION F_Function( p1 char(2), p2 int)
RETURN SYS_REFCURSOR
AS
my_cursor SYS_REFCURSOR;
BEGIN
OPEN my_cursor FOR SELECT * FROM allitems
WHERE (cod=p1)
AND (Number=p2);
RETURN my_cursor;
END F_Function;

以下代码允许从返回游标的函数中获取数据。

<pre>
<?php
$conn
=oci_connect("server", "user", "pass");
if (!
$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

// 您必须事先赋值。
$p1 = '03';
$p2 = 2012016191;

$stid = oci_parse($conn, 'begin :cursor := server.PKG_package.F_Function(:p1,:p2); end;');
$p_cursor = oci_new_cursor($conn);

// 发送参数变量值长度
oci_bind_by_name($stid, ':p1', $p1,2);
oci_bind_by_name($stid, ':p2', $p2,10);

// 绑定游标,放置 -1
oci_bind_by_name($stid, ':cursor', $p_cursor, -1, OCI_B_CURSOR);

// 执行语句
oci_execute($stid);
oci_execute($p_cursor, OCI_DEFAULT);

oci_fetch_all($p_cursor, $cursor, null, null, OCI_FETCHSTATEMENT_BY_ROW);
echo
'<br>';
print_r($cursor);
?>
sixd at php dot net
14 年前
Oracle 11.2 引入了对 REF 游标预取的支持
sixd at php dot net
16 年前
由于 OCI8 使用“预取”来极大地提高返回查询结果的速度,但 Oracle 不支持 REF CURSOR 的预取,因此可以通过编写一个从 REF CURSOR 中提取数据并将输出通过管道传输的 PL/SQL 函数来极大地提高使用 REF CURSOR 的应用程序性能。新函数可以在 SELECT 中像查询表一样进行查询。请参阅 http://blogs.oracle.com/opal/2008/11/
converting_ref_cursor_to_pipe.html
To Top