AMAZON 500310: Недопустимая операция: синтаксическая ошибка при «отбрасывании» или около нее

#amazon-web-services #stored-procedures #amazon-redshift #sql-workbench-j

#amazon-веб-сервисы #хранимые процедуры #amazon-redshift #sql-workbench-j

Вопрос:

Я последовал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:

Вот пример хранимой процедуры из обзора хранимых процедур в 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.

Попробуйте изменить неиспользуемую последовательность (например, $$ ), чтобы избежать этой проблемы.

Комментарии:

1. $ $ Не может использоваться в sql workbench. Вот почему я использовал ‘ ‘, как рекомендовано другими людьми. ОШИБКА: 42601: [Amazon] (500310) строка, заключенная в долларовые кавычки, в или около «$ $

2. При использовании SQL Workbench / J версии 125 рассмотрите возможность указания альтернативного разделителя в качестве обходного пути. Поскольку процедура CREATE содержит инструкции SQL, разделенные точкой с запятой (;), определение альтернативного разделителя, такого как косая черта (/), и размещение его в конце инструкции CREATE PROCEDURE отправляет всю инструкцию на сервер Amazon Redshift для обработки. Как показано в следующем примере. Какой разделитель следует использовать в SQL workbench / j

3. Проблема связана не с $$ , а скорее с точкой с запятой ( ; ), которую клиент SQL считает концом команды. Вы можете продолжать использовать $$ , но на странице документации предлагается установить альтернативный разделитель на / или, возможно, отправить всю команду в виде «пакета». Я не знаком с SQL Workbench, но смотрите: SQL Workbench: создание хранимых процедур и триггеров

4. @Denise: вы правы. поддержка «долларовых котировок» не включена для Redshift (только для Postgres) — но я думаю, имеет смысл включить это и для Redshift. Я изменю это

5. Конечно. Для решения этой проблемы я решил использовать SQL WORKBENCHJ версии 124, которая позволяет нам использовать $ $.