У вас есть несколько мест, где ваше использование Tcl (PL / Tcl можно считать диалектом, с переносом) просто неправильно. Я предполагаю, что это правильно, основываясь на примерах в документации PL / Tcl .
CREATE OR REPLACE FUNCTION message_post(text,integer,integer,text,text)
RETURNS VOID AS $$
set ret_status [spi_exec -count 1 \
"INSERT INTO message (member_id, title, message) \
VALUES ($3, '[quote $4]', '[quote $5]')"]
if {$ret_status > 0} {
set message_id [spi_lastoid]
spi_exec -count 1 "INSERT INTO ${1}_message (${1}_id, message_id) \
VALUES ($2, $message_id)"
}
$$ LANGUAGE pltcl;
Однако я не считаю это идиоматическим! В конце концов, это делает quote
и другие подобные вещи. Насколько я понимаю, так лучше:
CREATE OR REPLACE FUNCTION message_post(text,integer,integer,text,text)
RETURNS VOID AS $$
# Precompile the INSERTs if they didn't already exist
if {![info exists GD(post_message_plan)]} {
set GD(post_message_plan) [spi_prepare \
{INSERT INTO message (member_id, title, message) VALUES ($1, $2, $3)} \
{integer text text}]
}
if {![info exists GD(assoc_message_plan:$1)]} {
set GD(assoc_message_plan:$1) [spi_prepare \
"INSERT INTO ${1}_message (${1}_id, message_id) VALUES (\$1, \$2)" \
{integer integer}]
}
# Run the pair of INSERTs
if {[spi_execp -count 1 $GD(post_message_plan) [list $3 $4 $5]] > 0} {
spi_execp -count 1 $GD(assoc_message_plan:$1) [list $2 [spi_lastoid]]
}
$$ LANGUAGE pltcl;
Другие замечания: я считаю, что spi_lastoid
вы ищете для поиска идентификатора сообщения, и я на самом деле не проверял, верен ли ваш SQL. Кроме того, у меня могут быть типы аргументов для различных вещей неправильно. (PostgreSQL и Tcl имеют совершенно разные представления о типах.)