我正在尝试创建一个函数来填充2个表,第二个查询包含第一个插入的新id。
我的一些表的一个例子:
CREATE TABLE message
(
message_id bigserial NOT NULL,
member_id bigint NOT NULL,
message character varying(8192) NOT NULL,
...
)
CREATE TABLE feed_message
(
feed_id bigint NOT NULL,
message_id bigint NOT NULL
)
我要做的是在消息表中插入一条新消息,并使用生成的message_id填充feed_message表
我尝试使用pltcl语言编写函数,但我无法弄清楚如何使用SPI_getvalue来获取刚创建的tupil
这是我到目前为止所做的:
/* message_post(entity, id, member_id, title, message, reactionTo) */
CREATE OR REPLACE FUNCTION message_post ()
RETURNS VOID
LANGUAGE pltcl
AS $BODY$
ret_status = spi_exec -count 1 "INSERT INTO message (member_id, title, message) VALUES ($3, $4, $5)"
IF (ret_status == SPI_OK_SELECT && SPI_processed > 0) {
//get the tupil from *SPI_tuptable
set message_id <the new message_id>
}
spi_exec -count 1 "INSERT INTO $1_message ($1_id, message_id) VALUES ($2,$message_id)"
$BODY$;
/* useage */
SELECT message_post('feed',12,1,'title','message');
答案 0 :(得分:1)
你有几个地方你的Tcl usage(PL / Tcl可以被认为是方言,包装)是完全错误的。我猜这是正确的,基于examples in the PL/Tcl documentation。
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;
需要注意的其他事项:我认为您正在寻找找到消息ID的spi_lastoid
,而我实际上并没有检查过您的SQL是否正确。另外,我可能有各种错误的参数类型。 (PostgreSQL和Tcl对于什么类型有不同的看法。)