我们有一个函数如果我们通过使用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中调用此函数
注意:我不能在这里粘贴这个函数,因为它很长,但它会分配操作,包括插入和更新!
解决方法:
无论调用语言如何,都无法在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;
?>