Russian Qt Forum
Ноябрь 24, 2024, 04:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подскажите новичку пожалуйста как вызвать хранимую функцию  (Прочитано 5993 раз)
havok
Гость
« : Март 16, 2010, 10:00 »

Здравия всем ответившим!
Изучаю Qt + Oracle.
Как вызывать хранимую процедуру понял. Вот так:
Код:
    QSqlQuery query;
    query.prepare("CALL wfp_kl_list.search_watch_kl(?,?)");
    query.bindValue("p_n_search_id",101874,QSql::InOut);
    query.bindValue("p_count", QSql::Out);
    if (!query.exec())
    {
        QMessageBox::information(0, QObject::tr("Error"), "Error_na 1");
        return false;
    }
    waech_kl_n_search_id = query.boundValue("p_n_search_id").toInt();
    watch_kl_cnt = query.boundValue("p_count").toInt();

А вот как вызвать хранимую функцию, что-то не пойму.
Она описана в пакете WFP_DARBA_UZD следующим образомЖ
Код:
function get_my_neizpild_tasks return number
    is
...
Подскажите пожалуйста как мне её вызвать и как получить возвращаемое значение.Улыбающийся
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Март 16, 2010, 10:36 »

в FB можно делать так (как в Oracle не знаю - по идее так же)

select *
from STARAGE_PROC_NAME

или

select *
from STARAGE_PROC_NAME( param1, param2 )
Записан
Troglodit
Гость
« Ответ #2 : Март 16, 2010, 11:30 »

оракл не знаю, но во многих СУБД получить результат можно следующим запросом:

select function_name(param1,...,paramN)
в вашем случае
select wfp_kl_list.search_watch_kl(?,?)
Записан
MoPDoBoPoT
Гость
« Ответ #3 : Март 16, 2010, 14:49 »

Не в тему:
Цитировать
query.prepare("CALL wfp_kl_list.search_watch_kl(?,?)");
Почему используешь позиционное связываение, ведь Oracle поддерживает именованное.

По теме:
А вот как вызвать хранимую функцию, что-то не пойму.
Она описана в пакете WFP_DARBA_UZD
Есть два способа, один из которых зависит от уровня строгости функции в твоем пакете (инфо), а другой универсальный (но, по-моему, он будет чуть медленней).
1-ый способ:
Код
C++ (Qt)
   QSqlQuery query;
   query.prepare("SELECT wfp_darba_uzd.get_my_neizpild_tasks() FROM DUAL");
 
   if (!query.exec()) {
       QMessageBox::information(0, QObject::tr("Error"), query.lastError().databaseText());
       return false;
   }
 
   int paramOut = -1;
   if (query.next())
       paramOut = query.value(0).toInt();
 
Так можно делать, если функция wfp_darba_uzd.get_my_neizpild_tasks() не модифицирует таблицы базы данных.

2-ой способ:
Код
C++ (Qt)
   QSqlQuery query;    
   int paramOut = -1;
   query.prepare(" BEGIN"
                 " :param_out := wfp_darba_uzd.get_my_neizpild_tasks();"
                 " END;");
   query.bindValue(":param_out", -1, QSql::Out);
 
   if (!query.exec()) {
       QMessageBox::information(0, QObject::tr("Error"), query.lastError().databaseText());
       return false;
   }
 
   paramOut = query.boundValue(":param_out").toInt();
 
Записан
havok
Гость
« Ответ #4 : Март 17, 2010, 06:00 »

select wfp_kl_list.search_watch_kl(?,?)
Понятно.

1-ый способ:
Работает!

Почему используешь позиционное связываение, ведь Oracle поддерживает именованное.
Вот этого я не знал...

Большое спасибо ответившим!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 23.