SPI_execute
SPI_execute â вÑполниÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
СинÑакÑиÑ
int SPI_execute(const char *command, boolread_only, longcount)
ÐпиÑание
SPI_execute вÑполнÑÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑÑок в колиÑеÑÑве, огÑаниÑенном count. С паÑамеÑÑом read_only, ÑавнÑм true, команда должна ÑолÑко ÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе; ÑÑо неÑколÑко ÑокÑаÑÐ°ÐµÑ Ð¸Ð·Ð´ÐµÑжки на ÐµÑ Ð²Ñполнение.
ÐÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзÑваÑÑ ÑолÑко из подклÑÑÑнной ÑÑнкÑии на C.
ÐÑли count Ñавен 0, команда вÑполнÑеÑÑÑ Ð´Ð»Ñ Ð²ÑеÑ
ÑÑÑок, к коÑоÑÑм она пÑименима. ÐÑли count болÑÑе нÑлÑ, бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑено не более Ñем count ÑÑÑок; вÑполнение ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¾ÑÑановиÑÑÑ Ð¿Ñи доÑÑижении ÑÑого пÑедела, пÑакÑиÑеÑки Ñак же, как и Ñ Ð¿Ñедложением LIMIT в запÑоÑе. ÐапÑимеÑ, команда:
SPI_execute("SELECT * FROM foo", true, 5);полÑÑÐ¸Ñ Ð¸Ð· ÑаблиÑÑ Ð½Ðµ более 5 ÑÑÑок. ÐамеÑÑÑе, ÑÑо ÑÑо огÑаниÑение дейÑÑвÑеÑ, ÑолÑко когда команда дейÑÑвиÑелÑно возвÑаÑÐ°ÐµÑ ÑÑÑоки. ÐапÑимеÑ, ÑÑа команда:
SPI_execute("INSERT INTO foo SELECT * FROM bar", false, 5); вÑÑавлÑÐµÑ Ð²Ñе ÑÑÑоки из bar, игноÑиÑÑÑ Ð¿Ð°ÑамеÑÑ count. Ðднако команда
SPI_execute("INSERT INTO foo SELECT * FROM bar RETURNING *", false, 5); вÑÑÐ°Ð²Ð¸Ñ Ð½Ðµ более 5 ÑÑÑок, Ñак как ÐµÑ Ð²Ñполнение бÑÐ´ÐµÑ Ð¾ÑÑановлено поÑле полÑÑÐµÐ½Ð¸Ñ Ð¿ÑÑой ÑÑÑоки, вÑданной пÑедложением RETURNING.
Родной ÑÑÑоке можно пеÑедаÑÑ Ð½ÐµÑколÑко команд; SPI_execute возвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, вÑполненной поÑледней. ÐаÑамеÑÑ count пÑи ÑÑом бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ðº каждой команде по оÑделÑноÑÑи (неÑмоÑÑÑ Ð´Ð°Ð¶Ðµ на Ñо, ÑÑо возвÑаÑÑн бÑÐ´ÐµÑ ÑолÑко поÑледний ÑезÑлÑÑаÑ). ÐÑо огÑаниÑение не бÑÐ´ÐµÑ ÑаÑпÑоÑÑÑанÑÑÑÑÑ Ð½Ð° ÑкÑÑÑÑе командÑ, генеÑиÑÑемÑе пÑавилами.
Ðогда паÑамеÑÑ read_only Ñавен false, SPI_execute ÑвелиÑÐ¸Ð²Ð°ÐµÑ ÑÑÑÑÑик команд и полÑÑÐ°ÐµÑ Ð½Ð¾Ð²Ñй Ñнимок пеÑед вÑполнением каждой оÑеÑедной ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² ÑÑÑоке. ÐÑÐ¾Ñ Ñнимок ÑакÑиÑеÑки не менÑеÑÑÑ Ð¿Ñи ÑекÑÑем ÑÑовне изолÑÑии ÑÑанзакÑий SERIALIZABLE или REPEATABLE READ, но в Ñежиме READ COMMITTED поÑле Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñнимка оÑеÑÐµÐ´Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¸Ð´ÐµÑÑ ÑезÑлÑÑаÑÑ ÑолÑко ÑÑо заÑикÑиÑованнÑÑ
ÑÑанзакÑий из дÑÑгиÑ
ÑеанÑов. ÐÑо важно Ð´Ð»Ñ ÑоглаÑованного поведениÑ, когда ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼Ð¾Ð´Ð¸ÑиÑиÑÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
Ðогда паÑамеÑÑ read_only Ñавен true, SPI_execute не обновлÑÐµÑ Ñнимок и не ÑвелиÑÐ¸Ð²Ð°ÐµÑ ÑÑÑÑÑик команд, и допÑÑÐºÐ°ÐµÑ Ð² ÑÑÑоке команд ÑолÑко SELECT. ÐаданнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð²ÑполнÑÑÑÑÑ Ñо Ñнимком, Ñанее полÑÑеннÑм Ð´Ð»Ñ Ð¾ÐºÑÑжаÑÑего запÑоÑа. ÐÑÐ¾Ñ Ñежим вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÑколÑко бÑÑÑÑее Ñежима ÑÑениÑ/запиÑи вÑледÑÑвие иÑклÑÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð´ÐµÑжек, ÑвÑзаннÑÑ
Ñ Ð¾ÑделÑнÑми командами. Ðн Ñакже позволÑÐµÑ ÑоздаваÑÑ Ð¿Ð¾Ð´Ð»Ð¸Ð½Ð½Ð¾ ÑÑабилÑнÑе ÑÑнкÑии: Ñак как поÑледÑÑÑие вÑÐ·Ð¾Ð²Ñ Ð² ÑÑанзакÑии бÑдÑÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð´Ð¸Ð½ Ñнимок, ÑезÑлÑÑаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ не изменÑÑÑÑ.
СмеÑиваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, ÑолÑко ÑиÑаÑÑие, Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸, ÑиÑаÑÑими и пиÑÑÑими, в одной пÑоÑедÑÑе, иÑполÑзÑÑÑей SPI, обÑÑно неÑазÑмно; запÑоÑÑ ÑолÑко на ÑÑение не ÑвидÑÑ ÑезÑлÑÑаÑов изменений в базе даннÑÑ , пÑоизведÑннÑÑ Ð¿Ð¸ÑÑÑими запÑоÑами.
ЧиÑло ÑÑÑок, коÑоÑÑе бÑли ÑакÑиÑеÑки обÑабоÑÐ°Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ (поÑледней), возвÑаÑаеÑÑÑ Ð² глобалÑной пеÑеменной SPI_processed. ÐÑли ÑÑа ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение SPI_OK_SELECT, SPI_OK_INSERT_RETURNING, SPI_OK_DELETE_RETURNING или SPI_OK_UPDATE_RETURNING, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе обÑаÑиÑÑÑÑ Ð¿Ð¾ глобалÑÐ½Ð¾Ð¼Ñ ÑказаÑÐµÐ»Ñ SPITupleTable *SPI_tuptable и пÑоÑиÑаÑÑ ÑÑÑоки ÑезÑлÑÑаÑа. ÐекоÑоÑÑе ÑлÑжебнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (напÑимеÑ, EXPLAIN) Ñакже возвÑаÑаÑÑ Ð½Ð°Ð±Ð¾ÑÑ ÑÑÑок, и SPI_tuptable бÑÐ´ÐµÑ ÑодеÑжаÑÑ Ð¸Ñ
ÑезÑлÑÑаÑÑ Ð¸ в ÑÑиÑ
ÑлÑÑаÑÑ
. ÐÑÑгие вÑпомогаÑелÑнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (COPY, CREATE TABLE AS) не возвÑаÑаÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, Ñак ÑÑо ÑказаÑÐµÐ»Ñ SPI_tuptable Ñавен NULL, но они Ñак же возвÑаÑаÑÑ ÑиÑло обÑабоÑаннÑÑ
ÑÑÑок в SPI_processed.
СÑÑÑкÑÑÑа SPITupleTable опÑеделена Ñак:
typedef struct
{
MemoryContext tuptabcxt; /* конÑекÑÑ ÑаблиÑÑ ÑезÑлÑÑаÑов в памÑÑи */
uint64 alloced; /* ÑиÑло заÑезеÑвиÑованнÑÑ
в памÑÑи знаÑений */
uint64 free; /* ÑиÑло ÑвободнÑÑ
знаÑений */
TupleDesc tupdesc; /* деÑкÑипÑÐ¾Ñ ÑÑÑоки */
HeapTuple *vals; /* даннÑе ÑÑÑок */
} SPITupleTable;vals пÑедÑÑавлÑÐµÑ Ñобой маÑÑив ÑказаÑелей на ÑÑÑоки. (ЧиÑло запиÑей в нÑм ÑказÑваеÑÑÑ Ð² SPI_processed.) Ðоле tupdesc ÑодеÑÐ¶Ð¸Ñ Ð´ÐµÑкÑипÑÐ¾Ñ ÑÑÑоки, коÑоÑÑй Ð²Ñ ÑможеÑе пеÑедаÑÑ ÑÑнкÑиÑм SPI, ÑабоÑаÑÑими Ñо ÑÑÑоками. ÐÐ¾Ð»Ñ tuptabcxt, alloced и free пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð²Ð½ÑÑÑеннего иÑполÑзованиÑ, а не Ð´Ð»Ñ Ð¿ÑоÑедÑÑ, ÑабоÑаÑÑиÑ
Ñ SPI.
SPI_finish оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð²Ñе ÑÑÑÑкÑÑÑÑ SPITupleTable, ÑазмеÑÑннÑе в памÑÑи Ð´Ð»Ñ ÑекÑÑей ÑÑнкÑии на C. ÐÑ Ð¼Ð¾Ð¶ÐµÑе оÑвободиÑÑ ÑÑÑÑкÑÑÑÑ ÐºÐ¾Ð½ÐºÑеÑной ÑезÑлÑÑиÑÑÑÑей ÑаблиÑÑ, еÑли она вам не нÑжна, вÑзвав SPI_freetuptable.
ÐÑгÑменÑÑ
const char *commandÑÑÑока Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹, коÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ Ð²Ñполнена
boolread_onlytrueÐ´Ð»Ñ Ñежима вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Â«ÑолÑко ÑÑение»longcountмакÑималÑное ÑиÑло ÑÑÑок, коÑоÑое должно бÑÑÑ Ð²Ð¾Ð·Ð²ÑаÑено; Ñ
0огÑаниÑÐµÐ½Ð¸Ñ Ð½ÐµÑ
ÐозвÑаÑаемое знаÑение
ÐÑли команда бÑла вÑполнена ÑÑпеÑно, возвÑаÑаеÑÑÑ Ð¾Ð´Ð½Ð¾ из ÑледÑÑÑÐ¸Ñ (неоÑÑиÑаÑелÑнÑÑ ) знаÑений:
SPI_OK_SELECTеÑли вÑполнÑлаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
SELECT(но неSELECT INTO)SPI_OK_SELINTOеÑли вÑполнÑлаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
SELECT INTOSPI_OK_INSERTеÑли вÑполнÑлаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
INSERTSPI_OK_DELETEеÑли вÑполнÑлаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
DELETESPI_OK_UPDATEеÑли вÑполнÑлаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
UPDATESPI_OK_INSERT_RETURNINGеÑли вÑполнÑлаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
INSERT RETURNINGSPI_OK_DELETE_RETURNINGеÑли вÑполнÑлаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
DELETE RETURNINGSPI_OK_UPDATE_RETURNINGеÑли вÑполнÑлаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°
UPDATE RETURNINGSPI_OK_UTILITYеÑли вÑполнÑлаÑÑ ÑлÑÐ¶ÐµÐ±Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° (напÑимеÑ,
CREATE TABLE)SPI_OK_REWRITTENеÑли команда бÑла пÑеобÑазована пÑавилом в ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´ÑÑгого вида (напÑимеÑ,
UPDATEÑÑал командойINSERT).
Ð ÑлÑÑае оÑибки возвÑаÑаеÑÑÑ Ð¾Ð´Ð½Ð¾ из ÑледÑÑÑÐ¸Ñ Ð¾ÑÑиÑаÑелÑнÑÑ Ð·Ð½Ð°Ñений:
SPI_ERROR_ARGUMENTеÑли в каÑеÑÑве
commandпеÑеданNULLилиcountменÑÑе 0SPI_ERROR_COPYпÑи попÑÑке вÑполниÑÑ
COPY TO stdoutилиCOPY FROM stdinSPI_ERROR_TRANSACTIONпÑи попÑÑке вÑполниÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑанзакÑиÑми (
BEGIN,COMMIT,ROLLBACK,SAVEPOINT,PREPARE TRANSACTION,COMMIT PREPARED,ROLLBACK PREPAREDили лÑбÑÑ Ð¸Ñ Ð²Ð°ÑиаÑиÑ)SPI_ERROR_OPUNKNOWNеÑли Ñип ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑен (Ñакого бÑÑÑ Ð½Ðµ должно)
SPI_ERROR_UNCONNECTEDеÑли вÑзÑваеÑÑÑ Ð¸Ð· неподклÑÑÑнной ÑÑнкÑии на C
ÐамеÑаниÑ
ÐÑе ÑÑнкÑии SPI, вÑполнÑÑÑие запÑоÑÑ, заполнÑÑÑ Ð¸ SPI_processed, и SPI_tuptable (ÑолÑко ÑказаÑелÑ, но не ÑодеÑжимое ÑÑÑÑкÑÑÑÑ). СоÑ
ÑаниÑе ÑÑи две глобалÑнÑе пеÑеменнÑе в локалÑнÑÑ
пеÑеменнÑÑ
ÑÑнкÑии на C, еÑли Ñ
оÑиÑе обÑаÑаÑÑÑÑ Ðº ÑаблиÑе ÑезÑлÑÑаÑа SPI_execute или дÑÑгой ÑÑнкÑии, вÑполнÑÑÑей запÑоÑ, в неÑколÑкиÑ
вÑзоваÑ
пÑоÑедÑÑÑ.