mySQL : prepared statements

7 отговора 267 прегледа
#1

mySQL : prepared statements

Някои използвал ли е т.нар. prepared statements - възможност да подготвя една SQL заявка - примерно INSERT INTO table (c1, c2, c2) VALUES (?,?,?) после да я изпълнявам със различни данни.

Според mySQL документацията ([линк]) това е най-икономичния начин за да направя много и еднакви заявки.

Смятам да го използвам от custom програма написана на C, използваща mySQL API.

Проблема е, че примерите в документацията не се компилират (няма mysql_stmt_init във libmysqlclient.14.so, нито в source-вете на 4.1.1-alpha нито в 5.0-alpha)

Някакви идеи?

Редактирано от pink8O на

Отговор
в отговор на pink8O #2

Re: mySQL : prepared statements

мен също ме вълнуват тези въпроси и
като представител на останалата част от света, която няма удоволствието на на С и веднага да ползва всички нововъведения в апито искам да питам как седи въпроса с odbc драйвера например, настоящата версия 3.51.06 поддържа ли препаред статементс, и ако не, коя ще поддържа?

Отговор
в отговор на s_dimi #3

Re: mySQL : prepared statements

Имам познати, които са го ползвали през ODBC и PerlDBI - но нямам повече инфо. BTW - прочетох за това нововъведение за 4.1. Май няма да стане на 3.xx.xx версия.

Отговор
в отговор на pink8O #4

Re: mySQL : prepared statements

знам, че няма да стане на версия преди 4.1, аз точно нея ползвам, а това число 3.51.06 не е версията на базата данни (такава няма), а на одбц драйвера, който си е със съвсем отделна номерация.

гледах в документацията, нищо не пише за това. като драйвера почне да ползва новото апи, най-вероятно ще го упоменат, ама тая работа едва ли ще стане преди да излезе стабилна версия на 4.1, което сигурно ще е след повече от година.

Отговор
в отговор на pink8O #5

Re: mySQL : prepared statements

Ама ... как така ги няма?
Ти къде всъщност гледаш?

[salle@vafla ~/bk/mysql-4.1]$ grep mysql_stmt_init include/*
include/mysql.h:/* Use mysql_stmt_init + mysql_stmt_prepare instead */
include/mysql.h:MYSQL_STMT * STDCALL mysql_stmt_init(MYSQL *mysql);
[salle@vafla ~/bk/mysql-4.1]$ grep mysql_stmt_init libmysql/*
libmysql/libmysql.c: stmt= mysql_stmt_init(mysql);
libmysql/libmysql.c: mysql_stmt_init()
libmysql/libmysql.c:mysql_stmt_init(MYSQL *mysql)
libmysql/libmysql.c: DBUG_ENTER("mysql_stmt_init");
Binary file libmysql/libmysql.o matches


salle.online.bg/sig

Редактирано от salle на

Отговор
в отговор на salle #6

Re: mySQL : prepared statements

При мен ги няма :( Свалил съм си mySQL 4.1.1-alpha от mysql.online.bg (MD5 сумата съвпада оригинала на [линк]). Разархивирам и пускам grep:
root@pink:/usr/local/src/mysql-4.1.1-alpha# grep mysql_stmt_init include/*
root@pink:/usr/local/src/mysql-4.1.1-alpha# grep mysql_stmt_init libmysql/*

Пробвах и 5.0.0-alpha - пак ги няма!

Свалял съм от тоя линк: [линк]

Трябва ли да ползвам CVS версията?

Отговор
в отговор на pink8O #7

Re: mySQL : prepared statements

CVS версия няма. Използваме BitKeeper

Мисля, че дължа доста по-подробно обяснение....

Прав си. Точно mysql_stmt_init все още не съществува в 4.1.1

Има го в текущия код т.е. този в BitKeeper където аз проверявах.

А се споменава в онлайн документацията защото тя документацията се пише в движение от програмистите. Та въпросните редове са добавени от Константин Осипов на 5.03.2004 в


ChangeSet 1.1759.3.1 2004/03/05 16:55:09 [email protected]
New call mysql_stmt_init() introduced.
Renames:
mysql_bind_param -> mysql_stmt_bind_param
mysql_bind_result -> mysql_stmt_bind_result
mysql_execute -> mysql_stmt_execute
mysql_fetch -> mysql_stmt_fetch
mysql_fetch_column -> mysql_stmt_fetch_column
mysql_get_metadata -> mysql_stmt_result_metadata
mysql_param_count -> mysql_stmt_param_count
mysql_param_result -> mysql_stmt_param_metadata
mysql_prepare -> mysql_stmt_prepare
mysql_send_long_data -> mysql_stmt_send_long_data

client_test.c cleaned up from memory leaks
libmysql/libmysql.c 1.210 2004/03/05 16:55:06 [email protected]
New call mysql_stmt_init() introduced.
Renames:
mysql_bind_param -> mysql_stmt_bind_param
mysql_bind_result -> mysql_stmt_bind_result
mysql_execute -> mysql_stmt_execute
mysql_fetch -> mysql_stmt_fetch
mysql_fetch_column -> mysql_stmt_fetch_column
mysql_get_metadata -> mysql_stmt_result_metadata
mysql_param_count -> mysql_stmt_param_count
mysql_param_result -> mysql_stmt_param_metadata
mysql_prepare -> mysql_stmt_prepare
mysql_send_long_data -> mysql_stmt_send_long_data


И съответно заедно с промените на кода Константин (както е задължен) е документирал това, което е направил.


Затова например в 4.1.1 има mysql_prepare а в онлайн документацията това вече е перименувано на mysql_stmt_prepare

Ако обаче погледнеш във mysql-4.1.1-alpha/Docs/manual* ще видиш, че там нещата са описани така както са в момента в който сме пуснали 4.1.1 т.е. там се говори за mysql_prepare

salle.online.bg/sig
Отговор
в отговор на salle #8

Re: mySQL : prepared statements

Благодаря за подробния отговор - ще разгледам mysql-4.1.1-alpha/Docs и ще пробвам пак. Също така ще имам предвид предстоящата модификация на интерфейсите.

Отговор