AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.09.2003, 16:51   #1  
bocman is offline
bocman
Участник
 
7 / 10 (1) +
Регистрация: 15.08.2003
Как вызвать хранимую процедуру (функцию) Oracle и вернуть значение
Подскажите начинающему

Как осуществить сабж.

Заранее благодарен.
Старый 02.09.2003, 12:43   #2  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Вот так это можно сделать в MS SQL:

http://www.axforum.info/forums/showt...E5%E4%F3%F0%E0

В Oracle принцип тот же, только вместо:

PHP код:
sqlS 'execute AxTest.bmssa.test'
надо

PHP код:
CALL <NameOfProcedure(<parameters>); 
Насчет возврата значений - это сложнее. Я бы наверное завел бы в Oracle специальную табличку и в нее бы записывал значения, которые необходимо возвращать, причем из самой ХП. А потом в Аксапте бы их считывал.
Но я не специалист по Oracle - может кто-то подскажет лучший путь.
Старый 02.09.2003, 15:38   #3  
bocman is offline
bocman
Участник
 
7 / 10 (1) +
Регистрация: 15.08.2003
Прошу прощение за не понятливость,
но не могли бы Вы по подробнее объяснить про
оператор (или это функция, или класс) CALL
Старый 02.09.2003, 17:13   #4  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
По ссылке, которую я привел есть кусок кода, в котором вызывается хранимая процедура на MS SQL. Осуществляется это посылкой вот такого запроса:
PHP код:
sqlS 'execute AxTest.bmssa.test'
на сервер.
У Вас не MS SQL, у Вас Oracle и этот запрос будет выглядеть по другому, а именно так, как я написал.

Цитата:
оператор (или это функция, или класс) CALL
Цитата:
Use the CALL statement to execute a routine (a standalone procedure or function, or a procedure or function defined within a type or package) from within SQL.
--- Стандартная документация по Oracle. Oracle 9i SQL Reference. стр. 12-68.

То есть у Вас будет нечто типа:
PHP код:
sqlS 'call MyProc();'
Старый 02.09.2003, 17:58   #5  
bocman is offline
bocman
Участник
 
7 / 10 (1) +
Регистрация: 15.08.2003
Извиняюсь за настойчивость

при выполнении следующего кода:
PHP код:
void clicked()
{
Connection  connection;
    
Statement   stmt;
    
ResultSet   resultSet;
    
str         sqlS;
    ;

    
connection = new Connection();
    
stmt connection.createStatement();

    
sqlS 'call axuser.bocTest01(5);';

    
resultSet stmt.executeQuery(sqlS);
    while (
resultSet.next())
    {
        
info (resultSet.getString(1));
    }
    
super();

Получаю следующее сообщение:

Error Сообщение (17:47:22) Невозможно выбрать запись в '' ('')
База данных SQL обнаружила ошибку.
Info Сообщение (17:47:22) Описание ошибки SQL: ORA-24333: zero iteration сount

Info Сообщение (17:47:22) Оператор SQL: call axuser.bocTest01(5);




Что я делаю не так?

Заранее благодарен
Старый 03.09.2003, 05:48   #6  
DSV is offline
DSV
Участник
 
129 / 10 (1) +
Регистрация: 12.06.2003
Адрес: Novocybers
Старая и страшная тема.
Ну нет в оракле селективных процедур, НЕТУ!!!

Можно изворачиваться по способу Андре - складывать результат процедуры во вполне обычную табличку, не забывая привинчивать имя пользователя к каждой строчке. Чтоб каши не было.
Но это метод для ленивых.

А для ОЧЕНЬ-ОЧЕНЬ ленивых есть более прикольный метод.

На оракле выше 8.0 (нужно, чтоб возможность с объектами работать была)
1) создаем объектный тип данных навроде строки.
2) создаем таблица из этих строк.
3) делаем функцию, возвращающей значение типа нашей объектной таблицы. В теле функции наполняем выходной набор записей и
4) вызов функции выглядит как select * from the (select * from <имя функции>)

НО. У данного способа кроме плюсов:
1) не болит голова с изоляцией пользователей и избавлением от результатов предыдущего запуска;
2) работает даже из-под Access-а.

есть и минусы:

1) сложно отлаживать - все приходится делать вслепую.
2) (субъективное) 8.1.6 вел себя гораздо капризней, нежели в случае обычной процедуры PL/SQL - например, NULL вместо ожидаемого значения валил все выполнение.

===================================
А вот по поводу примера - занимался сим извращением последний раз пол-года назад, примеров под рукой нет, но в свое время взял идею с форумов ораклоидов.
Старый 03.09.2003, 11:00   #7  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Получаю следующее сообщение:

Error Сообщение (17:47:22) Невозможно выбрать запись в '' ('')
База данных SQL обнаружила ошибку.
Info Сообщение (17:47:22) Описание ошибки SQL: ORA-24333: zero iteration сount
Info Сообщение (17:47:22) Оператор SQL: call axuser.bocTest01(5);
Что я делаю не так?
Все очень просто - DSV сказал очень важную фразу:

PHP код:
Ну нет в оракле селективных процедурНЕТУ!!! 
Посему, вот это выражение тоже не имеет смысла:

PHP код:
resultSet stmt.executeQuery(sqlS); 
Ну ничего Вам оттуда не вернется !!! А делать надо так:

PHP код:
  stmt.executeUpdate(sqlS); 
Честно говоря самому стало интересно - вот пошаговый tutorial:

Создаем табличку в БД:
PHP код:
create table Test (
id int); 
Пишем процедуру:
PHP код:
create or replace procedure TestProcedure(p_id int)
as
begin
  insert into Test
(idvalues(p_id);
  
commit;
end
Пробуем:
PHP код:
call TestProcedure(3); 
Проверяем:
PHP код:
select from Test
- Все работает.

Теперь подключаем к этому делу Аксапту:
PHP код:
static void OracleSP(Args _args)
{
    
Connection  connection;
    
Statement   stmt;
    
str         sqlS;
    ;

    
connection = new Connection();
    
stmt connection.createStatement();

    
sqlS 'call TestProcedure(5)';

    
stmt.executeUpdate(sqlS);
}

   
Запускаем.  Лезем в табличку Test и видимчто там появилась 5-качто свидетельствует о томчто процедура была вызвана
Старый 03.09.2003, 11:22   #8  
bocman is offline
bocman
Участник
 
7 / 10 (1) +
Регистрация: 15.08.2003
Да, действительно все получилось

Огромное спасибо за помощь
Старый 17.09.2003, 16:00   #9  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
PHP код:
Старая и страшная тема.
Ну нет в оракле селективных процедурНЕТУ!!! 
А если вот так:

PHP код:
create or replace package test_cursor_package is

  type t_empcursor is ref cursor 
return all_users%rowtype;

  
procedure getcursor(p_empcursor in out t_empcursor);
end;

create or replace package body test_cursor_package is
  procedure getcursor
(p_empcursor in out t_empcursoris
  begin
    open p_empcursor 
for select from all_users order by username;
  
end;
end
Старый 29.09.2003, 18:21   #10  
Oracle is offline
Oracle
Участник
 
4 / 10 (1) +
Регистрация: 29.09.2003
Адрес: Москва
Вроде в тему...
А курсор(DataSet) из процедуры получить можно?
Старый 29.09.2003, 18:22   #11  
Oracle is offline
Oracle
Участник
 
4 / 10 (1) +
Регистрация: 29.09.2003
Адрес: Москва
Все, нашел...
Старый 20.08.2004, 10:28   #12  
Антон Солдатов is offline
Антон Солдатов
Соучастник
Аватар для Антон Солдатов
 
386 / 27 (1) +++
Регистрация: 29.12.2002
Адрес: Новосибирск
а как курсор вытащили в x++. расскажите?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как с вэб страницы вызвать функцию из аксапты? Dronas DAX: Программирование 16 28.02.2005 18:23
Вернуть значение поля Azat DAX: Программирование 2 10.01.2005 14:50
Как вызвать через ADO хранимую процедуру с параметрами ? LSA DAX: Программирование 16 23.12.2004 18:17
COM Connector - как вызвать функцию? z_av DAX: Программирование 10 26.11.2003 20:45
Можно ли из Аксапты вызвать хранимую процедуру на SQL Server Yuri Safronov DAX: Программирование 8 02.09.2002 14:25

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:27.