powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Получить inout параметр через ODBC
11 сообщений из 11, страница 1 из 1
Получить inout параметр через ODBC
    #38052311
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sybase ASA 12.0.1
Ни как не удается получить выходной параметр из процедуры.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
ALTER PROCEDURE "DBA"."sp_test"(
  inout inChar char(30)
)
RESULT(
  c char(30)
)
BEGIN
  declare vChar char(30);
  set vChar  = inChar;
  set inChar = 'world';
  select vChar
END



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
  {
    SQLHENV  env;
    SQLHDBC  cnn;
    SQLHSTMT stmt;
    SQLRETURN ret;
    char buf[30] = "hello";
    SQLULEN buf_ind = 5;
    char col[30];
    SQLULEN col_ind = 0;
    
    ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
    ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
    ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &cnn);
    ret = SQLConnect(cnn, "EmptyDB", SQL_NTS, "DBA", SQL_NTS, "sql", SQL_NTS);
    ret = SQLAllocHandle(SQL_HANDLE_STMT, cnn, &stmt);
    ret = SQLPrepare(stmt, "{call sp_test(?)}", SQL_NTS);
    ret = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT_OUTPUT, SQL_C_CHAR, SQL_CHAR, 30, 0, buf, sizeof(buf), &buf_ind);
    ret = SQLBindCol(stmt, 1, SQL_C_CHAR, col, sizeof(col), &col_ind);
    ret = SQLExecute(stmt);
    do{
      while (ret == SQL_SUCCESS){
        ret = SQLFetch(stmt);
      }
      ret = SQLMoreResults(stmt);
    }while(ret == SQL_SUCCESS);
    ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt);
    ret = SQLFreeHandle(SQL_HANDLE_DBC, cnn);
    ret = SQLFreeHandle(SQL_HANDLE_ENV, env);
  }


Переменная col получает значение "hello", но buf остается без изменений.
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38052345
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moteus
Код: plaintext
1.
    ret = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT_OUTPUT, SQL_C_CHAR, SQL_CHAR, 30, 0, buf, sizeof(buf), &buf_ind);


Переменная col получает значение "hello", но buf остается без изменений.Чему равняется этот ret?
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38052355
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все ret равны 0 (кроме второго вызова SQLFetch и SQLMoreResult они возвращают 100)
Данные передаются в процедуру и возвращаются через SQLBindCol.

SQLGetDescField( ... SQL_DESC_PARAMETER_TYPE ...)
для этого параметра возвращает тип SQL_PARAM_INPUT_OUTPUT.
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38052977
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уберите последний select в хранимке и попробуйте снова.
Я когда-то сталкивался, что из асашки через одбц не получалась получать и резалтсет и аут-переменный. Можно было брать что-то одно.
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38053027
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без select тоже не работает.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
ALTER FUNCTION "DBA"."fn_test"( IN inChar char(30) )
RETURNS integer
DETERMINISTIC
BEGIN
  DECLARE "vResult" integer;
  if('hello' = inChar) then set vResult=123; end if;
  RETURN "vResult";
END


Код: plaintext
1.
2.
3.
    ret = SQLPrepare(stmt, "{? = call fn_test(?)}", SQL_NTS);
    ret = SQLBindParameter(stmt, 1, SQL_PARAM_OUTPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &i, 0, &i_ind);
    ret = SQLBindParameter(stmt, 2, SQL_PARAM_INPUT_OUTPUT, SQL_C_CHAR, SQL_CHAR, 30, 0, buf, sizeof(buf), &buf_ind);


После SQLExecute я получаю 123 в переменной i.
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38053077
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так, а попробуйте ХП без returns, возврат через out-переменную с тем-же кодом. Ну и кавычки вокруг имен переменных уберите.

ALTER FUNCTION "DBA"."fn_test"( IN inChar char(30), OUT vResult integer)
BEGIN
set vResult=0;
if('hello' = inChar) then set vResult=123; end if;
END
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38053087
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Результат из функции я получаю правильно(SQL_PARM_OUTPUT для конструкции '? = call ...' работает)
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38053097
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функции не поддерживают out параметры.

Сейчас я тестирую на ASA 9.0.2.
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38053134
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такая процедура работает. (T-SQL)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
ALTER PROCEDURE "DBA"."sp_test2"( @inChar char(30) OUTPUT )
 AS
BEGIN
  declare @vChar char(30)  
  select @vChar = @inChar 
  select @inChar = 'world'
//  select @vChar
END



Если убрать NO RESULT SET то параметр не возвращается.
Похоже это фича ASA.
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38053142
moteus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И так тоже работает
Код: sql
1.
2.
3.
4.
5.
6.
ALTER PROCEDURE "DBA"."sp_test"(
  inout inChar char(30)
)
BEGIN
  set inChar = 'world';
END
...
Рейтинг: 0 / 0
Получить inout параметр через ODBC
    #38053245
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
предположу, что функции возвращают значение не как аут-параметр, а как резалтсет, соответственно его надо получать уже другим кодом.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Получить inout параметр через ODBC
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]