Хранимая процедура вызова PHP-OCI с параметрами

0

Хранимая процедура:

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
)
  1. Как я могу привязать переменную PHP для parent_child_hours и child_hours как вывод из переменной хранимой процедуры?
  • 0
    связывание выходных переменных pl / sql также выполняется с помощью oci_bind_by_name . Смотрите пример 10.
  • 0
    Связывание @winkbrace работает, но как я могу получить выходные данные этих переменных?
Теги:
stored-procedures
oci

1 ответ

0

Использование подхода foreach из моего ответа на другой ваш вопрос не является хорошей идеей при работе с хранимыми процедурами.

Хотя он работает (как показано в вашем вопросе, переменные устанавливаются в массиве $params после выполнения), самая большая проблема заключается в том, что вы должны maxlength четвертый параметр (maxlength) на имя oci_bind_by_name. Вы использовали статическое значение 32 в вашем коде, но ошибка возникает, когда длина значения превышает это значение. Он не может быть рассчитан во время выполнения, а установка его на очень большое значение неэффективна (может быть, это не проблема для вашего приложения).

Поскольку вы используете известную хранимую процедуру, вы должны знать maxlength выходных значений во время разработки, и их можно статически oci_* помещая все функции oci_* в getHours() вместо того, чтобы пытаться абстрагировать все вызовы customExecute().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню