存储过程:
parentchildhrs number(7,0);
childhours number(7,0);
begin
COMBINED_HOURS(122,parentchildhrs,childhours);
end;
通过Oracle SQL Developer
执行上述操作时,输出正确的期望值,即小时。输出如下
CHILD HOURS 50
parent task id 122
parentchild HOURS 100
现在,当我使用 PHP-OCI 调用时,它什么也不输出。
$taskID = 122;
$parent_hours = '';
$child_hours = '';
$procedure = "BEGIN TASK_COMBINED_CHILD_HRS(:task_id, :parent_child_hours, :child_hours); END;";
$test = $taskmaster->getHours($procedure, [':task_id' => $taskID,':parent_child_hours' => (int)$sum_parent_child_hours,':child_hours' => (int)$sum_child_hours]);
public function getHours($query, $params){
$result_hours = parent::ocibindbyname($query, $params);
return $result_hours;
}
public static function customquery($query, $params)
{
try{
$stmt = oci_parse($conn, $query);
foreach ($params as $key => &$value) {
oci_bind_by_name($stmt, $key, $value, 32);
}
oci_execute($stmt,OCI_COMMIT_ON_SUCCESS);
oci_commit($conn);
oci_free_statement($stmt);
return $params;
}catch (Exception $e){
print_r($e);
}
}
打印结果给出
Array
(
[:task_id] => 1142
[:parent_child_hours] => 100
[:child_hours] => 50
)
- 如何将 PHP 变量绑定为存储过程变量的输出
parent_child_hours
和child_hours
?
在处理存储过程时,使用我回答您的另一个问题中的foreach
方法不是一个好主意。
虽然它确实有效(如您的问题所示,变量在执行后在 $params
数组中设置),但最大的问题是您必须提供第四个参数 ( maxlength
) 来oci_bind_by_name
。 你在代码中使用了静态值 32
,但当值的长度超过此值时,会引发错误。 它无法在运行时计算,并且将其设置为非常大的值效率低下(也许这对您的应用程序来说不是问题)。
由于您正在运行已知的存储过程,因此您应该在设计时知道输出值的maxlength
,并且可以通过将所有oci_*
函数放在getHours()
中来静态输入这些值,而不是尝试抽象所有对customExecute()
的调用。