powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Хранимые процедуры в ASA 8.0.1.3044
13 сообщений из 13, страница 1 из 1
Хранимые процедуры в ASA 8.0.1.3044
    #32729772
Alex Daryin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
Такая проблема. Есть ХП, которая возвращает result set.

create procedure MyProc()
begin
select * from Customers;
end;

Есть прога на Дельфи, которая выполняет эту ХП через ODBC API.
Во-первых , SQLProcedureColumns возвращает колич. параметров у этой процедуры равное количеству полей в таблице Customers. По сути получается все поля таблицы маппируются в неявные out параметры ХП.

Во-вторых . Если параметры не подвязывать (SQLBindParameter), то при выполнении (SQLExecute/SQLExecDirect) ODBC выдает общую ошибку 'Count fields incorrect', что и понятно, так как у ХП определяются параметры.

В-третьих . Если я подвязываю параметры, то после (SQLExecute/SQLExecDirect) выдает ошибку ASA ODBC драйвер 'Wrong number of parameters to function [MyProc]'. Но параметры подвязаны все...

Вообще не понятен принцип работы с такой процедурой. Она дожна возвращать result set. Причем здесь параметры?

Никто с такой проблемой не сталкивался?
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729818
Redbor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure proc1;
var
  q: TQuery;
  Param1: string;
  Param1: integer;
  ...
  ParamN: ...
begin
  q.SQL.Text := 'call sp_MyStoredProc (''' + Param1 + ''', ' +
  		IntToStr (Param2) + ', ' + ... ')';
  q.Open;
end;
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729837
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У ХП могут быть нормальные (IN/OUT/INOUT) параметры и параметры полей набора данных (result). Насчет ODBC API ничего сказать не могу, но явно Вы что то не так делаете, так как если работать с процедурами через тот же драйвер ODBC, то параметры отделяются от полей и все прекрасно видится и вызывается.

P.S. Так же result-параметры можно явно перечислить в процедуре ключевым словом RESULT.
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729838
Alex Daryin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Redbor
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure proc1;
var
  q: TQuery;
  Param1: string;
  Param1: integer;
  ...
  ParamN: ...
begin
  q.SQL.Text := 'call sp_MyStoredProc (''' + Param1 + ''', ' +
  		IntToStr (Param2) + ', ' + ... ')';
  q.Open;
end;


Я не через BDE работаю, но принцип использую тот же. Вот как раз во время Open (на вызове SQLExecDirect('call MyProc(?,?,?...)')) и возникает описанная ошибка.
Я и написал, что подвязываю все параметры и вызываю
SQLExecDirect('call MyProc(?,?,?,?,?...)')
а получаю ошибку во время исполнения
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729847
old_joy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо нужно указать опцию RESULT в CREATE PROCEDURE, либо явно задать имена столбцов в предложении SELECT.

P.s. Никогда не используйте SELECT * в процедурах, триггерах и пакетниках. ASA компилирует их один раз при первом обращении. Причем при компиляции подставляет вместо звездочки имена всех столбцов в таблице. Если в последствие вы измените количество или названия столбцов, то эти процедуры начнут генерировать непонятные на первый взгляд ошибки. Когда, наконец, поймете, что произошло, вам придется перезапускать сервер.
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729854
Alex Daryin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSУ ХП могут быть нормальные (IN/OUT/INOUT) параметры и параметры полей набора данных (result). Насчет ODBC API ничего сказать не могу, но явно Вы что то не так делаете, так как если работать с процедурами через тот же драйвер ODBC, то параметры отделяются от полей и все прекрасно видится и вызывается.

P.S. Так же result-параметры можно явно перечислить в процедуре ключевым словом RESULT.

Я делал и так, описывал все параметры с ключевым словом Result. Результат (<g>) такой же.
Вот и хочу понять, что я не так делаю...
Процедуры типа
create proc....(out a integer, out b string)
begin
set a = 1;
set b = 'sdfgdfad';
end;

выполняются нормально... А вот c result set беда.
А там не нужно еще указывать какие-нибудь ключевые слова? Или вызывать ее как-то по-другому?
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729871
old_joy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
create procedure MyProc()
result (a,b)
begin
select a,b from Customers;
end;
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729882
Alex Daryin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
old_joycreate procedure MyProc()
result (a,b)
begin
select a,b from Customers;
end;

Вот так же сейчас и проверял, тока с одним полем "а".

Вызов "call DBA.MyProc(?)"...
А результат (<g>) все тот же
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729903
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Daryin old_joycreate procedure MyProc()
result (a,b)
begin
select a,b from Customers;
end;

Вот так же сейчас и проверял, тока с одним полем "а".

Вызов "call DBA.MyProc(?)"...
А результат (<g>) все тот же
А зачем Вы ей параметр передаете, если его нет ?
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729916
Alex Daryin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS... так как если работать с процедурами через тот же драйвер ODBC, то параметры отделяются от полей и все прекрасно видится и вызывается.

А как параметры отделяются от полей в данном случае?
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32729926
Alex Daryin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
old_joyА зачем Вы ей параметр передаете, если его нет ?

А я его не передаю, просто подвязываю SQLBindParameter и все..., чтобы туда вернулось нужное мне значение..
Если не подвязвать, а вызывать "call MyProc()", то ругнется ODBC и скажет "COUNT fields incorrect"... что значит: "Подвязывай нужное количество параметров..".
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32730001
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример для Си, взят из BOL ASA 9.0.1:
Код: 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.
30.
31.
HDBC dbc;
HSTMT stmt;
SWORD num_col;
RETCODE retcode;
char emp_id[  10  ];
char emp_lname[  20  ];

 /* Create the procedure */ 
SQLExecDirect( stmt,
      "CREATE PROCEDURE employees()" \
      " RESULT( emp_id CHAR(10), emp_lname CHAR(20))"\
      " BEGIN" \
      " SELECT emp_id, emp_lname FROM employee" \
      " END", SQL_NTS );

 /* Call the procedure - print the results */ 
SQLExecDirect( stmt, "CALL employees()", SQL_NTS );
SQLNumResultCols( stmt, &num_col );
SQLBindCol( stmt,  1 , SQL_C_CHAR, &emp_id,
            sizeof(emp_id), NULL );
SQLBindCol( stmt,  2 , SQL_C_CHAR, &emp_lname,
            sizeof(emp_lname), NULL );

for( ;; ) {
   retcode = SQLFetch( stmt );
   if( retcode == SQL_NO_DATA_FOUND ) {
      retcode = SQLMoreResults( stmt );
   if( retcode == SQL_NO_DATA_FOUND ) break;
}    else {
      do_something( emp_id, emp_lname );
   }
}
Дальше сами кумекайте.

P.S. И зачем Вам сдался ODBC API ? Чем стандартные то средства доступа не устраивают, зачем все это ручками писать ?
...
Рейтинг: 0 / 0
Хранимые процедуры в ASA 8.0.1.3044
    #32730004
Alex Daryin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSПример для Си, взят из BOL ASA 9.0.1:
Код: 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.
30.
31.
HDBC dbc;
HSTMT stmt;
SWORD num_col;
RETCODE retcode;
char emp_id[  10  ];
char emp_lname[  20  ];

 /* Create the procedure */ 
SQLExecDirect( stmt,
      "CREATE PROCEDURE employees()" \
      " RESULT( emp_id CHAR(10), emp_lname CHAR(20))"\
      " BEGIN" \
      " SELECT emp_id, emp_lname FROM employee" \
      " END", SQL_NTS );

 /* Call the procedure - print the results */ 
SQLExecDirect( stmt, "CALL employees()", SQL_NTS );
SQLNumResultCols( stmt, &num_col );
SQLBindCol( stmt,  1 , SQL_C_CHAR, &emp_id,
            sizeof(emp_id), NULL );
SQLBindCol( stmt,  2 , SQL_C_CHAR, &emp_lname,
            sizeof(emp_lname), NULL );

for( ;; ) {
   retcode = SQLFetch( stmt );
   if( retcode == SQL_NO_DATA_FOUND ) {
      retcode = SQLMoreResults( stmt );
   if( retcode == SQL_NO_DATA_FOUND ) break;
}    else {
      do_something( emp_id, emp_lname );
   }
}
Дальше сами кумекайте.

P.S. И зачем Вам сдался ODBC API ? Чем стандартные то средства доступа не устраивают, зачем все это ручками писать ?

Да, все заработало... спасибо!
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Хранимые процедуры в ASA 8.0.1.3044
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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