powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Api Call Select
7 сообщений из 7, страница 1 из 1
Api Call Select
    #39345935
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая селективная процедура
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE PROCEDURE sp_d_test()
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
  SELECT * FROM my_table;
END;


Я ее запускаю в консоли
Код: sql
1.
CALL sp_d_test()


и вижу таблицу. Теперь вопрос, как мне достать эту таблицу используя C-Prepared Statements?

Документация говорит о функции mysql_stmt_next_result(), но тут же говорит, что эта функция появилась в версии 5.5, а у меня веросия 5.1

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Api Call Select
    #39345943
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При таком коде
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TForm1.btnLowAPIClick(Sender: TObject);
var
  LConn: Pointer;
  LSQL: AnsiString;
  LStmt: PMYSQL_STMT;
begin
  LConn := MySQLInit;
  mysql_real_connect(LConn, 'localhost', 'root', '', 'test', 0, nil, 0);
  LSQL := 'CALL sp_d_test()';
  LStmt := mysql_stmt_init(LConn);
  if mysql_stmt_prepare(LStmt, PAnsiChar(LSQL), Length(LSQL)) <> 0 then
    MySQLStmtError(LStmt);
  if mysql_stmt_execute(LStmt) <> 0 then
    MySQLStmtError(LStmt);
end;


функция mysql_stmt_execute возвращает ошибку
PROCEDURE test.sp_d_test can't return a result set in the given context
...
Рейтинг: 0 / 0
Api Call Select
    #39345948
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вызов mysql_real_query() дает ту же ошибку
...
Рейтинг: 0 / 0
Api Call Select
    #39345969
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде работает, если указать флаг CLIENT_MULTI_RESULTS
Код: pascal
1.
mysql_real_connect(LConn, 'localhost', 'root', '', 'test', 0, nil, CLIENT_MULTI_RESULTS);
...
Рейтинг: 0 / 0
Api Call Select
    #39346119
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, кто пнет в нужном направлении. Не могу получить имена полей, возвращаемых процедурой
Код: pascal
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.
procedure TForm1.btnLowAPIClick(Sender: TObject);
var
  LConn: Pointer;
  LSQL: AnsiString;
  LStmt: PMYSQL_STMT;
  LCnt: Integer;
  LFld: PMYSQL_FIELD;
  LRes: PMYSQL_RES;
begin
  LConn := MySQLInit;
  mysql_real_connect(LConn, 'localhost', 'root', '', 'test', 0, nil, 0);
  MySQLQuery(LConn, 'SET character_set_results=ucs2');
  LSQL := 'CALL sp_d_test()';
  LStmt := mysql_stmt_init(LConn);
  if mysql_stmt_prepare(LStmt, PAnsiChar(LSQL), Length(LSQL)) <> 0 then
    MySQLStmtError(LStmt);
  if mysql_stmt_execute(LStmt) <> 0 then
    MySQLStmtError(LStmt);
  LCnt := mysql_stmt_field_count(LStmt);  // Возвращается правильное число
  LRes := mysql_stmt_result_metadata(LStmt);
  LFld := mysql_fetch_field(LRes);
  while LFld <> nil do begin
    LStr := UCS2BytesToUTF16(PByte(LFld^.name), LFld^.name_length);
    LFld := mysql_fetch_field(LRes);
  end;
end;

В полях LFld^.name, LFld^.name_length содержится мусор, поле LFld^.type заполняется корректно
Если сделать
Код: pascal
1.
MySQLQuery(LConn, 'SET character_set_results=utf8');

то в LFld^.name приходит корректное значение, в LFld^.name_length все равно мусор.

Для обычного селекта из таблицы
Код: pascal
1.
LSQL := 'SELECT * FROM my_table';

Структура заполняется корректно и для UCS2 и для UTF8. С одним НО. Документация говорит
char * name

The name of the field, as a null-terminated string. If the field was given an alias with an AS clause, the value of name is the alias. For a procedure parameter, the parameter name.Так вот для UCS2 она не null-terminated, но в name_length приходит честный размер в байтах
...
Рейтинг: 0 / 0
Api Call Select
    #39346120
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Код: pascal
1.
mysql_real_connect(LConn, 'localhost', 'root', '', 'test', 0, nil, 0);

Тут ошибка при вставке на форум. Читать как
Код: pascal
1.
mysql_real_connect(LConn, 'localhost', 'root', '', 'test', 0, nil, CLIENT_MULTI_RESULTS);
...
Рейтинг: 0 / 0
Api Call Select
    #39346122
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия сервера 5.1.45
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Api Call Select
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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