2012-03-20 34 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