oci_bind_array_by_name
(PHP 5 >= 5.1.2, PECL OCI8 >= 1.2.0)
oci_bind_array_by_name — Связывает PHP массив с массивом Oracle PL/SQL
Описание
$statement
, string $name
, array &$var_array
, int $max_table_length
[, int $max_item_length
= -1
[, int $type
= SQLT_AFC
]] )
Связывает PHP массив var_array
с указателем Oracle
name
на массив Oracle PL/SQL. Направление, ввод или
вывод, для которого будет использоваться массив будет определяться во время
выполнения.
Список параметров
-
statement
-
Идентификатор допустимого OCI выражения.
-
name
-
Указатель на массив Oracle.
-
var_array
-
Массив.
-
max_table_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
$c = oci_connect("scott", "tiger");
$create = "CREATE TABLE bind_example(name VARCHAR(20))";
$statement = oci_parse($c, $create);
oci_execute($statement);
$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;";
$statement = oci_parse($c, $create_pkg);
oci_execute($statement);
$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
FOR i IN 1..5 LOOP
INSERT INTO bind_example VALUES (c1(i));
END LOOP;
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;";
$statement = oci_parse($c, $create_pkg_body);
oci_execute($statement);
$statement = oci_parse($c, "BEGIN ARRAYBINDPKG1.iobind(:c1); END;");
$array = array("one", "two", "three", "four", "five");
oci_bind_array_by_name($statement, ":c1", $array, 5, -1, SQLT_CHR);
oci_execute($statement);
var_dump($array);
?>
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Расширения для работы с базами данных отдельных производителей
- Oracle OCI8
- oci_bind_array_by_name
- oci_bind_by_name
- oci_cancel
- oci_client_version
- oci_close
- oci_commit
- oci_connect
- oci_define_by_name
- oci_error
- oci_execute
- oci_fetch_all
- oci_fetch_array
- oci_fetch_assoc
- oci_fetch_object
- oci_fetch_row
- oci_fetch
- oci_field_is_null
- oci_field_name
- oci_field_precision
- oci_field_scale
- oci_field_size
- oci_field_type_raw
- oci_field_type
- oci_free_descriptor
- oci_free_statement
- oci_get_implicit_resultset
- oci_internal_debug
- oci_lob_copy
- oci_lob_is_equal
- oci_new_collection
- oci_new_connect
- oci_new_cursor
- oci_new_descriptor
- oci_num_fields
- oci_num_rows
- oci_parse
- oci_password_change
- oci_pconnect
- oci_result
- oci_rollback
- oci_server_version
- oci_set_action
- oci_set_client_identifier
- oci_set_client_info
- oci_set_edition
- oci_set_module_name
- oci_set_prefetch
- oci_statement_type
Коментарии
Note that it looks like you can't bind a multi-dimensional array with this method. If you try, you'll get a Notice about Array to string conversion, and your PL/SQL will end up with a one-dimensional array filled with the a lot of string values, all saying "Array". :|
This function appears to work with PL/SQL associative arrays (index-by tables) but I was unable to get it to work with PL/SQL varrays
We were able to get the example included for the "OCI_BIND_ARRAY_BY_NAME" to work. However, the example is NOT actually binding with a PL/SQL array of any type. It is writing data to an Oracle table named "bind_example". Notice how this table is created. The table does NOT have an array type as one of its fields. Since this is the case, there cannot be any binding to a PL/SQL array because at least one field in the table must be either a VARRAY, NESTED TABLE or ASSOCIATIVE ARRAY data type. We searched the Internet and could not find any examples that actually read from a PL/SQL array type. We were able to get data from a PL/SQL VARRAY data type, but only by using a SELECT statement.