【问题标题】:AMAZON 500310: Invalid operation: syntax error at or near " Drop"AMAZON 500310:无效操作:“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.

我可以知道是什么问题吗?

【问题讨论】:

    标签: amazon-web-services stored-procedures amazon-redshift sql-workbench-j


    【解决方案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,它允许我们使用 $$。
    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2014-04-26
    相关资源
    最近更新 更多