Redshift доллар котировки внутри процедуры - PullRequest
1 голос
/ 24 января 2020

У меня есть процедура, которая принимает имя таблицы и 3 поля, которые необходимо заполнить. Это должно вызываться из другой процедуры, которая перебирает другую таблицу, решая, в какую подстатью помещать материал. Важным битом является простой оператор вставки, например,

insert into table1 values
('blah','String','50');

, чтобы в него входили 4 параметра (таблица 1 и 3 значения). Как бы я сделал это, используя котировки доллара? Очевидно, что это не работает, но дает вам представление о том, что я пытаюсь выполнить sh:

create or replace procedure 
  insert_dc_table(p_tblname varchar,
                  p_name varchar, 
                  p_datatype varchar, 
                  p_datalen varchar)
as $$
begin
  execute
      'insert into '||p_tblname||'(name,datatype,datalen) values '
    ||'('
    ||p_name||', '
    ||p_datatype||', '
    ||p_datalen
    ||')';
end;
$$ language plpgsql;

Мне понадобится двойной доллар вокруг некоторых, но я не уверен точно, где $$ и цитаты go во всем этом! * & #! Я мог бы объявить переменную для хранения оператора execute и сделать:

declare a _output varchar(200);
  a_output := $$ insert into $$||p_tblname||$$(name,datatype,datalen) values ( '$$||p_name||$$',

хорошо, я заблудился там! Заранее спасибо за помощь!

1 Ответ

1 голос
/ 25 января 2020

Redshift Хранимые процедуры требуют только долларовой кавычки тела процедуры. Кавычки внутри тела процедуры интерпретируются как нормальные.

Вы можете обнаружить, что ваш SQL клиент неправильно отправляет созданный SP из-за долларовых кавычек. Если это так, я рекомендую использовать psql для создания хранимой процедуры.

Примеры хранимых процедур доступны в нашем хранилище GitHub Amazon Redshift Utils.

Вот модификация вашего примера:

-- DROP PROCEDURE insert_dc_table(VARCHAR,VARCHAR ,VARCHAR ,VARCHAR);
CREATE OR REPLACE PROCEDURE insert_dc_table( 
    p_tblname VARCHAR, p_name VARCHAR, p_datatype VARCHAR, p_datalen VARCHAR )
AS $$
DECLARE
  rows  INTEGER;
BEGIN
    sql := 'INSERT INTO '||p_tblname||' (name, datatype, datalen)'
         ||' VALUES ('||p_name||','||p_datatype||','||p_datalen||');';
    RAISE INFO 'Running SQL: %', sql;
    EXECUTE sql;
    GET DIAGNOSTICS rows := ROW_COUNT;
    RAISE INFO 'Rows inserted = %', rows;
END
$$ LANGUAGE plpgsql;
-- CALL insert_dc_table ('test_table', 'name', 'type', 'length');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...