Een functie die DML doet, kan niet worden aangeroepen in een SELECT
verklaring ongeacht de taal van de oproep.
Als je DML wilt doen en een waarde wilt retourneren, is het veel logischer om een opgeslagen procedure te maken met een OUT
parameter in plaats van een functie te gebruiken. Het zou dus veel logischer zijn om
CREATE OR REPLACE PROCEDURE proc_name_return( 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;
en dan roep die opgeslagen procedure op vanuit PHP
$sql = 'BEGIN proc_name_return( :p_1, :p_2, :p_ret ); END;';
Als je dat niet wilt, denk ik dat je ook zoiets zou kunnen doen (aangepast van een van de scripts op pagina 164 van de Ondergrondse PHP- en Oracle-handleiding )
<?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;
?>