【问题标题】:PHP-OCI Call Stored Procedure with parameters带参数的 PHP-OCI 调用存储过程
【发布时间】:2015-03-12 06:13:36
【问题描述】:

存储过程:

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. 如何将parent_child_hourschild_hours 的PHP 变量绑定为存储过程变量的输出?

【问题讨论】:

  • 绑定 pl/sql 输出变量也是用oci_bind_by_name 完成的。请参见示例 10。
  • @winkbrace 绑定正在工作,但我怎样才能获得这些变量的输出?

标签: php oracle stored-procedures oracle-call-interface


【解决方案1】:

在处理存储过程时,使用my answer 中的foreach 方法处理您的另一个问题并不是一个好主意。

虽然它确实有效(如您的问题所示,变量在执行后设置在$params 数组中),但最大的问题是您必须将第四个参数(maxlength)提供给oci_bind_by_name。您在代码中使用了静态值 32,但是当值的长度超过此值时会引发错误。它无法在运行时计算,并且将其设置为非常大的值是低效的(也许这对您的应用程序来说不是问题)。

由于您正在运行一个已知的存储过程,您应该在设计时知道输出值的maxlength,并且可以通过将所有oci_* 函数放入getHours() 来静态输入这些值,而不是试图抽象所有致电customExecute()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多