2012-03-20 35 views
3

我们有一个功能,如果我们用SELECT我们获得错误代码ORA-14551“无法大跳查询内部的DML操作”称之为调用一个从PHP执行插入/更新的Oracle函数?

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

你是如何从PHP连接到Oracle的一个? (OCI8?)。请参阅那些在Oracle中调用存储过程的文档。快速谷歌搜查给了我:http://www.oracle.com/technetwork/articles/fuecks-sps-095636.html – tbone 2012-03-20 10:50:54

+0

是的,我们有它,它适用于简单的查询 – 2012-03-20 15:43:28

回答

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; 
?> 
+0

我们现在正在测试它:-) – 2012-03-20 11:23:11

+0

完美的作品对我们来说,我们修改了一下;-) – 2012-03-20 15:43:57