调用从PHP执行插入/更新的Oracle函数?

时间:2012-03-20 10:31:11

标签: php oracle plsql oracle11g

我们有一个函数,如果我们通过使用SELECT调用它,我们得到错误代码ORA-14551"不能在查询中预先形成DML操作"

select pkg_tools.replace_site(1121,3343) from dual;

如何运行此功能并获得结果

当我们以这种方式在SQL开发人员中运行它时:

declare
v_return VRACHAR2(200);
begin
v_return := pkg_tools.replace_site(1121,3343);
end;

无错误地工作

我们需要在PHP中调用此函数

注意:我不能在此处粘贴此功能,因为它很长,但它会分配操作,包括插入和更新!

1 个答案:

答案 0 :(得分:6)

无论调用语言如何,都无法在SELECT语句中调用执行DML的函数。

如果要执行DML并返回值,则使用OUT参数创建存储过程而不是使用函数会更有意义。

这样会更有意义
CREATE OR REPLACE PROCEDURE proc_name( p_1    IN NUMBER,
                                       p_2    IN NUMBER,
                                       p_ret OUT VARCHAR2 )
AS
BEGIN
  p_ret := pkg_tools.replace.site( p_1, p_2 );
END;

然后call that stored procedure from PHP

$sql = 'BEGIN proc_return( :p_1, :p_2, :p_ret ); END;';

如果你不想这样做,我猜你也可以这样做(改编自Underground PHP and Oracle Manual第164页的一个脚本)

<?php
$c = oci_connect('hr', 'hrpwd', 'localhost/XE');
$s = oci_parse($c, "begin :ret :=pkg_tools.replace_site(1121,3343); end;");
oci_bind_by_name($s, ':ret', $r, 200);
oci_execute($s);
echo "Result is: ".$r;
?>