33.16. ÐнÑÑÑеннее ÑÑÑÑойÑÑво
Ð ÑÑом Ñазделе ÑаÑÑказÑваеÑÑÑ, как пÑепÑоÑеÑÑÐ¾Ñ ECPG ÑÑÑÑоен внÑÑÑи. ÐÑа инÑоÑмаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелей, желаÑÑÐ¸Ñ Ð¿Ð¾Ð½ÑÑÑ, как иÑполÑзоваÑÑ ECPG.
ÐеÑвÑе ÑеÑÑÑе ÑÑÑоки, коÑоÑÑе ecpg запиÑÑÐ²Ð°ÐµÑ Ð² вÑвод, ÑикÑиÑованÑ. ÐеÑвÑе две ÑÑÑоки ÑодеÑÐ¶Ð°Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑии, а ÑледÑÑÑие две диÑекÑÐ¸Ð²Ñ Ð²ÐºÐ»ÑÑениÑ, подклÑÑаÑÑие инÑеÑÑÐµÐ¹Ñ Ðº библиоÑеке. ÐаÑем пÑепÑоÑеÑÑÐ¾Ñ Ð¿ÑоÑиÑÑÐ²Ð°ÐµÑ Ñайл и пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² вÑвод. ÐбÑÑно он пÑоÑÑо пеÑаÑÐ°ÐµÑ Ð²ÑÑ Ð² ÑÑÑÑойÑÑво вÑвода.
ÐÑÑÑеÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXEC SQL, он вмеÑиваеÑÑÑ Ð¸ изменÑÐµÑ ÐµÑ. ÐÐ°Ð½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° наÑинаеÑÑÑ Ñо Ñлов EXEC SQL и заканÑиваеÑÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼ ;. ÐÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ воÑпÑинимаеÑÑÑ ÐºÐ°Ðº опеÑаÑÐ¾Ñ SQL и ÑазбиÑаеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÑÑановки пеÑеменнÑÑ
.
ÐодÑÑановка пеÑеменнÑÑ
Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо, когда Ñимвол наÑинаеÑÑÑ Ñ Ð´Ð²Ð¾ÐµÑоÑÐ¸Ñ (:). ECPG бÑÐ´ÐµÑ Ð¸ÑкаÑÑ Ð¿ÐµÑеменнÑÑ Ñ Ñаким именем ÑÑеди пеÑеменнÑÑ
, Ñанее обÑÑвленнÑÑ
в ÑекÑии EXEC SQL DECLARE.
Ð¡Ð°Ð¼Ð°Ñ Ð²Ð°Ð¶Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð² библиоÑеке â ECPGdo, коÑоÑÐ°Ñ Ð¾ÑÑÑеÑÑвлÑÐµÑ Ð²Ñполнение болÑÑинÑÑва команд. Ðна пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿ÐµÑеменное ÑиÑло аÑгÑменÑов (ÑÑо ÑиÑло легко Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾ÑÑигаÑÑ 50, и Ð¼Ñ Ð½Ð°Ð´ÐµÐµÐ¼ÑÑ, ÑÑо ÑÑо не пÑиведÑÑ Ðº пÑоблемам ни на какой плаÑÑоÑме).
Ðй пеÑедаÑÑÑÑ ÑледÑÑÑие аÑгÑменÑÑ:
- ÐÐ¾Ð¼ÐµÑ ÑÑÑоки
ÐÐ¾Ð¼ÐµÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки; иÑполÑзÑеÑÑÑ ÑолÑко в ÑообÑениÑÑ Ð¾Ð± оÑÐ¸Ð±ÐºÐ°Ñ .
- СÑÑока
Ðоманда SQL, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð²Ñполнена. Ðа ÐµÑ ÑодеÑжимое влиÑÑÑ Ð²Ñ Ð¾Ð´Ð½Ñе пеÑеменнÑе, Ñо еÑÑÑ Ð¿ÐµÑеменнÑе, добавленнÑе в командÑ, но неизвеÑÑнÑе во вÑÐµÐ¼Ñ ÐºÐ¾Ð¼Ð¿Ð¸Ð»ÑÑии. ÐеÑÑа, в коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑÑавлÑÑÑÑÑ Ð¿ÐµÑеменнÑе, обознаÑаÑÑÑÑ Ð·Ð½Ð°ÐºÐ°Ð¼Ð¸
?.- ÐÑ Ð¾Ð´Ð½Ñе пеÑеменнÑе
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ пеÑеменной ÑоÑмиÑÑÑÑÑÑ Ð´ÐµÑÑÑÑ Ð°ÑгÑменÑов. (См. ниже.)
ECPGt_EOITÐеÑеÑиÑление (
enum), показÑваÑÑее, ÑÑо болÑÑе Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð¿ÐµÑеменнÑÑ Ð½ÐµÑ.- ÐÑÑ Ð¾Ð´Ð½Ñе пеÑеменнÑе
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ пеÑеменной ÑоÑмиÑÑÑÑÑÑ Ð´ÐµÑÑÑÑ Ð°ÑгÑменÑов. (См. ниже.) ÐÑи пеÑеменнÑе заполнÑÑÑÑÑ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑнкÑией.
ECPGt_EORTÐеÑеÑиÑление (
enum), показÑваÑÑее, ÑÑо болÑÑе вÑÑ Ð¾Ð´Ð½ÑÑ Ð¿ÐµÑеменнÑÑ Ð½ÐµÑ.
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ пеÑеменной, вклÑÑÑнной в ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL, ÑÑа ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´ÐµÑÑÑÑ Ð°ÑгÑменÑов:
Тип в виде ÑпеÑиалÑного Ñимвола.
УказаÑÐµÐ»Ñ Ð½Ð° знаÑение или ÑказаÑÐµÐ»Ñ Ð½Ð° ÑказаÑелÑ.
Ð Ð°Ð·Ð¼ÐµÑ Ð¿ÐµÑеменной, еÑли она Ð¸Ð¼ÐµÐµÑ Ñип
charилиvarchar.ЧиÑло ÑлеменÑов в маÑÑиве (пÑи вÑбоÑке даннÑÑ Ð² маÑÑив).
СмеÑение ÑледÑÑÑего ÑлеменÑа в маÑÑиве (пÑи вÑбоÑке даннÑÑ Ð² маÑÑив).
Тип пеÑеменной-индикаÑоÑа в виде ÑпеÑиалÑного Ñимвола.
УказаÑÐµÐ»Ñ Ð½Ð° пеÑеменнÑÑ-индикаÑоÑ.
0
ЧиÑло ÑлеменÑов в маÑÑиве индикаÑоÑов (пÑи вÑбоÑке даннÑÑ Ð² маÑÑив).
СмеÑение ÑледÑÑÑего ÑлеменÑа в маÑÑиве индикаÑоÑов (пÑи вÑбоÑке даннÑÑ Ð² маÑÑив).
ÐамеÑÑÑе, ÑÑо не вÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL обÑабаÑÑваÑÑÑÑ Ñаким обÑазом. ÐапÑимеÑ, команда оÑкÑÑÑÐ¸Ñ ÐºÑÑÑоÑа вида:
EXEC SQL OPEN кÑÑÑоÑ; не копиÑÑеÑÑÑ Ð² вÑвод. ÐмеÑÑо ÑÑого в позиÑии ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ OPEN пÑименÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° DECLARE ÑÑого кÑÑÑоÑа, Ñак как на Ñамом деле кÑÑÑÐ¾Ñ Ð¾ÑкÑÑÐ²Ð°ÐµÑ Ð¾Ð½Ð°.
Ðиже показан полнÑй пÑимеÑ, демонÑÑÑиÑÑÑÑий ÑезÑлÑÑÐ°Ñ Ð¾Ð±ÑабоÑки пÑепÑоÑеÑÑоÑом Ñайла foo.pgc (деÑали могÑÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¾Ñ Ð²ÐµÑÑии к веÑÑии пÑепÑоÑеÑÑоÑа):
EXEC SQL BEGIN DECLARE SECTION; int index; int result; EXEC SQL END DECLARE SECTION; ... EXEC SQL SELECT res INTO :result FROM mytable WHERE index = :index;
пÑеобÑазÑеÑÑÑ Ð²:
/* Processed by ecpg (2.6.0) */
/* These two include files are added by the preprocessor */
#include <ecpgtype.h>;
#include <ecpglib.h>;
/* exec sql begin declare section */
#line 1 "foo.pgc"
int index;
int result;
/* exec sql end declare section */
...
ECPGdo(__LINE__, NULL, "SELECT res FROM mytable WHERE index = ? ",
ECPGt_int,&(index),1L,1L,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(result),1L,1L,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 147 "foo.pgc"
(ÐÑÑÑÑÐ¿Ñ Ð·Ð´ÐµÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð´Ð»Ñ ÑиÑаемоÑÑи, пÑепÑоÑеÑÑÐ¾Ñ Ð¸Ñ Ð½Ðµ вÑÑавлÑеÑ.)