【问题标题】:Unable to resolve error in PL/pgSQL with SELECT INTO无法使用 SELECT INTO 解决 PL/pgSQL 中的错误
【发布时间】:2022-01-18 06:17:03
【问题描述】:

我似乎无法使用存储过程解决此错误。该代码在程序之外可以正常工作,但是当我将其保存到我收到的程序时

Error "join_table" is not a known variable
Line 14: INTO join_table

如果我删除该行,一切都会完美运行。感谢任何建议或帮助。这个想法是让过程截断主要的 2 个表,删除并基于触发器重新创建 join_table 以刷新所有数据。

CREATE OR REPLACE PROCEDURE rental_refresh()
LANGUAGE plpgsql
AS $$
BEGIN
TRUNCATE new_table;
TRUNCATE ts_30;
DROP TABLE join_table;

INSERT INTO new_table (c1, c2, c3,c4,c5)
SELECT c1, c2, c3, c4,c5
FROM other_table;

SELECT r.c1,r.c2,cr.c1,cr.c2,cr.c3,cr.c4,cr.sc5
INTO join_table
FROM new_table cr
INNER JOIN r_table r ON cr.c1=r.r1;
END; $$

【问题讨论】:

    标签: sql postgresql stored-procedures plpgsql


    【解决方案1】:

    使用CREATE TABLE AS。永远不要使用 SQL 的SELECT INTO。 Postgres 在 SQL 中支持它,因为它(不幸地)仍然是标准 SQL 的一部分,但官方不鼓励使用它。阅读notes in the manual。

    在 PL/pgSQL 中,SELECT INTO 用于分配变量,因此您的错误消息。

    见:

    也就是说,您的PROCEDURE 不必使用 PL/pgSQL。可以是纯 SQL:

    CREATE OR REPLACE PROCEDURE rental_refresh()
      LANGUAGE sql AS
    $proc$
    TRUNCATE new_table;
    TRUNCATE ts_30;
    DROP TABLE join_table;
    
    INSERT INTO new_table (c1, c2, c3, c4, c5)
    SELECT c1, c2, c3, c4,c5
    FROM   other_table;
    
    CREATE TABLE join_table AS
    SELECT r.c1,r.c2,cr.c1,cr.c2,cr.c3,cr.c4,cr.sc5
    FROM   new_table cr
    JOIN   r_table r ON cr.c1 = r.r1;
    $proc$
    

    (但无论如何都要使用CREATE TABLE AS。)

    见:

    【讨论】:

      猜你喜欢
      • 2012-08-12
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多