Название: Как работать с хранимой процедурой, которая возвращает таблицу? НЕ решено! Отправлено: havok от Март 17, 2010, 08:16 Есть на сервере хранима процедура. Описана так:
Код: procedure slc_list(p_tr IN OUT T_list, p_n_search_id in integer) Мне нужно вызвать эту процедуру, и результат в TableView записать. Подскажите пожалуйста, недавно начавшему изучать Qt + базы. :) Если использовать: Код: QSqlQuery query; Название: Re: Как вызвать хранимую процеду, которая возвращает таблицу и записать в TableView? Отправлено: BRE от Март 17, 2010, 09:08 получаю ошибку "segmentation fault" ;( А кто будет объект модели создавать?Название: Re: Как вызвать хранимую процеду, которая возвращает таблицу и записать в TableView? Отправлено: havok от Март 17, 2010, 09:19 получаю ошибку "segmentation fault" ;( А кто будет объект модели создавать?Упс! Ну да. Это я добавил. Однако Код: query.prepare("CALL wfp_kl_list.slc_kl_list(?,?)"); Не работает. Модель пуста... Надо ведь по-ходу связать model и возвращаемую процедурой таблицу? Потому что модель у меня не "Select ...", а "Call ...". Было бы Select, тут просто - так как я написал + tableView->setModel(model); А как к модели привязать QSql::InOut? Или вообще не обязательно к модели? Может можно сразу к TableView?:) В инете по этому поводу инфу не нашёл... Название: Re: Как вызвать хранимую процеду, которая возвращает таблицу и записать в TableView? Отправлено: Kolobok от Март 17, 2010, 11:58 Код: query.prepare("CALL wfp_kl_list.slc_kl_list(?,?)"); ? != "p_tr" Если в prepare ?, то пользуйся Код: void QSqlQuery::bindValue ( int pos, const QVariant & val, QSql::ParamType paramType = QSql::In ) И в первом bindValue значение забыл Название: Re: Как вызвать хранимую процеду, которая возвращает таблицу и записать в TableView? Отправлено: havok от Март 17, 2010, 12:14 И в первом bindValue значение забыл А какое (как) там прописать значение??? Там же Sql-ый тип Table у него в процедуре!Название: Re: Как вызвать хранимую процеду, которая возвращает таблицу и записать в TableView? Отправлено: Kolobok от Март 17, 2010, 14:41 И в первом bindValue значение забыл А какое (как) там прописать значение??? Там же Sql-ый тип Table у него в процедуре!У тебя подставляется QSql::InOut, а это точно неправильно. Название: Как работать с хранимой процедурой, которая возвращает таблицу? НЕ решено! Отправлено: havok от Март 18, 2010, 06:11 У тебя подставляется QSql::InOut, а это точно неправильно. Так а у меня процедура описана как: Код: procedure slc_list(p_tr IN OUT T_list, p_n_search_id in integer) Название: Re: Как работать с хранимой процедурой, которая возвращает таблицу? НЕ решено! Отправлено: Prm от Март 22, 2010, 13:44 С ораклом не работал, но в MySQL работает следующее:
/*таблица с данными*/ CREATE TABLE IF NOT EXISTS `list_data` ( `ID` int(10) unsigned NOT NULL auto_increment, `ID_LIST` int(10) unsigned NOT NULL, `DATA_VALUE` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `Index_2` (`ID_LIST`,`DATA_VALUE`), CONSTRAINT `FK_LIST_DATA_1` FOREIGN KEY (`ID_LIST`) REFERENCES `list_config` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET='UTF8' COMMENT='Таблица данных для справочников'; /*хранимая процедура в базе данных*/ CREATE PROCEDURE `GET_LIST_DATA`(IN VIN_ID_LIST INT) BEGIN SELECT * FROM list_data WHERE ID_LIST=VIN_ID_LIST ORDER BY DATA_VALUE; END;; //код для получения данных QSqlQuery query(some_database); query.exec("CALL GET_LIST_DATA('5');"); В результате выполнения запроса query будет содержать набор данных ID, ID_LIST, DATA_VALUE Версия QT 4.4.3. Название: Re: Как работать с хранимой процедурой, которая возвращает таблицу? НЕ решено! Отправлено: break от Март 22, 2010, 14:40 в FB будет работать так
query.exec("select * from GET_LIST_DATA('5');"); то есть процедура подставляется вместо таблицы - также можно передавать параметры и использовать where и т.д. Название: Re: Как работать с хранимой процедурой, которая возвращает таблицу? НЕ решено! Отправлено: havok от Март 23, 2010, 06:21 в FB будет работать так query.exec("select * from GET_LIST_DATA('5');"); то есть процедура подставляется вместо таблицы - также можно передавать параметры и использовать where и т.д. Это не то. Это я знаю, но у меня другой случай. У меня процедура не "SELECT..." Она описана так: Код: procedure slc_kl_list(p_tr IN OUT T_kl_list,p_n_search_id in integer) Мне надо как-то её вызвать и получить таблицу T_kl_list, и её в TableView записать... Название: Re: Как работать с хранимой процедурой, которая возвращает таблицу? НЕ решено! Отправлено: Troglodit от Март 24, 2010, 11:59 это проблема не qt, а СУБД. Нужно написать sql-скрипт который будет возвращать нд из этой переменной.
как вариант (версия для mssql) declare @p_tr T_kl_list exec slc_kl_list(@p_tr,?) select @p_tr Нужно смотеть реализацию для оракла, от qt здесь ничего не зависит. Название: Re: Как работать с хранимой процедурой, которая возвращает таблицу? НЕ решено! Отправлено: dio от Март 30, 2010, 13:10 Оберните вашу процедуру в функцию. Например вот так:
Код: create or replace function get_slc_kl_list(p_n_search_id in integer) RETURN T_kl_list Код: select * from table(get_slc_kl_list(:p_n_search_id)); |