PHP Conference Japan 2024

oci_bind_array_by_name

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL OCI8 >= 1.2.0)

oci_bind_array_by_name將 PHP 陣列繫結至 Oracle PL/SQL 陣列參數

描述

oci_bind_array_by_name(
    資源 $statement,
    字串 $param,
    陣列 &$var,
    整數 $max_array_length,
    整數 $max_item_length = -1,
    整數 $type = SQLT_AFC
): 布林值

將 PHP 陣列 var 繫結至 Oracle 預留位置 param,該預留位置指向 Oracle PL/SQL 陣列。它將用於輸入還是輸出將在執行時確定。

參數

statement

有效的 OCI 語句識別符。

param

Oracle 預留位置。

var

一個陣列。

max_array_length

設定輸入和結果陣列的最大長度。

max_item_length

設定陣列項目的最大長度。如果未指定或等於 -1,則 oci_bind_array_by_name() 將找到輸入陣列中最長的元素,並將其用作最大長度。

type

應用於設定 PL/SQL 陣列項目的類型。請參閱下方可用的類型清單

  • SQLT_NUM - 用於 NUMBER 的陣列。

  • SQLT_INT - 用於 INTEGER 的陣列 (注意:INTEGER 實際上是 NUMBER(38) 的同義詞,但即使它們是同義詞,SQLT_NUM 類型在這種情況下也無法運作)。

  • SQLT_FLT - 用於 FLOAT 的陣列。

  • SQLT_AFC - 用於 CHAR 的陣列。

  • SQLT_CHR - 用於 VARCHAR2 的陣列。

  • SQLT_VCS - 用於 VARCHAR 的陣列。

  • SQLT_AVC - 用於 CHARZ 的陣列。

  • SQLT_STR - 用於 STRING 的陣列。

  • SQLT_LVC - 用於 LONG VARCHAR 的陣列。

  • SQLT_ODT - 用於 DATE 的陣列。

回傳值

成功時回傳 true,失敗時回傳 false

範例

範例 #1 oci_bind_array_by_name() 範例

<?php

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

$create = "CREATE TABLE bind_example(name VARCHAR(20))";
$stid = oci_parse($conn, $create);
oci_execute($stid);

$create_pkg = "
CREATE OR REPLACE PACKAGE ARRAYBINDPKG1 AS
TYPE ARRTYPE IS TABLE OF VARCHAR(20) INDEX BY BINARY_INTEGER;
PROCEDURE iobind(c1 IN OUT ARRTYPE);
END ARRAYBINDPKG1;"
;
$stid = oci_parse($conn, $create_pkg);
oci_execute($stid);

$create_pkg_body = "
CREATE OR REPLACE PACKAGE BODY ARRAYBINDPKG1 AS
CURSOR CUR IS SELECT name FROM bind_example;
PROCEDURE iobind(c1 IN OUT ARRTYPE) IS
BEGIN
-- Bulk Insert
FORALL i IN INDICES OF c1
INSERT INTO bind_example VALUES (c1(i));

-- Fetch and reverse
IF NOT CUR%ISOPEN THEN
OPEN CUR;
END IF;
FOR i IN REVERSE 1..5 LOOP
FETCH CUR INTO c1(i);
IF CUR%NOTFOUND THEN
CLOSE CUR;
EXIT;
END IF;
END LOOP;
END iobind;
END ARRAYBINDPKG1;"
;
$stid = oci_parse($conn, $create_pkg_body);
oci_execute($stid);

$stid = oci_parse($conn, "BEGIN arraybindpkg1.iobind(:c1); END;");
$array = array("one", "two", "three", "four", "five");
oci_bind_array_by_name($stid, ":c1", $array, 5, -1, SQLT_CHR);
oci_execute($stid);

var_dump($array);

?>

新增註解

使用者貢獻的註解 3 則註解

3
匿名
16 年前
此函式似乎適用於 PL/SQL 關聯陣列(索引表),但我無法使其適用於 PL/SQL varrays
-4
david dot paper at usu dot edu
15 年前
我們成功讓「OCI_BIND_ARRAY_BY_NAME」的範例程式碼運作了。然而,這個範例實際上並不是綁定任何類型的 PL/SQL 陣列。它只是將資料寫入名為「bind_example」的 Oracle 資料表。請注意這個資料表的建立方式。這個資料表其中一個欄位並不是陣列類型。既然如此,就不可能綁定 PL/SQL 陣列,因為資料表中至少要有一個欄位是 VARRAY、NESTED TABLE 或 ASSOCIATIVE ARRAY 資料類型。我們在網路上搜尋過,找不到任何實際從 PL/SQL 陣列類型讀取資料的範例。我們確實可以從 PL/SQL VARRAY 資料類型取得資料,但僅限於使用 SELECT 敘述。
-4
匿名使用者
17 年前
請注意,看起來你無法用這個方法綁定多維陣列。如果你嘗試這麼做,你會收到關於陣列轉換為字串的通知,而且你的 PL/SQL 最後會得到一個一維陣列,裡面充滿了大量的字串值,全部都寫著「Array」。:|
To Top