Помощь - Поиск - Пользователи - Календарь
Полная версия: Процедура, возвращающая набор значений
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
18192123
В базе (на IBExpert) есть хранимая процедура:
Код

ALTER PROCEDURE MED_ACT_AND_SPEC (
    code_act integer)
returns (
    code_spec integer)
as
begin
for
    select "MED_ACT_and_SPEC".code_spec
    from "MED_ACT_and_SPEC"
    where "MED_ACT_and_SPEC".code_act=:code_act
    into :code_spec
do
  suspend;
end

которая возвращает набор из числовых значений..
В Builder по нажатию кнопки вот такой обработчик:

IBStPrMedActSp->ParamByName("CODE_ACT")->AsInteger=codeact;
IBStPrMedActSp->ExecProc();
int i=IBStPrMedActSp->ParamByName("CODE_SPEC")->AsInteger; //здесь хочу добраться до выходных //параметров функции...но так, как есть - я получаю только первое значение...
//а как получить всё, что возвращает процедура, объясните пожалуйста...!


volvo
Обычно (по крайней мере при использовании TADOStoredProc это работает), если хранимая процедура возвращает не одно значение, а набор данных, то для получения всего набора можно вместо ExecProc() сделать:

	sp->Open();
for(sp->First(); !sp->Eof ; sp->Next()) {
int i = sp->Parameters->ParamByName("CODE_SPEC")->Value;
}

18192123
Цитата(volvo @ 21.12.2008 22:52) *

Обычно (по крайней мере при использовании TADOStoredProc это работает), если хранимая процедура возвращает не одно значение, а набор данных, то для получения всего набора можно вместо ExecProc() сделать:

	sp->Open();
for(sp->First(); !sp->Eof ; sp->Next()) {
int i = sp->Parameters->ParamByName("CODE_SPEC")->Value;
}



у меня IBStoredProc..
и программа требует "use ExecProc for Procedure"...
однако если добавить ExecProc, то ситуация не меняется...
volvo
Цитата
Вызов ExecProc предназначен для хранимых процедур, которые не возвращают набор данных. Для процедур, возвращающих набор данных используется метод Open, либо Active:=true.

Итого, что имеем: у тебя есть хранимая процедура, тебе надо из нее вернуть таблицу (ну, не вожно, несколько данных), так? Значит, делаешь следующее: На форму добавляешь TIBQuery, в ней - вызываешь хранимую процедуру, запустить Query можно так, как я показал, через Open, и прочитать результаты через First/Next... (это все чисто теоретически, у меня нет установленного IBase, поэтому проверить не могу).

В IBQuery.SQL - что-то типа
SQL
SELECT * FROM MED_ACT_AND_SPEC(:CODE_ACT)
, опиши параметр CODE_ACT у IBQuery, и присвой ему значение аналогично тому, как ты делала это для IBStoredProc ...
18192123
Пусть свой набор значений я получила...Записала его в массив..
И хочу из этого набора выбрать число, и выбор этот должен осуществляться случайным образом (но из имеющегося набора!)..Скажите пожалуйста, можно такое осуществить?
volvo
Лучше записывать результаты в vector, тогда твоя задача сведется к тому, чтобы сгенерировать случайное число в интервале от 0 до количества элементов в векторе:

	std::srand(std::time(0));
std::vector<int> myVector;

// ... Заполнение вектора данными ...

int value = myVector[ rand() % myVector.size() ];

Гость
Цитата(volvo @ 25.12.2008 9:52) *

Лучше записывать результаты в vector, тогда твоя задача сведется к тому, чтобы сгенерировать случайное число в интервале от 0 до количества элементов в векторе:

	std::srand(std::time(0));
std::vector<int> myVector;

// ... Заполнение вектора данными ...

int value = myVector[ rand() % myVector.size() ];



а если результаты, которые нужно будет записывать в vector, не являются непрерывным набором...
т.е например, такой набор - 1,3,18,19...ноль вообще никогда не появится в моём наборе...
Тогда использование vector мне поможет?
18192123
Цитата(Гость @ 25.12.2008 17:07) *

а если результаты, которые нужно будет записывать в vector, не являются непрерывным набором...
т.е например, такой набор - 1,3,18,19...ноль вообще никогда не появится в моём наборе...
Тогда использование vector мне поможет?

volvo
А какая разница, что у тебя хранится в векторе, непрерывны ли данные или нет? Ты записала допустимые значения в вектор? Записала. Любое значение из записанных в векторе может быть выбрано? Вот и выбираешь: получаешь случайный индекс элемента, хранящего информацию...

Цитата
ноль вообще никогда не появится в моём наборе
Зато вектор всегда начинается с нулевого элемента smile.gif
18192123
Цитата(volvo @ 25.12.2008 9:52) *

Лучше записывать результаты в vector, тогда твоя задача сведется к тому, чтобы сгенерировать случайное число в интервале от 0 до количества элементов в векторе:

	std::srand(std::time(0));
std::vector<int> myVector;

// ... Заполнение вектора данными ...



Не поняла, как этот вектор заполнять...
Вот массив y будет содержать те значения, которые мне нужны для последующего выбора..

IBQuery2->Open();
int y[100];
int j=0;
for(IBQuery2->First(); !IBQuery2->Eof ; IBQuery2->Next()) {
y[j] = IBQuery2->Fields->FieldByName("CODE_SPEC")->AsInteger;
j++;
}


Объясните пожалуйста, КАК именно в этот вектор записать?
И ещё, Builder ругается на строки

std::srand(std::time(0));
std::vector<int> myVector;

volvo
Цитата
Builder ругается на строки

#include <vector> 

присутствует? (это по поводу второй строки, насчет первой - вообще непонятно, srand описан в stdlib.h, он подключается в любом случае к проекту. Попробуй убрать std:smile.gif

Цитата
Не поняла, как этот вектор заполнять...
Еще проще, чем массив:
IBQuery2->Open();
for(IBQuery2->First(); !IBQuery2->Eof ; IBQuery2->Next()) {
myVector.push_back(IBQuery2->Fields->FieldByName("CODE_SPEC")->AsInteger);
}
18192123
А нужно ли очищать этот вектор, а то у меня в нём всё время остаётся одни и тот же набор...а так быть не должно..
volvo
Цитата
А нужно ли очищать этот вектор
Если тебе больше не нужны значения, хранящиеся в векторе - вызывай
myVector.clear(); // это удалит из вектора все элементы, и сделает его длину = 0

, потом можешь начинать заполнять заново...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.