在 redshift 中创建存储过程

Posted

技术标签:

【中文标题】在 redshift 中创建存储过程【英文标题】:Creating stored procedure in redshift 【发布时间】:2020-12-09 09:02:37 【问题描述】:

时,如下所示:

CREATE OR REPLACE PROCEDURE sp_test() 
AS '
BEGIN
TRUNCATE TABLE TABLE_1;

INSERT INTO TABLE_1
SELECT COL1, COL2 
FROM TABLE_2
WHERE CONDITION='SAMPLE'; 
           
END;
'
LANGUAGE plpgsql;

这会产生错误syntax error near 'SAMPLE',因为single quotes is already used for stored procedure begin and end。另外,这里我们会not be able to replace single quotes in INSERT query to double,因为 redshift 会将其视为一列。

很少有其他帖子建议将$$ 用于存储过程,但是 sql 工作台不支持 $$。 任何解决此问题的方法。谢谢。

【问题讨论】:

【参考方案1】:

你试过双引号吗?

WHERE CONDITION=''SAMPLE''; 
       

数据样本

CREATE TABLE t (id int, status text);
INSERT INTO t VALUES (42,'foo');

程序

CREATE OR REPLACE PROCEDURE sp_test() 
AS'
BEGIN
TRUNCATE TABLE t;
INSERT INTO t
SELECT 8,''new record'';            
END;'
LANGUAGE plpgsql;

测试过程

CALL sp_test();
SELECT * FROM t

 id |   status   
----+------------
  8 | new record
(1 Zeile)

【讨论】:

@pc_pyr 奇怪。现在的错误信息是什么? @pc_pyr 现在这是一个完全不同的问题,与您的原始问题无关。正如 AWS 文档所说,尝试将过程作为***调用调用,即不在显式事务块中调用:docs.aws.amazon.com/redshift/latest/dg/… 谢谢@Jim Jones,请您多谈谈如何制作top-level call @pc_pyr 正如我所说,这与您的原始问题无关,我们不鼓励在一篇文章中回答多个问题。因此,您必须为此提出另一个问题,或者查看我上面提到的链接中的SECURITY DEFINER

以上是关于在 redshift 中创建存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程中创建视图

在存储过程中创建临时表

在 Informix 中创建 TEMP 存储过程

在存储过程中创建动态表而在 PL/SQL 块表中创建时权限不足[重复]

mysql - 在存储过程中创建事件

如何在mysql中创建存储过程