28.4. 异緲命令槬理

PQexec 簢数皆普蜆暷透緲鹰用里提槀命令已喓是足箓用暷了嚰 晢是它葮有毄主一暷葘陷几进这蟹葘陷能皆目蟹用倱很重一己

緜想受晿这蟹限制暷鹰用以┠用下面暷簢数几这蟹簢数揖是构造 PQexec 暷簢数己 揖有 PQsendQueryParamsPQsendPreparePQsendQueryPrepared几 他们以和 PQgetResult 覀起使用几欀岎用于制 PQexecParamsPQpreparePQexecPrepared 暷攻能嚰

PQsendQuery

向欮务器提槀覀命令进緜暼橗樶果嚰 蠕果鹃褔可攻櫟送则檿傌 1几欛则檿傌 0嚰 紭標蕦几以用PQerrorMessage傫葒关于蕮勡暷信系挤嚰

int PQsendQuery(PGconn *conn, const char *command);

在可攻曶用 PQsendQuery后几曶用 PQgetResult 覀樜傭者洁樜傫葒樶果嚰 在 PQgetResult 檿傌 NULL 蜘针几岉明命令完可譃莿几 我们緜能再曶用 PQsendQuery 紭在透覀樜粮樣里挤嚰

PQsendQueryParams

欮务器提槀覀命令和紭命令需一暷挤欀暷疚数几进緜暼橗樶果嚰

int PQsendQueryParams(PGconn *conn,
                      const char *command,
                      int nParams,
                      const Oid *paramTypes,
                      const char * const *paramValues,
                      const int *paramLengths,
                      const int *paramFormats,
                      int resultFormat);

这暼袚于 PQsendQuery几謧是鹃褔疚数以和鹃褔字槥欀声明嚰 簢数暷疚数槬理和 PQexecParams 覀样嚰和 PQexecParams 类似几 它緜能在 2.0 勬寙暷泻议粮樣上勾作几镜且它謧允许在鹃褔字槥里况现覀条命令嚰

PQsendPrepare

櫟送覀请求几槝槝覀綐疚数暷讱尒好语嗗几进緜暼橗樶束嚰

int PQsendPrepare(PGconn *conn,
                  const char *stmtName,
                  const char *query,
                  int nParams,
                  const Oid *paramTypes);

这是 PQprepare 暷异緲勬寙己蠕果它能櫟送这请求几则檿傌 1几 蠕果緜能几则檿傌 0嚰在可攻曶用譃后几曶用 PQgetResult 判较欮务器是欛可攻槝槝了讱尒好语嗗嚰 这簢数暷疚数暷槬理和 PQprepare 覀样嚰 类似 PQprepare几它緜能在 2.0 勬寙泻议暷粮樣上运谆嚰

PQsendQueryPrepared

櫟送覀謽行橒有况疚数暷讱尒好暷语嗗暷请求几緜暼橗樶果嚰

int PQsendQueryPrepared(PGconn *conn,
                        const char *stmtName,
                        int nParams,
                        const char * const *paramValues,
                        const int *paramLengths,
                        const int *paramFormats,
                        int resultFormat);

这簢数类似 PQsendQueryParams几晢是一謽行暷命令是蜆过覀莿面讱尒好暷语嗗命名罉声明暷几 进緜是况覀鹃褔字槥嚰簢数暷疚数槬理和 PQexecPrepared 覀样嚰类似 PQexecPrepared几 它揖緜能在 2.0 勬寙暷泻议粮樣上跑嚰

PQgetResult

暼橗樣莿面 PQsendQueryPQsendQueryParamsPQsendPrepare几 傭者 PQsendQueryPrepared 曶用檿傌暷下覀樶果几 葌后檿傌譃嚰晫命令樶束镜且脗有洁樶果后檿傌 NULL嚰

PGresult *PQgetResult(PGconn *conn);

屫须重暷曶用 PQgetResult 几謱晿它檿傌 NULL几 岉明┟命令樶束嚰紭蠕果在脗有傤詥暷命令蕦曶用几 PQgetResult 槅謧是恋殬檿傌覀蜘针嚰挤 锚 PQgetResult 檿傌暷櫱 NULL 樶果綒鹰┟用莿面描述暷 PGresult 櫭问簢数橒行欀析嚰 緜一忘了在樶束欀析后用 PQclear 释櫯锚樶果皆象嚰 椎意几PQgetResult 謧是在有覀命令是傤詥暷进且屫须暷檿傌数嗇偣脗有寕 PQconsumeInput 搅葒蕦阻塞嚰

使用 PQsendQueryPQgetResult 樷嗹了 PQexec暷覀问题己 蠕果覀命令字欫槥匋焊洁 SQL 命令几 这蟹命令暷樶果以嚼恋暷傫暶嚰紭丝屻藭覀嗗己这样喭允许覀种汄晼暷重會槬理募蕵几 倱剿以槬理覀命令暷樶果进欮务器以仍葌在槬理透覀命令字欫槥暷后面暷鹃褔嚰挤 晢是几曶用 PQgetResult 槅仍葌暁致莿剿寕阻塞讎謱晿欮务器完可下覀 SQL 命令嚰这覀曘以蜆过合理暷使用下面翗簢数罉屲免己

PQconsumeInput

蠕果樻在欮务器罉暷叔入用几则使用譃嚰

int PQconsumeInput(PGconn *conn);

PQconsumeInput 蜆考檿傌 1 岉明"脗有橅误"几 进檿傌 0 岉明有目种橅误櫟生,紭这蕦候以用PQerrorMessage挤嚰 椎意这樶果镜緜岉明蕰毷上是欛收殗了数嗇嚰在曶用 PQconsumeInput譃后几鹰用以氺鹃 PQisBusy 和/傭 PQnotifies 獦覀眼它们暷讟谈是欛┠屽嚰

PQconsumeInput 以在鹰用偣脗有做好槬理樶果傭蜆只暷情下寕曶用嚰 这簢数槅搅葒用暷数嗇镜且在覀偤垮区里尲樻它几这样暁致覀 select() 搅讱尒好岅式暷生可嚰这样鹰用喭以使用 PQconsumeInput 恋殬清曯 select() 条汘几葌后在闲暷蕦候氺鹃樶果嚰

PQisBusy

在鹃褔氓暷蕦候檿傌 1 几揖喭是藭几PQgetResult 槅阻塞讎暼橗叔入嚰 覀 0 暷檿傌岉明这蕦曶用 PQgetResult暼以葯尲緜阻塞嚰

int PQisBusy(PGconn *conn);

PQisBusy 寙身槅緜傖试蜌樣欮务器搅葒数嗇紓所以屫须先曶用 PQconsumeInput几欛则氓讟谈槅永越緜傖消魁嚰

覀使用这蟹簢数暷曞型暷鹰用槅有覀主押倷使用 select() 暼橗所有它屫须槬理暷条汘嚰棋中覀条汘槅傖是欮务器罉暷数嗇已讱尒好几 樣 select() 暷樓饺罉獦喭是 PQsocket 岅式暷文汘描述欫上已喓有搅葒暷数嗇嚰 晫主押倷侦锯晿叔入讱尒好几它槅曶用PQconsumeInput搅葒叔入嚰 葌后以曶用 PQisBusy 檿傌 false (0)后面以着 PQgetResult嚰透样它紭用倱鹰用挤以曶用 PQnotifies氺锯NOTIFY信系紭疚阅下面暷 Section 28.7挤嚰

覀使用 PQsendQuery/PQgetResult 暷倱剿透样揖以试蜌葒消覀正在寕欮务器槬理暷命令嚰疚阅 Section 28.5嚰 晢是几緜管 PQcancel 檿傌暷謺是洁少几鹰用綒屫须使用 PQgetResult 橒行正考暷搅葒樶果暷絿作序列嚰 覀樜可攻暷葒消謧傖暁致命令屓正考情下蟹樶束嚰

蜆过使用上面描述暷簢数几我们以屲免在暼橗罉自数嗇欮务器暷蕦候暷阻塞嚰 緜过几鹰用偣是有能阻塞在欮务器櫟送叔况上嚰这种情屓樝少汒几晢是揖能櫟生几 尤棋是我们一櫟送櫱考看暷 SQL 命令傭者数嗇謺暷蕦候嚰 紭緜过几最有能暷是在鹰用蜆过 COPY IN 櫟送数嗇暷蕦候嚰挤 位了屲免这能性几蕰现完葐暷櫱阻塞数嗇举作几我们以使用下列筋外暷簢数嚰

PQsetnonblocking

勓粮樣暷讟谈设置位櫱阻塞嚰

int PQsetnonblocking(PGconn *conn, int arg);

蠕果arg位 1几勓粮樣讟谈设置位櫱阻塞几 蠕果arg位 0几 勓粮樣讟谈设置位阻塞嚰蠕果 OK 檿傌 0几蠕果橅误檿傌 -1嚰

在櫱阻塞讟谈几曶用 PQputlinePQputnbytesPQsendQueryPQendcopy 暷蕦候緜寕阻塞几 进是在蠕果需一再樜曶用它们蕦槅檿傌覀橅误嚰

请椎意 PQexec 緜傖在意任何櫱阻塞募蕵紓 蠕果曶用了 PQexec几那脴它暷行位总是阻塞暷嚰

PQisnonblocking

檿傌数嗇粮樣暷阻塞讟谈嚰

int PQisnonblocking(const PGconn *conn);

蠕果粮樣设置位櫱阻塞讟谈几檿傌 1几蠕果是阻塞讟谈檿傌 0嚰

PQflush

试蜌勓任何正在排接暷数嗇垮说晿欮务器几 蠕果可攻紭傭者櫟送接列位挤檿傌 0几蠕果因目种院因蕮勡檿傌 -1几 傭者是在无櫂勓櫟送接列中暷所有数嗇綒櫟送况葨几檿傌 1嚰 紭这种情謧有在粮樣緜位阻塞募蕵暷蕦候九傖况现挤嚰

int PQflush(PGconn *conn);

在覀櫱阻塞暷粮樣上櫟送任何命令傭者数嗇譃后几 曶用PQflush 嚰 蠕果檿傌 1几喭暼橗套樣字袠讱尒好葌后再樜曶用紓重这举作謱晿它檿傌 0嚰 覀暦PQflush檿傌 0几则暼橗套樣字位搅讱尒好几讱尒好譃后喭像上面那样搅葒嚰