Как вызвать оракловскую функцию и ее результат записать в переменных ПХП

PalR

Новичок
Как вызвать оракловскую функцию и ее результат записать в переменных ПХП

В составе пакета PAK1 имеется функция FUN1
У неё 5 входных параметров Pin1-Pin5 и 6 выходных Pout1-Pout6.
Про вызов процедур я читал. А как вызывать функции? И результат записать в переменные ПХП?
 

Falc

Новичок
>>А как вызывать функции?

Точно так же как и процедуры:
Код:
begin
:res := PAK1.FUN1( :Pin1,...:Pin6, :Pout1,...:Pout6 );
end;
 

PalR

Новичок
Автор оригинала: Falc
>>А как вызывать функции?

Точно так же как и процедуры:
Код:
begin
:res := PAK1.FUN1( :Pin1,...:Pin6, :Pout1,...:Pout6 );
end;
Прежде чем спросить пробовал вот так:
Код:
$Pin1='pin1';
$Pin2='pin2';
...
$Pin5='pin5';
$sth = OCIParse ( $con,"begin PAK1.FUN1( Pin1,:Pin2,...:Pin5,:Pout1,Pout2,...,:Pout6);end;" );
#связываем входные параметры
OCIBindByName ( $sth, ":Pin1", $Pin1, 10 );
OCIBindByName ( $sth, ":Pin2", $Pin2, 10 );
...
OCIBindByName ( $sth, ":Pin5", $Pin5, 10 );
#связываем ВЫходные параметры
#не уверен что это нужно
OCIBindByName ( $sth, ":Pout1", $Pout1, 20 );
OCIBindByName ( $sth, ":Pout2", $Pout2, 10 );
...
OCIBindByName ( $sth, ":Pout6", $Pout6, 10 );
OCIExecute ( $sth );

echo $Pout1;
...
echo $Pout6;
Получил вот такой ответ:
Код:
Warning: ociexecute() [function.ociexecute]: OCIStmtExecute: ORA-06550: line 1, column 7:
PLS-00221: 'FUN1' is not a procedure or is undefined ORA-06550: line 1, column 7: PL/SQL:
Statement ignored in ...
Про :res := не совсем понятно.
 

tony2001

TeaM PHPClub
>Про :res := не совсем понятно.

Функция возвращает значение.
:res - это placeholder для него.
:= - это операция присваивания.
 

PalR

Новичок
Автор оригинала: tony2001
>Про :res := не совсем понятно.

Функция возвращает значение.
:res - это placeholder для него.
:= - это операция присваивания.
Переделал на вот так:
Код:
$Pin1='pin1';
$Pin2='pin2';
...
$Pin5='pin5';
$sth = OCIParse ( $con,"begin :result :=PAK1.FUN1( Pin1,:Pin2,...:Pin5,:Pout1,Pout2,...,:Pout6);end;" );
#связываем входные параметры
OCIBindByName ( $sth, ":Pin1", $Pin1, 10 );
OCIBindByName ( $sth, ":Pin2", $Pin2, 10 );
...
OCIBindByName ( $sth, ":Pin5", $Pin5, 10 );
#связываем ВЫходные параметры
#не уверен что это нужно
OCIBindByName ( $sth, ":Pout1", $Pout1, 20 );
OCIBindByName ( $sth, ":Pout2", $Pout2, 10 );
...
OCIBindByName ( $sth, ":Pout6", $Pout6, 10 );
OCIBindByName ( $sth, ":result", $result, 10 );

OCIExecute ( $sth );

echo "123";
echo $result;
echo $Pout1;
...
echo $Pout6;
Теперь не ругается. На страничке тольно надпись 123.
Как всё же получить выходные значения в переменные $Pout1-$Pout6 ?????????

-~{}~ 19.07.07 09:14:

Кто нить может вразумительно объяснить? А то всё намёки какие то.
 

Falc

Новичок
Если не ругается значит функция успешно выполнилась, а вот почему она вернула пустые значения, тебе виднее.

Вообще для начала я бы начал экспирементировать на функции без параметров, что нибудь в роде:
Код:
Declare
  Function test Return Number Is
  Begin
    Return 123;
  End;
Begin
  :res := test();
End;
 

PalR

Новичок
Это я уже проделал. В :res кладёт возвращаемое функцией значение, только обязательно надо указывать размер.
А в рабочей функции возвращает пустое значение. Таже функция в паскале-дельфи и с теми же входными параметрами возвращает то что нужно. Может регистр символов как то неправильно передаваться? У меня это имеет значение на возвращаемый результат.
 

Falc

Новичок
PalR
Посмотри внимательно свой код, видимо ты где-то что-то напутал, например не в том порядки передал входящие переменные, или под разными пользователями выполняешь функцию, а ее результат зависит от пользователя, который ее выполняет.
 

PalR

Новичок
Всем спасибо. Разобрался. Ошибка была в передаваемых данных.
 
Сверху