powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / как из php вызвать хранимую функцию oracle?
6 сообщений из 6, страница 1 из 1
как из php вызвать хранимую функцию oracle?
    #35120543
школьник я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как из php вызвать хранимую функцию oracle? (не процедуру, а именно функцию)
функция объявлена так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
PACKAGE BODY TEST
IS
FUNCTION test_f (a_ IN VARCHAR2)
      RETURN NUMBER
IS
      cnt   NUMBER ( 3 );
BEGIN
      SELECT COUNT (*) INTO cnt FROM test_t
      WHERE test_t.a = a_;
      
      IF cnt <>  0 
      THEN
         RETURN  1 ;
      ELSE
         RETURN  0 ;
      END IF;
END;
END;

буду признателен за приведенный Вами код
...
Рейтинг: 0 / 0
как из php вызвать хранимую функцию oracle?
    #35123138
школьник якак из php вызвать хранимую функцию oracle? (не процедуру, а именно функцию)
функция объявлена так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
PACKAGE BODY TEST
IS
FUNCTION test_f (a_ IN VARCHAR2)
      RETURN NUMBER
IS
      cnt   NUMBER ( 3 );
BEGIN
      SELECT COUNT (*) INTO cnt FROM test_t
      WHERE test_t.a = a_;
      
      IF cnt <>  0 
      THEN
         RETURN  1 ;
      ELSE
         RETURN  0 ;
      END IF;
END;
END;

буду признателен за приведенный Вами код
В Oracle функция может быть использована либо в выражениях PL/SQL, либо в Select'ах.
В данном случае, скорее всего, лучше использовать SELECT.
Выражение, которое надо передать на исполнение, примет вид:
Код: plaintext
1.
select Body_test.Test_f(:text) Func_Res from dual

Таким образом, приходим к следующему фрагменту программы на РНР:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?php
$conn=OCILogon($user,$password);
if($conn)
 {
  $qry=OCIParse($conn,"select Body_test.Test_f(:text) Func_Res from dual");
  ocibindbyname($qry,":text",$PARAM, 65 );
  OCIExecute($qry);
  while (OCIFetchInto ($qry, $row, OCI_ASSOC)) 
   {
    echo $row['Func_Res'];
   }
   OCIFreeStatement($qry);
 }
?>
...
Рейтинг: 0 / 0
как из php вызвать хранимую функцию oracle?
    #35123451
школьник я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, все получилось
только я сделал вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...
OCIExecute($qry, OCI_DEFAULT);
  while (OCIFetch($qry)) 
   {
    res = OCIResult($gry, "FUNC_RES");
    echo $res;
   }
...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
как из php вызвать хранимую функцию oracle?
    #37889367
Larush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.
Столкнулся и я с проблемой взаимодействия с Ораклом
Собственно PL/SQL
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
FUNCTION user_authenticate(
    p_login    IN wfm_user.login%type,
    p_password IN wfm_user.password%type)
  RETURN wfm_user.user_id%type
IS
  v_user_id wfm_user.user_id%type;
  v_password wfm_user.password%type;
  c_sysdate CONSTANT DATE := sysdate;
BEGIN
  v_password := hash_password(upper(p_login), p_password);
  SELECT user_id
  INTO v_user_id
  FROM wfm_user inner join wfm_employee on wfm_user.employee_id = wfm_employee.employee_id
  WHERE login    = upper(p_login)
  AND password   = v_password
  AND is_blocked = 0 and wfm_employee.dismiss_date is null;
  UPDATE wfm_user SET last_entry = c_sysdate WHERE user_id = v_user_id;
  RETURN v_user_id;
EXCEPTION
WHEN no_data_found THEN
  raise_application_error(-20107, 'The user name or password are incorrect');
  RETURN NULL;
END;




Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
        $them ="(DESCRIPTION =
            (ADDRESS_LIST =
                (ADDRESS =
                  (PROTOCOL = TCP)
                  (HOST = некий ip.address)
                  (PORT = 1521)
                )
            )
            (CONNECT_DATA =
              (SID = them)
            )
          )";
        $conn = oci_connect("wfm_draft", login,$them);

        if(!$conn){
          echo("<li>not connect");
          $err = var_dump(OCIError());
        }
        else{
        echo "<li>Успешное соединение";
        $log ='andrey';
        $pas = '123';
        $qry=OCIParse($conn,"select WFM_RELEASE.pk_user.user_authenticate(:login, :pass) Func_res from dual");
        OCIBindByName($qry, ":login", $log); 
[53]        OCIBindByName($qry, ":pass", $pas); 
[54]        OCIExecute($qry,OCI_DEFAULT);




Вот на последнюю строку и ругается
*Успешное соединение
Warning: ociexecute(): ORA-00904: "THEM_RELEASE"."PK_USER"."USER_AUTHENTICATE": invalid identifier in /www/addons/admin/test_oracle.php on line 54

Дел в том что на другую (рабочую) схему идет соединение но там в функции воткнут UPDATE и ругается уже на то что низзя так делать.
Warning: ociexecute(): ORA-14551: cannot perform a DML operation inside a query

Я хотел в тестовой БД потренироваться с функциями, чтобы затем создать копию имеющейся без Update. Для начала хочу получить тот-же ответ, но ошибка другая (парой строк выше). Вот и хочу понять.

У меня собственно несколько вопросов:
1. Было-бы отлично понять что и откуда тут растет, поэтому приму с благодраностью как разжевывание процесса, так и ссылку на разжеванный процесс а не на мануал :-)
2. Как еще можно вызвать функцию ? Тут было упоминание про PL/SQL, функции как раз на нем написаны, если можно то привести сразу пример.

Спасибо.
...
Рейтинг: 0 / 0
как из php вызвать хранимую функцию oracle?
    #37889388
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор "THEM_RELEASE"."PK_USER"."USER_AUTHENTICATE": invalid identifier
ну нет такого. что ты от Оракла хочешь?
...
Рейтинг: 0 / 0
как из php вызвать хранимую функцию oracle?
    #37889435
Larush
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кому пригодится, НО ЗАРАБОТАЛО !!! если помните выше было сказано что исполнение внутренних функций с DML операторами не дается, так тут обошли это через запуск "процедурного" способа вызова :-)

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
$log ='andrey';
$pas = '****';
$result= "              "; //возвращается число (ID пользователя), но если тут поставить пустую строку или пару пробелов или 0... нифига не выйдет. Бубен шамана.
$qry=OCIParse($conn,"begin :r :=WFM_DRAFT.pk_user.user_authenticate(:login, :pass); end;");
if (!$qry) {
    $m = oci_error($conn);
    trigger_error('Could not parse statement: '. $m['message'], E_USER_ERROR);
}

oci_bind_by_name($qry, ':r', $result);
OCIBindByName($qry, ':login', $log); 
OCIBindByName($qry, ':pass', $pas); 

$r = OCIExecute($qry);
print_r($result);
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / как из php вызвать хранимую функцию oracle?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]