我一直在使用 Oracle 中调用存储过程,执行以下操作:
$sql = "CALL namespace.my_proc(".$data_source_id.", to_date('".$account_period_start."', 'YYYY-MM-DD'),'".$updated_by."')";
$stmt = $this->getDoctrine()->getManager('fdw')->getConnection()->prepare($sql);
$result = $stmt->execute();
$stmt->closeCursor();
现在 DBA 团队已更改其中一个存储过程以接受 2 个输出参数(x 和 y),但我不明白如何实现这一点。有人可以帮我吗?
谢谢你
我能够找到信息。希望它对某人有帮助。
$sql = "CALL namespace.my_proc(".$data_source_id.", to_date('".$account_period_start."', 'YYYY-MM-DD'),'".$updated_by."', :x, :y)";
$stmt = $this->getDoctrine()->getManager('fdw')->getConnection()->prepare($sql);
$stmt->bindParam(':x', $x, \PDO::PARAM_INPUT_OUTPUT, 32);
$stmt->bindParam(':y', $y, \PDO::PARAM_INPUT_OUTPUT, 32);
$result = $stmt->execute();
对于最新版本的学说:
$sql = 'call my_proc(:arg1, :arg2)';
$stmt = $em->getConnection()->prepare($sql);
$stmt->executeQuery([
':arg1' => 82,
':arg2' => 'Foo',
]);
但是,对于输出参数,您可以对函数应用相同的逻辑:
$sql = 'BEGIN :total := sum(:num1, :num2); END;';
$stmt = $em->getConnection()->prepare($sql);
$stmt->bindParam(':total', $total);
$stmt->executeQuery([
':num1' => 6,
':num2' => 7
]);
$total
将存储输出
这是工作片段。不需要$sql部分,因为我们使用过程,而不是使用sql语句。
$result = null;
DB::connection('orange')->executeProcedure('OS_USR.OSOPR.p_get_multiplication',
[
'res' => &$result,
'a' => 2,
'b' => 3,
]);
return $result;
请注意,此代码片段使用 yajra/laravel-oci8 与 OCI8 驱动程序的 Oracle 连接。