процедура красного смещения без параметра out и имени динамической таблицы, как в параметре

#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 или целое число, без значения по умолчанию. Я вижу, что синтаксис немного отличается.