PHP 使用存储过程 - Oracle 中的游标输出
PHP with stored procedure - cursor output in Oracle
我一直在尝试使用 PHP 从 Oracle 中的存储过程中获取结果。这个存储过程有一些输入参数和一个输出游标,它给我结果。
这是我的存储过程:
CREATE OR REPLACE PROCEDURE "TEST1" (
pPARAM1 CLOB,
pPARAM2 VARCHAR2,
p_record OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN p_record FOR
SELECT * FROM PARAMS
WHERE id_param = pPARAM1 AND id_param2 = pPARAM2;
END;
这是我的代码:
$conexion = oci_connect($username, $password, $connection);
if (!$conexion) {
$e = oci_error();
echo $e['message'];
}
$params = array("pPARAM1" => 'apple', "pPARAM2" => 'banana');
$params_values = [];
$params_marks = [];
$marks = "";
$i = 0;
if(count($params) > 0) {
foreach ($params as $key => $value) {
$params_marks[$i] = ":" . $key;
$params_values[$key] = $value;
$i++;
}
$marks = implode(",", $params_marks);
$query = 'BEGIN TEST1(' . $marks . ',:cursbv); END;';
} else {
$query = 'BEGIN TEST1(:cursbv); END;';
}
$rs = oci_parse($conexion, $query) or die();
foreach ($params_values as $key => $value) {
oci_bind_by_name($rs, $key, $params_values[$key]);
}
$cursor = oci_new_cursor($conexion);
oci_bind_by_name($rs, ":cursbv", $cursor, -1, OCI_B_CURSOR) or die();
oci_execute($rs);
oci_execute($cursor);
if ($rs) {
while (($row = oci_fetch_array($cursor, OCI_ASSOC + OCI_RETURN_NULLS)) != false) {
var_dump($row);
}
}
oci_free_statement($rs);
oci_free_statement($cursor);
这在 oci_fetch_array
中给了我一个警告,但不明白为什么,因为 $cursor
是一个 oci-resource。需要任何建议。谢谢。
注意:我的table有一些CLOB列,存储过程可能有一些CLOB输入参数。
如果它对其他人有用:由于使用了 CLOB 列和参数,我需要添加...
绑定变量:
$clob['apple'] = oci_new_descriptor($conexion, OCI_D_LOB);
oci_bind_by_name($rs, 'apple', $clob['apple'], -1, OCI_B_CLOB);
$clob['apple']->writeTemporary($params_values['apple']);
oci_bind_by_name($rs, 'banana', $params_values['banana']);
获取结果:
while (($row = oci_fetch_array($cursor, OCI_ASSOC + OCI_RETURN_LOBS + OCI_RETURN_NULLS)) != false) {
我一直在尝试使用 PHP 从 Oracle 中的存储过程中获取结果。这个存储过程有一些输入参数和一个输出游标,它给我结果。
这是我的存储过程:
CREATE OR REPLACE PROCEDURE "TEST1" (
pPARAM1 CLOB,
pPARAM2 VARCHAR2,
p_record OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN p_record FOR
SELECT * FROM PARAMS
WHERE id_param = pPARAM1 AND id_param2 = pPARAM2;
END;
这是我的代码:
$conexion = oci_connect($username, $password, $connection);
if (!$conexion) {
$e = oci_error();
echo $e['message'];
}
$params = array("pPARAM1" => 'apple', "pPARAM2" => 'banana');
$params_values = [];
$params_marks = [];
$marks = "";
$i = 0;
if(count($params) > 0) {
foreach ($params as $key => $value) {
$params_marks[$i] = ":" . $key;
$params_values[$key] = $value;
$i++;
}
$marks = implode(",", $params_marks);
$query = 'BEGIN TEST1(' . $marks . ',:cursbv); END;';
} else {
$query = 'BEGIN TEST1(:cursbv); END;';
}
$rs = oci_parse($conexion, $query) or die();
foreach ($params_values as $key => $value) {
oci_bind_by_name($rs, $key, $params_values[$key]);
}
$cursor = oci_new_cursor($conexion);
oci_bind_by_name($rs, ":cursbv", $cursor, -1, OCI_B_CURSOR) or die();
oci_execute($rs);
oci_execute($cursor);
if ($rs) {
while (($row = oci_fetch_array($cursor, OCI_ASSOC + OCI_RETURN_NULLS)) != false) {
var_dump($row);
}
}
oci_free_statement($rs);
oci_free_statement($cursor);
这在 oci_fetch_array
中给了我一个警告,但不明白为什么,因为 $cursor
是一个 oci-resource。需要任何建议。谢谢。
注意:我的table有一些CLOB列,存储过程可能有一些CLOB输入参数。
如果它对其他人有用:由于使用了 CLOB 列和参数,我需要添加...
绑定变量:
$clob['apple'] = oci_new_descriptor($conexion, OCI_D_LOB);
oci_bind_by_name($rs, 'apple', $clob['apple'], -1, OCI_B_CLOB);
$clob['apple']->writeTemporary($params_values['apple']);
oci_bind_by_name($rs, 'banana', $params_values['banana']);
获取结果:
while (($row = oci_fetch_array($cursor, OCI_ASSOC + OCI_RETURN_LOBS + OCI_RETURN_NULLS)) != false) {