Вызов процедуры, данные типа RECORD

cyborg

Новичок
Вызов процедуры, данные типа RECORD

Есть процедура в оракле, которая возвращает ответ типа BOOLEAN и плюс заполняет выходную переменную типом

Код:
TYPE TSetup IS RECORD (
  lng_read NUMBER:=null,
  lng_send NUMBER:=null,
  notify_text NUMBER:=null,
  disabled NUMBER:=null
  );
вот рабочий код SQL-скрипта

PHP:
DECLARE 
vResult VARCHAR2(10000);
vSetup SETUP_BP.SetupTyp;
vFound BOOLEAN;
BEGIN
vFound:=SETUP_BP.FOUND_SETUP_NEW(:from_addr,vSetup);
IF vSetup.disabled=1 THEN vResult:='Запрет включен.';
ELSIF vSetup.disabled=2 THEN vResult:='Запрет WEB включен.';
ELSIF vSetup.disabled=3 THEN vResult:='Запрет e-mail включен.';
ELSE vResult:='Запрет отключен.';
END IF;
vResult:=vResult||CHR(13)||CHR(10)||'6040-откл. запрет'||CHR(13)||CHR(10)||'6041-вкл. запрет';
:Result:=vResult;
END;
пытаюсь сделать то же самое на пхп, но что-то делаю не так, ругается ошибкой

Код:
ORA-06550: line 1, column 15: PLS-00306: wrong number or types of arguments in call to 'FOUND_SETUP_NEW' ORA-06550: line 1, column 7: PL/SQL: Statement ignored

begin :res := SETUP_BP.FOUND_SETUP_NEW(:from_addr,:vSetup); end;
              ^

код php-скрипта

PHP:
$from_addr = 'my_addr';
$vSetup = '';
$res = '';

$query = "begin :res := SETUP_BP.FOUND_SETUP_NEW(:from_addr,:vSetup); end;";
$stmt = OCIParse($conn,$query);
OCIBindByName($stmt, ":from_addr", $from_addr);
OCIBindByName($stmt, ":vSetup", $vSetup);
OCIBindByName($stmt, ":res", $res);

$rslt = OCIExecute($stmt,OCI_DEFAULT);
if ($rslt == false){

 $e = ocierror($stmt); // For oci_execute errors pass the statementhandle
 echo htmlentities($e['message']);
 echo "<pre>";
 echo htmlentities($e['sqltext']);
 printf("\n%".($e['offset']+1)."s", "^");
 echo "</pre>";

 exit;
}

var_dump($vSetup);
 

Falc

Новичок
А зачем это делать на ПХП если на pl/sql все работает?
 

cyborg

Новичок
Falc странный вопрос, а зачем писать странички на пхп, если селект работает и в sql plus?

просто нужно сделать еще один интерфейс для управления - на вебе
 

Falc

Новичок
Не вижу взаимосвязи.

Что тебе мешает на ПХП выполнить:

DECLARE
vResult VARCHAR2(10000);
vSetup SETUP_BP.SetupTyp;
vFound BOOLEAN;
BEGIN
vFound:=SETUP_BP.FOUND_SETUP_NEW:)from_addr,vSetup);
IF vSetup.disabled=1 THEN vResult:='Запрет включен.';
ELSIF vSetup.disabled=2 THEN vResult:='Запрет WEB включен.';
ELSIF vSetup.disabled=3 THEN vResult:='Запрет e-mail включен.';
ELSE vResult:='Запрет отключен.';
END IF;
vResult:=vResult||CHR(13)||CHR(10)||'6040-откл. запрет'||CHR(13)||CHR(10)||'6041-вкл. запрет';
:Result:=vResult;
END;

????
 

cyborg

Новичок
Falc
ну вообще так можно все делать тогда )
exec и в путь...

а я вообще хочу получить данные и обработать их
это только начало
дальше мне нужно будет дать возможность менять эти данные
есть другие процедуры в пакете для смены

ну а вообще, вопрос можно рассмотреть как теоретический - как выполнить процедуру и получить данные, которые она вернула?

-~{}~ 06.08.09 12:40:

Да, еще хочу свести в одлну страницу управление всеми параметрами из настройки клиента

TYPE TSetup IS RECORD (
lng_read NUMBER:=null,
lng_send NUMBER:=null,
notify_text NUMBER:=null,
disabled NUMBER:=null
);


в приведенном примере выше обрабатывается пока тока параметр disabled
 

Falc

Новичок
В SQL-е нету типа RECORD, поэтому придется искать другое решение.
 

cyborg

Новичок
Falc
я написал в теме про оракл, а там это есть
ну и работаю я через библиотеку oci
вроде как ничего экзотического? :/

что же не нравится то ораклу...
 

Falc

Новичок
Я тебе про что и говорю, нету в Ораклевом SQL'е типа RECORD.
 

cyborg

Новичок
вот DLL:

CREATE
PACKAGE setup_bp
IS
TYPE SetupTyp IS RECORD (
lng_read NUMBER:=null,
lng_send NUMBER:=null,
notify_text NUMBER:=null,
disabled NUMBER:=null
);

Function FOUND_SETUP_NEW(vNum IN VARCHAR2,vSetup OUT SetupTyp) RETURN BOOLEAN;

END;
/
 

Falc

Новичок
Это pl/sql пакадж в нем есть рекорд.
А вот таой DLL не сработает:

create or replace type testtype is record( f1 number);
/
 

cyborg

Новичок
я не особо силен в оракле, поэтому и спросил вопрос

ты хочешь сказать, что при обращении к оракле из пхп через OCI возможен только чистый SQL? PL/SQL не сработает?
 

Falc

Новичок
Нет, pl/sql работает. Но насколько я понимаю, получить доступ к pl/sql тиам не возможно.
 
Сверху