Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Хранимые процедуры в ASA 8.0.1.3044 / 13 сообщений из 13, страница 1 из 1
08.10.2004, 12:50
    #32729772
Alex Daryin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
Привет всем!
Такая проблема. Есть ХП, которая возвращает 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
08.10.2004, 13:03
    #32729818
Redbor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
Код: 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
08.10.2004, 13:07
    #32729837
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
У ХП могут быть нормальные (IN/OUT/INOUT) параметры и параметры полей набора данных (result). Насчет ODBC API ничего сказать не могу, но явно Вы что то не так делаете, так как если работать с процедурами через тот же драйвер ODBC, то параметры отделяются от полей и все прекрасно видится и вызывается.

P.S. Так же result-параметры можно явно перечислить в процедуре ключевым словом RESULT.
...
Рейтинг: 0 / 0
08.10.2004, 13:07
    #32729838
Alex Daryin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
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
08.10.2004, 13:10
    #32729847
old_joy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
Либо нужно указать опцию RESULT в CREATE PROCEDURE, либо явно задать имена столбцов в предложении SELECT.

P.s. Никогда не используйте SELECT * в процедурах, триггерах и пакетниках. ASA компилирует их один раз при первом обращении. Причем при компиляции подставляет вместо звездочки имена всех столбцов в таблице. Если в последствие вы измените количество или названия столбцов, то эти процедуры начнут генерировать непонятные на первый взгляд ошибки. Когда, наконец, поймете, что произошло, вам придется перезапускать сервер.
...
Рейтинг: 0 / 0
08.10.2004, 13:12
    #32729854
Alex Daryin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
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
08.10.2004, 13:16
    #32729871
old_joy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
create procedure MyProc()
result (a,b)
begin
select a,b from Customers;
end;
...
Рейтинг: 0 / 0
08.10.2004, 13:18
    #32729882
Alex Daryin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
old_joycreate procedure MyProc()
result (a,b)
begin
select a,b from Customers;
end;

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

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

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

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

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

А я его не передаю, просто подвязываю SQLBindParameter и все..., чтобы туда вернулось нужное мне значение..
Если не подвязвать, а вызывать "call MyProc()", то ругнется ODBC и скажет "COUNT fields incorrect"... что значит: "Подвязывай нужное количество параметров..".
...
Рейтинг: 0 / 0
08.10.2004, 13:53
    #32730001
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
Пример для Си, взят из 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
08.10.2004, 13:55
    #32730004
Alex Daryin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранимые процедуры в ASA 8.0.1.3044
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
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Хранимые процедуры в ASA 8.0.1.3044 / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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