Russian Qt Forum

Qt => Базы данных => Тема начата: havok от Март 16, 2010, 10:00



Название: Подскажите новичку пожалуйста как вызвать хранимую функцию
Отправлено: 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
...
Подскажите пожалуйста как мне её вызвать и как получить возвращаемое значение.:)


Название: Re: Подскажите новичку пожалуйста как вызвать хранимую функцию
Отправлено: break от Март 16, 2010, 10:36
в FB можно делать так (как в Oracle не знаю - по идее так же)

select *
from STARAGE_PROC_NAME

или

select *
from STARAGE_PROC_NAME( param1, param2 )


Название: Re: Подскажите новичку пожалуйста как вызвать хранимую функцию
Отправлено: Troglodit от Март 16, 2010, 11:30
оракл не знаю, но во многих СУБД получить результат можно следующим запросом:

select function_name(param1,...,paramN)
в вашем случае
select wfp_kl_list.search_watch_kl(?,?)


Название: Re: Подскажите новичку пожалуйста как вызвать хранимую функцию
Отправлено: MoPDoBoPoT от Март 16, 2010, 14:49
Не в тему:
Цитировать
query.prepare("CALL wfp_kl_list.search_watch_kl(?,?)");
Почему используешь позиционное связываение, ведь Oracle поддерживает именованное.

По теме:
А вот как вызвать хранимую функцию, что-то не пойму.
Она описана в пакете WFP_DARBA_UZD
Есть два способа, один из которых зависит от уровня строгости функции в твоем пакете (инфо (http://www.firststeps.ru/sql/oracle/r.php?100)), а другой универсальный (но, по-моему, он будет чуть медленней).
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();
 


Название: Re: Подскажите новичку пожалуйста как вызвать хранимую функцию
Отправлено: havok от Март 17, 2010, 06:00
select wfp_kl_list.search_watch_kl(?,?)
Понятно.

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

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

Большое спасибо ответившим!!!