powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Проблема вызова OVERLOAD процедур Oracle
4 сообщений из 4, страница 1 из 1
Проблема вызова OVERLOAD процедур Oracle
    #37780498
Заятс
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В пакете Oracle есть две процедуры с одинаковым именем и одинаковым количеством параметров (но набор параметров по типам разный). При вызове из PHP Oracle возвращает ошибку ORA-06550: line 1, column 7: PLS-00307: too many declarations of 'proc_name' match this call. Я точно знаю, что это не ошибка ORACLE, при вызове из кода ORACLE всё отрабатывает хорошо. Это неустранимая проблема PHP или где-то что-то надо настроить ?
...
Рейтинг: 0 / 0
Проблема вызова OVERLOAD процедур Oracle
    #37780548
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вы абсолютно уверены, что из самого Oracle вызов проходит корректно - то оформите вызов процедуры ввиде анонимного блока и вызывайте уже его из PHP

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$text_to_call  =  "
DECLARE  
   l_var1   number;
   l_var2   varchar2(1000);
BEGIN
   l_var1  :=   :bind_var1;   --  тут бинды параметров из PHP
   l_var2  :=   :bind_var2;   --  тут бинды параметров из PHP

   :result:=  MY_PRETTY_PROCEDURE(l_var1,  l_var2);

END;
";

// Собсна тут делаете  prepare,  bind  и  execute  для вышеприведённого текста
...
Рейтинг: 0 / 0
Проблема вызова OVERLOAD процедур Oracle
    #37780567
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA-06550 никак не може тбыть неустранимой ошибкой php
...
Рейтинг: 0 / 0
Проблема вызова OVERLOAD процедур Oracle
    #37780607
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да это явно проблема самого оракла.

Просто когда топикстартер вызывает процедуру "из Оракла" он на 90% передаёт в качестве параметров уже объявленные переменные, то есть тип переменных, переданных в параметры известен PL/SQL компилятору (как в вышеприведённом мноё примере).

А когда он биндит параметры из PHP - то у него начинает работать неявное преобразование типов. Скорее всего топикстартер толкает из PHP что-то типа

Код: php
1.
$text_to_call = "call   MY_PACKAGE.MY_PRETTY_PROCEDURE( :param1 , :param2,  :param3 ); ";


В данном случае Oracle неоткуда взять информацию о типах переменных, котоыре пришли на вход. Срабатывает автоматическое приведение типов и в результате иммем ORA-06550.


Поэтому, как вариант, можно еще посоветовать прямо в процессе парсинга делать явное приведение типов:

Код: php
1.
2.
3.
$text_to_call = "call   MY_PACKAGE.MY_PRETTY_PROCEDURE( TO_NUMBER(:param1) , TO_CHAR(:param2),  TO_DATE(:param3) ); ";

// далее соответственно  oci_parse()  ,  oci_bind()  и  oci_execute();



тогда по идее Оракл должен подхватить правильный вариант перегруженной процедуры.

Но вариант с анонимным блоком работает железобетонно. Т.к. весь вызов целиком обрабатывается на стороне Oracle и драйвер OCI вообще не при делах становится.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Проблема вызова OVERLOAD процедур Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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