2024 年 PHP Conference Japan

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 CURSOR

<?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); // 像一般的語句 ID 一樣執行 REF CURSOR
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 CURSOR 預提取。
sixd at php dot net
16 年前
由於 OCI8 使用「預提取」來大幅提升查詢結果的回傳速度,但 Oracle 不支援 REF CURSOR 的預提取,因此,透過撰寫一個從 REF CURSOR 中提取資料並透過 PIPE 輸出結果的 PL/SQL 函式,可以大幅提升使用 REF CURSOR 的應用程式效能。新的函式可以在 SELECT 查詢中使用,如同它是一個表格一樣。詳見 http://blogs.oracle.com/opal/2008/11/
將參考游標轉換為管道.html (jiang cankao youbiao zhuanhuan wei guandao.html)
To Top