代码之家  ›  专栏  ›  技术社区  ›  Paul Scheltema

postgres(8.3),在函数中使用查询结果

  •  1
  • Paul Scheltema  · 技术社区  · 15 年前

    我试图创建一个函数来填充两个表,第二个查询包含第一次插入的新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表中插入一条新消息,并使用生成的message\u id填充feed\u message表

    到目前为止,我的情况是:

    /* 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 回复  |  直到 15 年前
        1
  •  1
  •   Donal Fellows    15 年前

    你有几个地方 Tcl usage 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;
    

    其他需要注意的事情:我相信是的 spi_lastoid