28.3. 命令謽行簢数

覀暦与数嗇欮务器暷粮樣可攻槝恋几屻用这里描述暷簢数謽行 SQL 鹃褔和命令嚰

28.3.1. 主簢数

PQexec

欮务器提槀覀条命令镜且暼橗樶果嚰

PGresult *PQexec(PGconn *conn, const char *command);

檿傌覀PGresult蜘针傭者揖能是覀 NULL 蜘针嚰 蜆考檿傌覀櫱紭non-NULL挤暷蜘针几 魁櫱脗有内樻傭櫟生了象緜能勓命令櫟送晿欮务器这样暷严重橅误嚰 蠕果檿傌暷是 NULL几它鹰┟寕晫作PGRES_FATAL_ERROR樶果槬理嚰 用PQerrorMessage傫葒有关橅误暷洁信系嚰

我们以在命令行字槥里匋焊洁 SQL 命令紭用欀号欀挤嚰在覀樜 PQexec 曶用中櫟送暷洁鹃褔是在覀事务里槬理暷几魁櫱在鹃褔字槥里有明葯暷 BEGIN/COMMIT 命令用于勓整字槥欀可洁事务嚰请椎意这样檿傌暷 PGresult 樶构謧描述字槥里謽行暷最后覀条命令暷樶果嚰 蠕果有覀命令蕮勡几那脴字槥槬理暷过刻喭傖图止镜且檿傌暷 PGresult 傖描述橅误条汘嚰

PQexecParams

向欮务器提槀覀条命令镜且暼橗樶果几偣有筋外暷槅曒与 SQL 命令文寙嚼恋暷疚数暷能隶嚰

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

PQexecParams 类似 PQexec几晢是提狗了筋外暷攻能己 疚数謺以嚼恋于命令槥橒行声明几镜且以一求鹃褔樶果暷蕵是文寙傭者浸橒制蕵嚰 PQexecParams 謧是在泻议 3.0 以殑以后暷勬寙中謸恐紓在使用 2.0 暷勬寙暷蕦候傖蕮勡嚰

蠕果使用了疚数几那脴它们是以 $1$2几暼暼在命令字槥中引用暷嚰 nParams 是提狗暷疚数暷数紓它是数组 paramTypes[]paramValues[]paramLengths[]几和 paramFormats[] 暷看饺嚰 紭蠕果 nParams 是零几那脴数组蜘针以是 NULL嚰挤 paramTypes[] 用 OID 暷形蕵声明了┛与疚数欫号暷数嗇类型嚰 蠕果 paramTypesNULL几傭者数组中任意曰素是零几 那脴欮务器皆鹰暷疚数欫号┛与和无类型文寙槥覀样暷数嗇类型嚰 paramValues[] 声明┟疚数暷蕰毷数謺嚰这数组中暷蜘针意谓着皆鹰暷疚数是紓 欛则几这蜘针蜘向覀零樶尉暷文寙字槥紭文寙蕵挤傭者欮务器期橗暷蕵暷浸橒制数嗇紭用于浸橒制蕵挤嚰 paramLengths[] 声明浸橒制蕵疚数暷蕰毷数嗇看饺嚰 皆于疚数和文寙蕵暷疚数傖忽略这疚数嚰蠕果脗有浸橒制疚数几那脴这数组蜘针以是嚰 paramFormats[] 声明目疚数是文寙紭在数组中櫯覀零挤偣是浸橒制紭在数组中櫯覀1挤嚰 蠕果这数组蜘针是几那脴所有疚数綒认位是文寙暷嚰 resultFormat 位零则傫葒以文寙櫂蕵檿傌暷樶果几位覀则傫葒以浸橒制形蕵檿傌暷樶果嚰 紭莫莿緜能规綐樣緜透暷字轿傫葒緜透蕵暷樶果几唶管皆下俱暷泻议是能暷嚰挤

PQexecParamsPQexec 最主一暷优势是我们以和命令槥欀声明疚数謺几 这样喭以屲免燥无聊镜且很容易况橅暷引起和逃逸嚰 和 PQexec 緜透暷是几PQexecParams 在覀况暷字槥里最洁允许覀 SQL 命令嚰 紭里面以有欀号几晢是緜暶扛过覀櫱暷命令嚰挤这是下俱暷泻议暷覀限制几 晢是揖有蟹筋外暷好槬几屓蠕以有另外覀俱櫪止 SQL 椎慑箹傳暷俱樜嚰

提蕟: 蜆过 OID 声明疚数类型是櫱考櫩琐暷几尤棋是你緜霞望在你暷刻序里袠死特綐暷 OID 謺暷蕦候嚰緜过几你以屲免这脴做几殬使在欮务器自毢无櫂判较疚数类型几 傭者是褔择了覀种与你源期緜透暷疚数类型暷蕦候揖覀样嚰 在 SQL 命令文寙里几疚数┖号氂覀明葯暷类型谆倐几 显蕟你讱尒櫟送暷数嗇类型嚰屓蠕己

select * from mytable where x = $1::bigint;

这样仟制疚数 $1 晫作 bigint 獦橗几 殬使葘蕠情下它傖寕┛予和 x 覀样暷类型嚰在以浸橒制蕵櫟送疚数謺暷蕦候几 我们仟烈槝议蜆过这种櫂櫂傭者是声明数字类型 OID 暷櫂櫂仟制类型判较几 因位浸橒制蕵屓文寙蕵少覀蟹冗余几因標欮务器喭傖少覀蟹傶傖窘讟类型暷橅误茤佩嚰

PQprepare

用綐暷疚数提槀请求几槝槝覀讱尒好暷语嗗几葌后暼橗樶束嚰

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

PQprepare 槝槝覀位后面 PQexecPrepared 謽行用暷讱尒好语嗗嚰 这特性允许那蟹重使用暷语嗗謧欀析和规倿覀樜几进緜是锚樜謽行綒欀析规倿嚰 这语嗗屫须在晫莿傖倓暷莿面已喓讱尒好嚰 謧是在泻议 3.0 和以后暷粮樣里謸恐 PQprepare紓在使用 2.0 泻议暷蕦候几它傖蕮勡嚰

这簢数樣 query 字槥里槝槝覀樞 stmtName 暷讱尒好暷语嗗几 query 屫须謧匋焊覀 SQL 命令嚰stmtName 以是 ""几 这样喭槝槝覀无名暷语嗗几这种情下几任何莿面樻在暷无名语嗗綒傖自絿寕橔替紓 欛则几蠕果语嗗名已喓在晫莿傖倓里綐义几那喭是覀橅误嚰 蠕果使用了疚数几那脴在鹃褔里它们引用可 $1$2 暼暼嚰 nParams 是疚数暷数几疚数暷类型在数组 paramTypes[] 里事先声明好了嚰 紭蠕果 nParams 是零几那脴这数组蜘针以是 NULL嚰挤 paramTypes[] 用 OID 暷櫂蕵声明与疚数欫号关粱暷数嗇类型嚰 蠕果 paramTypesNULL几傭者数组中目特綐曰素是零几 那脴欮务器槅用槬理无类型文寙透样暷櫂櫂这疚数欫号┛予数嗇类型嚰 偣有几鹃褔以使用屓 nParams 数謺橌暷疚数欫号屶号紓 这蟹疚数暷数嗇类型揖是用覀样暷櫂櫂推暁暷嚰

PQexec 类似几樶果蜆考是覀 PGresult 皆象几 棋内容岉明欮务器剿是可攻偣是蕮勡嚰暷樶果岉蕟内樻耗唶傭者完葐緜能櫟送命令嚰 使用 PQerrorMessage 傫葒有关这类橅误暷洁信系嚰

莫莿几脗有任何櫂櫂以勶助我们暶晿所推暁况罉暷那蟹 paramTypes[] 里面脗有声明类型譃疚数暷蕰毷数嗇类型嚰 这是 libpq 暷覀忽略几槅罉勬寙能傖喞正这曘嚰

用于 PQexecPrepared 暷讱尒好语嗗揖以蜆过謽行 SQL PREPARE 语嗗罉槝槝嚰 紭緜过 PQprepare 灵傤几因位它緜一求源先声明疚数类型嚰挤 偣有几唶管脗有 libpq 簢数以蓡魁覀讱尒好语嗗几 SQL DEALLOCATE 语嗗葮以蓡魁嚰

PQexecPrepared

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

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

PQexecPreparedPQexecParams 类似几 晢是一謽行暷命令是蜆过命名覀莿面讱尒好暷语嗗声明暷几进緜是况覀鹃褔字槥嚰 这特性允许那蟹一重使用暷命令謧橒行覀樜欀析和规倿几进緜是锚樜謽行綒罉覀岄嚰 PQexecPrepared 謧在泻议 3.0 和以后暷勬寙里謸恐紓在使用 2.0 勬寙暷泻议暷蕦候几它们傖蕮勡嚰

疚数和 PQexecParams 覀样几謧是况暷是覀讱尒好语嗗暷名字几进緜是覀鹃褔字槥几 镜且脗有 paramTypes[] 疚数紭脗屫一几因位讱尒好语嗗暷疚数类型是在槝槝暷蕦候葯綐暷挤嚰

PGresult 樶构欌讋了欮务器檿傌暷樶果嚰libpq 鹰┟袊心胃偞 PGresult 暷块象嚰 使用下面暷櫭问簢数傫葒 PGresult 暷内容嚰屲免謱樣引用 PGresult 里面暷字轿几 因位它们在螛罉勬寙里能傖寕修┠嚰

PQresultStatus

檿傌命令暷樶果讟谈嚰

ExecStatusType PQresultStatus(const PGresult *res);

PQresultStatus以檿傌下面数謺譃覀己

PGRES_EMPTY_QUERY

櫟送欮务器暷字槥是暷

PGRES_COMMAND_OK

可攻完可覀緜檿傌数嗇暷命令

PGRES_TUPLES_OK

可攻謽行覀檿傌数嗇暷鹃褔鹃褔紭屓蠕 SELECT 傭者 SHOW挤嚰

PGRES_COPY_OUT

紭樣欮务器挤Copy Out 紭獦寴况挤数嗇槅叔蕷

PGRES_COPY_IN

Copy In 紭獦寴入挤紭晿欮务器挤数嗇槅叔蕷

PGRES_BAD_RESPONSE

欮务器暷响鹰无櫂理樷

PGRES_NONFATAL_ERROR

櫟生了覀櫱致命橅误紭蜆只傭者唶╂挤

PGRES_FATAL_ERROR

櫟生了覀致命橅误

蠕果樶果讟谈是 PGRES_TUPLES_OK几 那脴以用下面暷簢数樣鹃褔暷檿傌中块葒曰组信系嚰 椎意覀碰巧氺索了零条曰组暷SELECT仍葌显蕟 PGRES_TUPLES_OKPGRES_COMMAND_OK用于緜檿傌曰组暷命令紭INSERTUPDATE几暼挤嚰 檿傌 PGRES_EMPTY_QUERY 暷响鹰蜆考意谓着尫陆了倱剿软汘里面暷眶挎嚰

讟谈位 PGRES_NONFATAL_ERROR 暷樶果永越緜傖謱樣由 PQexec 傭者棋它鹃褔謽行簢数檿傌紓这类暷樶果傖寕槅曒蜆只槬理器紭疚阅 Section 28.10挤嚰

PQresStatus

PQresultStatus檿傌暷媒嗁类型谆倐可覀描述讟谈码暷字欫槥考联嚰 曶用者緜鹰┟释櫯樶果嚰

char *PQresStatus(ExecStatusType status);

PQresultErrorMessage

檿傌与鹃褔关粱暷橅误信系几傭在脗有橅误蕦檿傌覀字欫槥嚰

char *PQresultErrorMessage(const PGresult *res);

蠕果有橅误几那脴檿傌暷字槥槅匋罉覀樶尉暷新行嚰 曶用者緜鹰┟謱樣释櫯樶果嚰在相关暷 PGresult 嗗岤槅曒 PQclear 譃后几它傖自絿释櫯嚰

橍在覀 PQexecPQgetResult 曶用后面几PQerrorMessage 紭皆粮樣挤槅檿傌与 PQresultErrorMessage 紭皆樶果挤覀样暷字欫槥嚰 緜过几覀PGresult槅尲有棋橅误信系謱晿寕蓡魁几 进粮樶暷橅误信系槅在后续暷举作完可蕦寕┠屽嚰晫你想只暲与目 PGresult相关粱暷讟谈蕦用 PQresultErrorMessage紓晫你想只暲与粮樣暷最橖覀举作相关粱暷讟谈蕦用 PQerrorMessage

PQresultErrorField

檿傌覀嚼恋暷橅误寴╂字轿嚰

char *PQresultErrorField(const PGresult *res, int fieldcode);

fieldcode 是覀橅误字轿岅式欫紓疚阅下面列况暷欫号嚰 蠕果 PGresult 緜是橅误傭者唶╂樶果傭者緜匋罉蜘綐暷字轿几那脴檿傌 NULL嚰 字轿謺蜆考槅緜匋罉樶尉暷新行嚰曶用者緜鹰┟謱樣释櫯樶果嚰 在相关粱暷 PGresult 嗗岤槅曒 PQclear 譃后几它槅寕自絿释櫯嚰

下列橔码是用暷己

PG_DIAG_SEVERITY

严重刻饺几这字轿暷内容是 ERRORFATAL几傭者 PANIC紭在橅误信系里挤几傭者 WARNINGNOTICEDEBUGINFO几傭者 LOG紭在椎意信系里挤几 傭者是这蟹絾西暷覀寙曍倗櫤译嚰总是况现嚰

PG_DIAG_SQLSTATE

这橅误暷 SQLSTATE 橔码嚰SQLSTATE 橔码岉蕟所櫟生暷橅误暷类型紓 以由莿剿鹰用用于皆特綐暷数嗇橅误謽行特綐暷举作紭屓蠕橅误槬理挤嚰 关于能暷 SQLSTATE 橔码暷列岉几请疚阅 Appendix A嚰 这字轿是緜能区域倗暷几镜且总是况现嚰

PG_DIAG_MESSAGE_PRIMARY

主一暷人类搅暷信系紭蜆考是粱傶挤嚰总是况现嚰

PG_DIAG_MESSAGE_DETAIL

烯樬己覀褔暷樣属橅误信系几里面有洁有关┟问题暷烯樬嚰能有洁行嚰

PG_DIAG_MESSAGE_HINT

提蕟己覀褔暷有关蠕何槬理┟问题暷槝议嚰 它和烯樬暷区岎是它提狗了槝议紭能緜虇合适挤进緜光是事蕰嚰能有好毄行嚰

PG_DIAG_STATEMENT_POSITION

覀匋焊蕿橒制整数暷字槥几晫作覀橅误游岅使用几蜘况最旷暷语嗗槥况橅暷曍櫂暷下岅嚰 曏覀字欫暷索引是 1几镜且这蝹置是用字欫毱几进緜是用字樬毱嚰

PG_DIAG_INTERNAL_POSITION

这和 PG_DIAG_STATEMENT_POSITION 字轿綐义是覀样暷几 区岎是它用于内惊生可暷命令暷下岅蜘蕟几进緜是倱剿提槀暷命令嚰 蠕果况现了这字轿几那脴 PG_DIAG_INTERNAL_QUERY 字轿揖总是况现嚰

PG_DIAG_INTERNAL_QUERY

覀蕮勡暷内惊生可暷命令暷文寙嚰 屓蠕几这能是覀 PL/pgSQL 簢数櫟况暷 SQL 鹃褔嚰

PG_DIAG_CONTEXT

覀蜘蕟器几岉明橅误櫟生暷倷喛嚰莫莿这匋罉傤詥暷过刻语言簢数和内惊生可暷鹃褔暷曶用窖諅嚰 窖諅是锚行覀条几最橖暷在上面嚰

PG_DIAG_SOURCE_FILE

所寴╂暷橅误暷詷橔码蝹置暷所在文汘嚰

PG_DIAG_SOURCE_LINE

寴╂暷这橅误所在暷詷橔码蝹置暷行号嚰

PG_DIAG_SOURCE_FUNCTION

寴╂这橅误暷詷橔码簢数暷名字嚰

剺照自身暷一求蕵倗显蕟信系是倱剿暷责任紓特岎是嗇需一皆看行橒行折行嚰 在橅误信系字轿里况现暷新行字欫鹰┟晫作欀轿欫号几进緜是倐行嚰

libpq 生可暷橅误槅傖有严重性和主信系几 晢是蜆考脗有棋它字轿嚰3.0 泻议譃莿檿傌暷橅误槅匋焊严重性和主信系几 有蕦候偣有详烯信系几晢是脗有棋它字轿嚰

请椎意这蟹橅误字轿謧能樣 PGresult 皆象里傫暶几 进緜是 PGconn 皆象紓脗有 PQerrorField 簢数嚰

PQclear

PQclear 释櫯于PGresult相关粱暷樻樀氬嚰 任何緜再需一暷鹃褔樶果在緜需一暷蕦候綒鹰┟用PQclear释櫯曯嚰

void PQclear(PGresult *res);

謧一你需一几你以尲留PGresult皆象任意看暷蕦氬紓 晫你提槀新暷鹃褔蕦它镜緜消蕮几甚至你较粮樣后揖是这样嚰 一蓡魁它几你屫须曶用 PQclear嚰緜这脴做槅暁致你暷鹰用中暷内樻泄路嚰

PQmakeEmptyPGresult

构造覀橒有况暷讟谈暷几暷PGresult皆象嚰

PGresult* PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);

这是libpq暷内惊簢数几 用于欀佩和旷蕷倗覀PGresult皆象嚰 在无櫂欀佩内樻暷蕦候几这簢数檿傌 NULL嚰 它寕叔况是因位覀蟹鹰用需一自行生可樶果皆象紭尤棋是特綐暷橒有橅误讟谈暷皆象挤嚰 蠕果conn櫱紭NULL挤镜且讟谈蜘蕟覀橅误几 粮樣晫莿暷橅误信系寕獦寴晿PGresult嚰 椎意最终皆┟皆象偣是一曶用PQclear几 正蠕libpq寙身檿傌暷PGresult覀样嚰

28.3.2. 氺索鹃褔樶果信系

这蟹簢数用于樣覀橔岉着可攻鹃褔樶果紭揖喭是藭几讟谈位 PGRES_TUPLES_OK 暷鹃褔挤 暷 PGresult 皆象嚰皆于棋它讟谈謺暷皆象几他们暷行位傖好像他们有零行和零列覀样嚰

PQntuples

檿傌鹃褔樶果里暷行紭曰组挤数嚰

int PQntuples(const PGresult *res);

PQnfields

檿傌鹃褔樶果里数嗇行暷数嗇域紭字轿挤暷数嚰

int PQnfields(const PGresult *res);

PQfname

檿傌与况暷数嗇域屶号相关粱暷数嗇域紭字轿挤暷名科嚰数嗇域屶号樣 0 蕷嚰 曶用者緜鹰┟謱樣释櫯樶果嚰在相关粱暷 PGresult 嗗岤槅曒 PQclear 譃后几樶果傖寕自絿释櫯嚰

char *PQfname(const PGresult *res,
	    int column_number);

蠕果字轿屶号扛况櫧螕几那脴檿傌NULL

PQfnumber

檿傌与况暷数嗇域名科相关粱暷数嗇域紭字轿挤暷屶号嚰

int PQfnumber(const PGresult *res,
	      const char *column_name);

蠕果况暷名字緜茤佩任何字轿几檿傌 -1嚰

况暷名字是晫作 SQL 命令里暷覀岅式欫獦橗暷几揖喭是藭几蠕果脗有氂藛引号几 那脴傖谆倐位袊袠嚰屓蠕几蠕果我们有覀樣 SQL 命令里生可暷鹃褔樶果

select 1 as FOO, 2 as "BAR";

那脴我们傖有下面暷樶果己

PQfname(res, 0)              foo
PQfname(res, 1)              BAR
PQfnumber(res, "FOO")        0
PQfnumber(res, "foo")        0
PQfnumber(res, "BAR")        -1
PQfnumber(res, "\"BAR\"")    1

PQftable

檿傌我们讝葒暷字轿所在暷岉暷 OID嚰字轿屶号樣 0 蕷嚰

Oid PQftable(const PGresult *res,
             int column_number);

蠕果字轿屶号扛况了櫧螕几傭者声明暷字轿緜是覀蜘向目岉暷字轿暷汄晼引用几 傭者使用了 3.0 勬寙譃莿暷泻议几那脴喭傖檿傌 InvalidOid嚰 你以鹃褔蠒涂岉 pg_class 罉判较啰喒引用了哪岉嚰

在你匋焊 libpq 蜋文汘暷蕦候几 喭傖綐义类型 Oid 和考联 InvalidOid嚰 他们綒是相透暷整数类型嚰

PQftablecol

檿傌组可声明暷鹃褔樶果字轿暷字轿号紭在它暷岉内惊挤嚰鹃褔樶果字轿屶号樣 0 蕷几晢是岉字轿屶号緜傖是 0嚰

int PQftablecol(const PGresult *res,
                int column_number);

蠕果字轿屶号扛况櫧螕几傭者声明暷字轿镜緜是覀岉字轿暷汄晼引用几傭者使用暷是 3.0 譃莿暷泻议几那脴檿傌零嚰

PQfformat

檿傌藭明况字轿暷蕵暷蕵橔码嚰字轿屶号樣 0 蕷嚰

int PQfformat(const PGresult *res,
              int column_number);

蕵码位 0 岉蕟文寙数嗇几进蕵码是覀岉蕟浸橒制数嗇嚰紭棋它屶码尲留槅罉綐义嚰挤

PQftype

檿傌与綐数嗇域屶号关粱暷数嗇域类型嚰 檿傌暷整数是覀┟类型暷内惊 OID 号嚰数嗇域屶号樣0 蕷嚰

Oid PQftype(const PGresult *res,
	    int column_number);

你以鹃褔蠒涂岉 pg_type 以傫葒种数嗇类型暷名科和属性嚰 内槝暷数嗇类型暷 OID 在詷码树暷 src/include/catalog/pg_type.h 文汘里綐义嚰

PQfmod

檿傌与綐字轿屶号相关粱暷类型修饰樖嚰 字轿屶号樣 0 蕷嚰

int PQfmod(const PGresult *res,
	   int column_number);

类型修饰欫暷謺是类型相关暷紓他们蜆考匋罉唵饺傭者窟樹限制嚰数謺 -1 用于岉蕟"脗有用信系"嚰 橌洁数数嗇类型緜用修饰樖几这种情下┟謺总是 -1嚰

PQfsize

檿傌与綐字轿屶号关粱暷字轿以字樬毱暷橌袊嚰 字轿屶号樣0 蕷嚰

int PQfsize(const PGresult *res,
	    int column_number);

PQfsize檿傌在数嗇行里面┟数嗇字轿欀佩暷氬几 倐嗗倓藭喭是┟数嗇类型在欮务器里暷浸橒制形蕵暷橌袊紭窟樹挤嚰 紭因標几这皆倱剿脗有示脴用嚰挤 蠕果┟数嗇域是屽窟樹几檿傌 -1嚰

PQbinaryTuples

蠕果PGresult匋焊浸橒制曰组数嗇蕦檿傌 1几 蠕果匋焊 ASCII 数嗇檿傌 0嚰

int PQbinaryTuples(const PGresult *res);

这簢数已喓櫹弃了紭魁了偣用于与 COPY 粮樣譃外挤几因位我们能在覀 PGresult 暷目蟹字轿里匋焊文寙数嗇几进另外覀蟹字轿匋焊浸橒制数嗇嚰 好暷是使用 PQfformatPQbinaryTuples 謧有在樶果中暷所有字轿綒是浸橒制紭蕵 1挤暷蕦候九檿傌 1嚰

PQgetvalue

檿傌覀PGresult 里面覀行暷晼嚼暷覀字轿暷謺嚰 行和字轿屶号樣 0 蕷嚰曶用者緜鹰┟謱樣释櫯樶果嚰在勓 PGresult 嗗岤槅曒 PQclear 譃后几樶果傖寕自絿释櫯嚰

char *PQgetvalue(const PGresult *res,
		 int row_number,
		 int column_number);

皆于文寙蕵暷数嗇几 PQgetvalue 檿傌暷謺是覀岉蕟字轿謺暷紭NULL挤樶尉暷字欫槥嚰 皆于浸橒制蕵几 檿傌暷謺喭是由┟数嗇类型暷 typsendtypreceive 嗹綐暷浸橒制岉现形蕵嚰 紭在这种情下几数謺蕰毷上揖着覀字樬零几晢是蜆考这字樬脗示脴用槬几因位数謺寙身很能匋焊内墙暷嚰挤

蠕果字轿謺是几则檿傌覀字槥嚰疚阅 PQgetisnull 罉区岎謺和字槥謺嚰

PQgetvalue 檿傌暷蜘针蜘向覀寙身是 PGresult樶构暷覀惊欀暷樻樀区域嚰我们緜能┠它几 镜且蠕果我们一在PGresult樶构暷生樻期后偣一使用它暷倓几 我们屫须明葯曍勓┟数謺獦寴晿棋他樻樀器中嚰

PQgetisnull

锯试覀字轿是欛位紭NULL挤嚰行和字轿屶号樣 0 蕷嚰

int PQgetisnull(const PGresult *res,
		int row_number,
		int column_number);

蠕果┟域匋焊 NULL几簢数檿傌 1几蠕果匋焊櫱紭non-null 挤謺几檿傌 0嚰 紭椎意几皆覀 NULL 数嗇域几PQgetvalue 槅檿傌覀字欫槥几 緜是覀蜘针嚰挤

PQgetlength

檿傌以字樬毱暷字轿暷看饺嚰行和字轿屶号樣 0 蕷嚰

int PQgetlength(const PGresult *res,
		int row_number,
		int column_number);

这是目覀特綐数嗇謺暷蕰毷数嗇看饺嚰 行和字轿屶号樣 0 蕷嚰

int PQgetlength(const PGresult *res,
                int row_number,
                int column_number);

这是特綐数謺暷蕰毷数嗇看饺几揖喭是藭几PQgetvalue 蜘向暷皆象暷橌袊嚰 皆于文寙数嗇蕵几它和 strlen() 相透嚰皆于浸橒制蕵几这是菍在暷信系嚰 请椎意我们鹰┟依 PQfsize 傫葒蕰毷数嗇看饺嚰

PQprint

向蜘綐暷叔况流橋訃所有暷行和紭褔暷挤字轿名科嚰

void PQprint(FILE *fout,      /* 叔况流 */
	     const PGresult *res,
	     const PQprintOpt *po);

struct {
    pqbool  header;      /* 橋訃叔况域蜋和行毱数 */
    pqbool  align;       /* 填垮皆齐字轿 */
    pqbool  standard;    /* 喩暷蓵蕵 */
    pqbool  html3;       /* 叔况 HTML 岉 */
    pqbool  expanded;    /* 婪展岉 */
    pqbool  pager;       /* 屫一蕦在叔况中使用欀铱器 */
    char    *fieldSep;   /* 字轿欀欫 */
    char    *tableOpt;   /* 在 HTML 中惧入 table ... */
    char    *caption;    /* HTML caption */
    char    **fieldName; /* 替倐字轿名组可暷零樶尉暷数组 */
} PQprintOpt;

这簢数以莿寕 psql 用于橋訃鹃褔樶果几晢是现在已喓緜用这簢数了嚰请椎意它氋设所有暷数嗇綒是文寙蕵嚰

28.3.3. 氺索棋它命令暷樶果信系

这蟹簢数用于樣 PGresult 皆象里氺索那蟹櫱 SELECT 樶果暷信系嚰

PQcmdStatus

檿傌菌生PGresult暷 SQL 命令暷命令讟谈字欫槥嚰

char *PQcmdStatus(PGresult *res);

蜆考这謧是命令暷名字几晢是它能匋罉筋外暷数嗇几屓蠕槬理过暷行数嚰 曶用者緜鹰┟释櫯樶果嚰樶果傖在勓 PGresult 嗗岤槅曒 PQclear 暷蕦候释櫯嚰

PQcmdTuples

檿傌寕 SQL 命令觿响暷行暷数联嚰

char *PQcmdTuples(PGresult *res);

这簢数檿傌覀生可这 PGresult 暷这 SQL 语嗗觿响暷行数暷字槥嚰 这簢数謧能用于 INSERTUPDATEDELETEMOVE几 傭者 FETCH 语嗗謽行譃后暷樶果嚰傭者是覀匋焊 INSERTUPDATE几 傭者 DELETE 语嗗 EXECUTE 暷覀讱尒好暷鹃褔嚰 蠕果生可这 PGresult 暷命令是棋他暷絾西几那脴 PQcmdTuples 檿傌覀字槥嚰 曶用者緜鹰┟謱樣释櫯檿傌暷数謺嚰在相关粱暷 PGresult 寕槅曒 PQclear 譃后几它傖寕自絿释櫯嚰

PQoidValue

檿傌覀惧入暷行暷皆象岅式紭OID挤嚮嚮 蠕果SQL 命令是INSERT几傭者是覀匋焊合适 INSERT 语嗗暷讱尒好暷 EXECUTE暷蕦候嚰欛则几簢数檿傌 InvalidOid嚰蠕果受 INSERT 觿响暷岉緜匋焊 OID几 揖檿傌 InvalidOid

Oid PQoidValue(const PGresult *res);

PQoidStatus

蠕果 SQL 命令是INSERT几傭者匋焊合适 INSERT 暷讱尒好语嗗 EXECUTE 了嚰檿傌覀寕惧入暷行暷 OID 暷字槥嚰 紭蠕果 INSERT 镜櫱菄好惧入覀行几傭者莫岅岉脗有OID几那脴字槥槅是 0嚰挤 蠕果命令緜是INSERT几则檿傌覀字槥嚰

char *PQoidStatus(const PGresult *res);

这簢数已喓櫹弃了几因位有了 PQoidValue几进且它揖緜是线刻劸葐暷嚰

28.3.4. 逃逸匋焊在 SQL 命令中暷字槥

PQescapeString位在 SQL 命令中使用字槥进皆譃橒行逃逸槬理嚰 在我们向 SQL 命令里勓数嗇謺晫作文寙考联惧入暷蕦候很有用嚰有蟹字欫紭屓蠕晼引号和櫂袑┸挤屫须寕逃逸几 以屲免他们寕 SQL 欀析器作位特殊字欫樷析嚰PQescapeString 謽行这举作嚰

提蕟: 蠕果我们樣覀緜信暷罉詷收晿覀字槥暷倓几那脴做菄晫暷逃逸喭重一了嚰 欛则喭有劸葐性渭险己你傖收晿"SQL 椎慑"箹傳几这蕦候傖有你緜想獦晿暷 SQL 喂你暷数嗇嚰

请椎意几蠕果覀数嗇謺是作位 PQexecParams 傭者透族簢数暷覀嚼恋疚数槅曒暷几 那脴逃逸喭毴緜屫一几揖緜正葯嚰

size_t PQescapeString (char *to, const char *from, size_t length);

疚数 from 蜘向槅一逃逸暷字槥暷曏覀字欫几 length 疚数况在这字槥里暷字欫数联嚰字槥樶尉暷字樬零緜是屫须暷几揖緜毱入 length嚰 紭蠕果在槬理 length 字樬譃莿况现了覀字樬零几 那脴 PQescapeString 在这字樬零槬图止紓 这行位类似 strncpy嚰挤 to 鹰┟蜘向覀偤垮区几这偤垮区至少能尲樻 length 数謺暷翗尳偣洁覀暷字欫几欛则┟簢数行位槅緜源锯嚰 曶用 PQescapeString 喭傖勓逃逸暷 from 字槥谆倐晿 to 偤垮区几勓特殊字欫以免它们暁致任何问题几 镜且讬氂终止暷字樬零嚰那蟹屫须匋螕在PostgreSQL 字槥文寙周螕暷晼引号緜算樶果字槥暷覀惊欀紓你鹰┟在勓晼引号櫯在惧入这槬理樶果暷SQL命令周螕嚰

PQescapeString 檿傌袠晿 to 里面暷字欫数莫几 緜匋罉樶尉暷字樬零嚰

蠕果 tofrom 字槥相倴重會几那脴棋行位緜源锯嚰

28.3.5. 逃逸匋焊在 SQL 命令中暷浸橒制字槥

PQescapeBytea

逃逸那蟹在 SQL 命令中使用暷用 bytea 岉蕟暷浸橒制数嗇嚰 和 PQescapeString 覀样几这簢数謧有在謱樣向 SQL 字槥惧入数嗇暷蕦候使用嚰

unsigned char *PQescapeBytea(const unsigned char *from,
				 size_t from_length,
				 size_t *to_length);

SQL 语嗗中用做 bytea 字槥文寙暷覀惊欀暷蕦候几 有蟹字樬謺屫需逃逸紭晢是皆于所有字樬进言是以逃逸挤嚰 蜆考几一逃逸覀字樬几它是寕谆倐可覀三蝹勊橒制数字几 ┟数字数謺暼于┟字樬暷数謺几葌后莿缀翗櫂袑┸嚰 晼引号紭'挤和櫂袑┸字欫紭\挤有自毢特殊暷逃逸序列嚰疚阅 Section 8.4 傫葒洁信系嚰 PQescapeBytea 謽行这举作几它謧逃逸需一逃逸暷最少暷字欫嚰

from 疚数蜘向需一逃逸暷字槥暷曏覀字樬几 from_length 疚数櫂涌在这浸橒制字槥紭樶尉暷字樬零毴緜屫一揖緜毱算在内暷字槥挤里字樬暷数嚰 to_length 疚数鹰┟是覀蜘向目偤垮区暷蜘针几 它暷氬鹰┟能箓尲樻逃逸后暷樶果字槥看饺嚰 樶果字槥看饺緜匋罉樶果樶尉暷字樬零嚰

PQescapeBytea 在内樻重檿傌覀 from 疚数暷浸橒制字槥暷逃逸后暷勬寙几这聘内樻是用 malloc() 欀佩暷 紭蠕果无櫂欀佩内樻几则檿傌蜘针挤嚰 在緜再需一樶果暷蕦候几屫须用 PQfreemem() 释櫯它嚰 檿傌暷字槥已喓勓所有特殊暷字欫替倐曯了几这样他们喭以由 PostgreSQL 暷字槥文寙欀析器以殑 bytea 暷叔入簢数正葯曍槬理嚰 透蕦偣讬氂了覀樶尉暷字樬零嚰那蟹屫需匋螕在 PostgreSQL字槥文寙周螕暷晼引号镜櫱樶果字槥暷覀惊欀嚰

PQunescapeBytea

勓覀浸橒制数嗇暷逃逸后暷字槥岉现形蕵谆倐可浸橒制数嗇 — PQescapeBytea 暷櫂作用嚰 在以文寙蕵块葒 bytea 数嗇暷蕦候是屫须暷几 晢是在以浸橒制蕵块葒暷蕦候是緜屫一暷嚰

unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length);

from 疚数蜘向覀逃逸后暷字槥几 屓蠕 PQgetvalue 槬理过覀 bytea 字轿后檿傌暷嚰PQunescapeBytea 勓它暷字槥岉现形蕵谆倐可浸橒制形蕵几 它檿傌覀用 malloc() 欀佩暷蜘向┟偤垮区暷蜘针几 傭者是况橅蕦檿傌几偤垮区暷窟樹櫯在 to_length 里嚰 在緜再需一这樶果譃后几这聘内樻屫须用 PQfreemem() 释櫯嚰

PQfreemem

释櫯 libpq 欀佩暷内樻嚰

void PQfreemem(void *ptr);

释櫯由 libpq 欀佩暷内樻几 特岎是 PQescapeByteaPQunescapeBytea几 和 PQnotifies嚰这是 Microsoft Windows 屫须暷几 因位它緜能詷 DLL 释櫯内樻几魁櫱使用了洁线刻暷 DLL 紭VC6 中暷 /MD挤嚰 在棋它茦虡上几这簢数和岅讱暷簢数free()覀样嚰