Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: sql api. как получить таблицу из хранимой процедуры  (Прочитано 16795 раз)
0 Пользователей и 1 Гость смотрят эту тему.
remedius
Гость
« : 12-12-2006 20:33 » 

Подскажите пожалуйста, как можно осуществить следующее:
Код:
SACommand pCmd(pCon, "Select * from sys_objects");

pCmd.Execute();
int i=0;
while(pCmd.FetchNext())
{
printf("\nValue: %i",  (int)pCmd.Field(i+1).asLong());
...
}
в случае, если "Select * from sys_objects" зашит уже в хранимую процедуру.

Вот так:
Код:
	SACommand pCmd(pCon, "EXEC :1 = sp_get_objects",SA_CmdSQLStmt);
pCmd.Param(1).setParamType(SA_dtCursor);
pCmd.Param(1).setParamDirType(SA_ParamReturn);

pCmd.Execute();
не работает. Возможно, не правильно установлен тип возвращаемого значения. (Но другого подходящего я не нашла.
Все типы:
Код:
# SA_dtBool    Sets parameter's value as bool data.
# SA_dtShort    Sets parameter's value as short data.
# SA_dtLong    Sets parameter's value as long data.
# SA_dtFloat    Sets parameter's value as float data.
# SA_dtDouble    Sets parameter's value as double data.
# SA_dtNumeric    Data type is SANumeric (used internally).
# SA_dtDateTime    Sets parameter's value as standard C++ datetime structure (struct tm).
# SA_dtString    Sets parameter's value as string data (SAString).
# SA_dtLongBinary    Sets parameter's value as long binary data (SAString).
# SA_dtLongChar    Sets parameter's value as long character data (SAString).
# SA_dtBLob    Sets parameter's value as BLob data (SAString).
# SA_dtCLob    Sets parameter's value as CLob data (SAString).
# SA_dtCursor    Sets parameter's value as Oracle REF CURSOR (SACommand).
# SA_dtSpecificToDBMS    Sets parameter's value as server-specific data type value.
« Последнее редактирование: 14-12-2007 17:50 от Алексей1153++ » Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #1 : 12-12-2006 21:31 » 

юзай SA_dtCursor
и соответственно возвращай ref cursor.
Записан

Удачного всем кодинга! -=x[PooH]x=-
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 13-12-2006 08:19 » 

Ну если нет типа table, то остаётся cursor - и по строчкам прочитать результат.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
remedius
Гость
« Ответ #3 : 14-12-2006 07:47 » 

не совсем понятно, в каком виде возвращать их ХП курсор. Можете привести пример(можно приблизительно), пожалуйста.
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #4 : 14-12-2006 08:54 » 

в Oracle (PL\SQL) примерно так:
Код:
  TYPE refcur IS REF CURSOR;
...
  FUNCTION func(...) RETURN refcur IS
    v_cursor refcur;
  BEGIN
   OPEN v_cursor FOR SELECT NULL FROM dual WHERE 1 = 2;
   RETURN v_cursor;
  END;

Записан

Удачного всем кодинга! -=x[PooH]x=-
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 14-12-2006 12:39 » 

remedius, вопрос непонятен. Ты же написала:
Код: (Text) С++
SACommand pCmd(pCon, "SELECT * FROM sys_objects");
pCmd.Execute();
int i = 0;
while(pCmd.FetchNext())
{
   printf("\nValue: %i", (int)pCmd.Field(i + 1).asLong());
   ...
}
Согласись, что команда "SELECT * FROM sys_objects" с точки зрения SQL курсора не возвращает, а возвращает таблицу. Так почему в ХП должен возвращаться курсор?
« Последнее редактирование: 14-12-2006 12:40 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
remedius
Гость
« Ответ #6 : 14-12-2006 16:29 » 

dimka, SACommand pCmd(pCon, "EXEC  sp_get_objects",SA_CmdSQLStmt); где sp_get_objects возвращает select *. Если делать как обычно:
while(pCmd.FetchNext())   
{
}
В While не заходим, прога вылетает с Unhandled exception at 0x100252ab in SDBFrame.exe: 0xC0000005: Access violation reading location 0x00000000.Улыбаюсь При обращении к pCmd.FetchNext().
« Последнее редактирование: 14-12-2006 16:41 от remedius » Записан
remedius
Гость
« Ответ #7 : 14-12-2006 16:30 » 

(в то время как при SACommand pCmd(pCon, "Select * from sys_objects"); возвращаются значения
Записан
remedius
Гость
« Ответ #8 : 14-12-2006 16:44 » 

Цитата: dimka
Согласись, что команда "SELECT * FROM sys_objects" с точки зрения SQL курсора не возвращает, а возвращает таблицу. Так почему в ХП должен возвращаться курсор?
так Я это поняла прочитав:
Ну если нет типа table, то остаётся cursor - и по строчкам прочитать результат.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 14-12-2006 17:05 » 

На сайте этой библиотеки SQL API написано же:
Цитата
A command (an SQL statement or procedure) can have a result set after executing. To check whether a result set exists use isResultSet method. If result set exists, a set of SAField objects is created after command execution. Rows from the result set can be fetched one by one using FetchNext method. To get field description or value use Field method.
Не надо никого параметра. Всё должно работать. Если нет записей, выходит, что либо их в самом деле нет, либо возникла ошибка при исполнении.

Ты же не обрабатываешь возможные ошибки. Может у тебя прав доступа к таблице нет. Или вообще этой таблицы нет. С какой базой данных происходит работа? Что значит "возвращаются значения"? Теоретически должны возвращаться или в самом деле возвращаются?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
remedius
Гость
« Ответ #10 : 14-12-2006 17:09 » 

Улыбаюсь как такое может быть, один и тот же запрос я использую,указывая напрямую, или вызывая функцию. Права на исполнение даной ХП и выборку из таблицы есть у польльзователя.
 
Эту вырезку я читала.

isResultSet  возвращает false;

может дело в ХП?
Код:
CREATE PROCEDURE sp_get_objects 
AS
RETURN SELECT * FROM sys_objects
GO
Записан
remedius
Гость
« Ответ #11 : 14-12-2006 17:11 » 

Повтроюсь:
Код:
SACommand pCmd(pCon, "Select * from sys_objects");

pCmd.Execute();
int i=0;
while(pCmd.FetchNext())
{
printf("\nValue: %i",  (int)pCmd.Field(i+1).asLong());
Так работает
Записан
remedius
Гость
« Ответ #12 : 14-12-2006 17:15 » 

Уфф.. извиняюсь. Я все поняла. Краснею
« Последнее редактирование: 14-12-2006 17:26 от remedius » Записан
remedius
Гость
« Ответ #13 : 14-12-2006 17:17 » new

CREATE PROCEDURE sp_get_objects
AS
SELECT * FROM sys_objects
GO
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines