#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, которая позволяет нам использовать $ $.