我们有一个函数,如果我们通过使用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中调用此函数
注意:我不能在此处粘贴此功能,因为它很长,但它会分配操作,包括插入和更新!
答案 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;
?>