AMAZON 500310:无效操作:“Drop”处或附近的语法错误
Posted
技术标签:
【中文标题】AMAZON 500310:无效操作:“Drop”处或附近的语法错误【英文标题】:AMAZON 500310: Invalid operation: syntax error at or near " Drop" 【发布时间】:2020-09-15 02:15:01 【问题描述】:我遵循https://dwgeek.com/redshift-stored-procedure-return-result-set-working-example.html/ 使用临时表创建存储过程的步骤,但遇到了上述错误。
CREATE OR REPLACE PROCEDURE sample_return_table(tmp_table INOUT varchar(256))
AS '
DECLARE
row record;
BEGIN
EXECUTE ' DROP table if exists ' || tmp_table;
EXECUTE ' CREATE temp TABLE ' || tmp_table || ' AS SELECT DISTINCT table_schema FROM information_schema.tables ';
END;
'
LANGUAGE plpgsql;
错误:
[Amazon](500310) Invalid operation: syntax error at or near "DROP"
Position: 132; [SQL State=42601, DB Errorcode=500310]
1 statement failed.
我可以知道是什么问题吗?
【问题讨论】:
【参考方案1】:这是来自Overview of stored procedures in Amazon Redshift 的示例存储过程:
CREATE OR REPLACE PROCEDURE test_sp1(f1 int, f2 varchar)
AS $$
BEGIN
RAISE INFO 'f1 = %, f2 = %', f1, f2;
END;
$$ LANGUAGE plpgsql;
注意使用$$
来标识过程的内容,而您的代码使用'
。
使用'
的问题在于它也在内部过程中使用(例如,就在DROP
之前),因此会混淆Redshift。
尝试更改为未使用的序列(例如$$
)以避免此问题。
【讨论】:
$$ 不能在 sql 工作台中使用。这就是为什么我按照其他人的推荐使用''。错误:42601:[Amazon](500310) 在 "$$ 处或附近未终止的美元引号字符串 使用 SQL Workbench/J 版本 125 时,请考虑指定备用分隔符作为解决方法。由于 CREATE PROCEDURE 包含以分号 (;) 分隔的 SQL 语句,因此定义备用分隔符(例如正斜杠 (/))并将其放在 CREATE PROCEDURE 语句的末尾会将整个语句发送到 Amazon Redshift 服务器进行处理。如下例所示。我应该在 SQL workbench/j 中使用什么分隔符 问题与$$
无关,而是SQL客户端认为是命令结束的分号(;
)。您可以继续使用$$
,但该文档页面建议将备用分隔符设置为/
,或者可能将整个命令作为“批处理”发送。我不熟悉 SQL Workbench,但请参阅:SQL Workbench: Creating stored procedures and triggers
@Denise:你是对的。 Redshift 没有启用“美元报价”支持(仅适用于 Postgres)——但我想为 Redshift 启用它也是有意义的。我会改变的
当然。对于这个问题,我决定使用 SQL WORKBENCHJ 版本 124,它允许我们使用 $$。以上是关于AMAZON 500310:无效操作:“Drop”处或附近的语法错误的主要内容,如果未能解决你的问题,请参考以下文章
[0A000][500310] [Amazon](500310) 无效操作:无法在 pg 表上定义物化视图。
[Amazon](500310) 无效操作:尚不支持此类IN/NOT IN查询;
Redshift 存储过程 - [Amazon](500310) 无效操作:“$1”处或附近的语法错误;
SQL 错误 [500310] [42703]: [Amazon](500310) 无效操作:events_20180626_temp 中不存在列“engagement_time_msec”;