вызвать функцию Oracle, которая делает вставку / обновление из PHP? - PullRequest
3 голосов
/ 20 марта 2012

у нас есть функция, если мы вызываем ее с помощью 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

примечание: Я не могу вставить эту функцию здесь, потому что она слишком длинная, но она выполняет множество операций, включая вставку и обновление!

1 Ответ

6 голосов
/ 20 марта 2012

Функция, выполняющая DML, не может быть вызвана в операторе SELECT независимо от языка вызова.

Если вы хотите выполнить 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;

и затем вызов этой хранимой процедуры из PHP

$sql = 'BEGIN proc_return( :p_1, :p_2, :p_ret ); END;';

Если вы не хотите этого делать, я думаю, что вы могли бы сделать что-то подобное (адаптировано из одного из сценариев на стр. 164 Underground PHP и Oracle Manual )

<?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;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...