Uma função que faz DML não pode ser chamada em um
SELECT
instrução independentemente da linguagem de chamada. Se você quiser fazer DML e retornar um valor, faria muito mais sentido criar um procedimento armazenado com um
OUT
parâmetro em vez de usar uma função. Então faria muito mais sentido 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;
e então chamar esse procedimento armazenado do PHP
$sql = 'BEGIN proc_name_return( :p_1, :p_2, :p_ret ); END;';
Se você não quiser fazer isso, meu palpite é que você poderia fazer algo assim também (adaptado de um dos scripts na página 164 do Manual PHP e Oracle Subterrâneo )
<?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;
?>