Хранимая процедура:
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
)
parent_child_hours
и child_hours
как вывод из переменной хранимой процедуры? Использование подхода foreach
из моего ответа на другой ваш вопрос не является хорошей идеей при работе с хранимыми процедурами.
Хотя он работает (как показано в вашем вопросе, переменные устанавливаются в массиве $params
после выполнения), самая большая проблема заключается в том, что вы должны maxlength
четвертый параметр (maxlength
) на имя oci_bind_by_name
. Вы использовали статическое значение 32
в вашем коде, но ошибка возникает, когда длина значения превышает это значение. Он не может быть рассчитан во время выполнения, а установка его на очень большое значение неэффективна (может быть, это не проблема для вашего приложения).
Поскольку вы используете известную хранимую процедуру, вы должны знать maxlength
выходных значений во время разработки, и их можно статически oci_*
помещая все функции oci_*
в getHours()
вместо того, чтобы пытаться абстрагировать все вызовы customExecute()
.