#stored-procedures #amazon-redshift #plpgsql
Вопрос:
Я пытаюсь создать процедуру красного смещения, которая будет выводить данные в любой таблице, например, например, количество строк. Но я не могу понять, как вы должны динамически передавать имя таблицы и получать выходные данные. Я пытаюсь сделать что-то вроде этого:
CREATE OR REPLACE PROCEDURE my_schea.test(t in varchar, o out varchar)
LANGUAGE plpgsql
AS $
BEGIN
execute 'SELECT count(*) into ' || o || ' FROM ' || t || ';';
-- or something more complicated
END
$
;
тогда я звоню вот так:
call my_schema.test('myschema.mytable');
Кажется, я не могу правильно понять синтаксис, буду признателен за любую помощь.
этот конкретный синтаксис выше дает мне ошибку:
cannot EXECUTE a null query string;
Ответ №1:
Есть несколько вещей, которые нужно изменить.
out o varchar
недопустимо;out
параметры не допускаются в процедурах, толькоinout
;into o
не работает в динамическом sql, потому что он не «видит» локальные переменные. См.раздел выполнение.
Таким образом, образец процедуры становится —
CREATE OR REPLACE PROCEDURE my_schema.test(in t text, inout o bigint default null)
as
$
begin
execute ('SELECT count(*) FROM '||t) into o; -- NB *** SQLi prone ***
-- or something more complicated
end;
$ language plpgsql;
Тогда вы сможете
call my_schema.test('myschema.mytable');
и это даст результат, аналогичный select
результату утверждения.
Я предполагаю, что у вас есть веская причина написать процедуру, а не функцию, так как пример очень похож на нее. В качестве функции образец будет выглядеть следующим образом:
create or replace function my_schema.testf(t text) returns bigint
as
$
declare
retval bigint;
begin
execute ('SELECT count(*) FROM '||t) into retval; -- NB *** SQLi prone ***
-- or something more complicated
return retval;
end;
$ language plpgsql;
и затем
select my_schema.testf('myschema.mytable');
Комментарии:
1. Привет, спасибо, что ответили на этот вопрос. Я попробовал это сделать и сделал две вещи. Во-первых, я не думаю, что вы можете писать функции красного смещения в plpgsql см.: docs.aws.amazon.com/redshift/latest/dg/r_CREATE_FUNCTION.html . Во — вторых, я также не могу запустить запрос на создание хранимой процедуры. Я получаю ошибку с «по умолчанию», но даже когда я удаляю
default null
, я все равно получаюsyntax error at or near
. Значит, что-то не так процитировано2. Ну, это рабочая процедура и функция, но в Postgresql. Боюсь, что я мало чем могу помочь с диалектом Красного смещения. Все же попробуйте
o out bigint
или целое число, без значения по умолчанию. Я вижу, что синтаксис немного отличается.