postgres (8.3), используя результат запроса в функции - PullRequest
1 голос
/ 30 сентября 2010

Я пытаюсь создать функцию для заполнения 2 таблиц, второй запрос содержит новый идентификатор из первой вставки.

пример некоторых моих таблиц:

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_get для получения только что созданного 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');

1 Ответ

1 голос
/ 01 октября 2010

У вас есть несколько мест, где ваше использование 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 имеют совершенно разные представления о типах.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...