2017-02-08 3 views
-1

Привет Я хочу принять ввод от пользователя в моем DO Начинайте и заканчивайте блок ...Как я могу попросить пользователя ввести ввод в PostgresSQL/plpgsql?

Я пытался использовать/проворная внутри, но он не работает.

Есть ли у нас какой-либо другой способ, который мы можем использовать внутри функции или блока в postgres?

ответ

0

Важное примечание: PLpgSQL - это только язык на стороне сервера - нет никакой возможности взаимодействия с пользователем. Вы должны собирать входные данные на стороне клиента перед началом кода PLpgSQL, а пользовательский ввод - там как параметры.

DO заявление является заявлением на стороне сервера, поэтому вы не можете делать никаких интерактивных действий.

DO оператор не поддерживает параметры, так что не легкое нажатия каких-либо параметров внутри DO заявления, но возможно с переменными пользовательскими настройками:

\prompt 'enter some text: ' psqlvar 
\o /dev/null 
select set_config('psql.psqlvar', :'psqlvar', false); 
\o 
do $$ 
    DECLARE var text = current_setting('psql.psqlvar'); 
BEGIN 
    RAISE NOTICE 'entered text is: %', var; 
END; 
$$; 

Функция set_config используется для перемещения содержимого переменного клиента :psqlvar на стороне сервера - переменная сеанса psql.psqlvar. Содержимое этой переменной на стороне сервера принимается функцией current_setting.

Вы должны разделить в своем сознании серверную и клиентскую информацию. Оператор DO оценивается на стороне сервера. Команда psql\prompt оценивается на стороне клиента.

+0

Привет @PavelStehule, я попытался выполнить команды, которые вы передали с помощью pgadmin3 workbench ... Это не работает, хотя .... –

+0

@MadhuraMhatre он может работать только в консоли psql. Вероятно, нет возможности вводить переменные в pgAdmin –

+0

Привет @PavelStehule, я знаю, что в oracle мы можем использовать «& variable» для подсказки ..но я хотел сделать то же самое с помощью pgadmin workbench, а не через консоль –

1

Как плохие идеи, просьба ввести пользовательский ввод в хранимой процедуре, используя имена пользователей в качестве идентификаторов сеанса. Это действительно очень плохая идея. Да, в некоторых странах есть способы сделать это. Но только потому, что вы можете это не значит, что вам нужно. Например, я слышал о том, что люди, использующие pl/python, возвращают сетевое подключение на клиентский компьютер и запрашивают дополнительную информацию. Тем не менее, это откровенно DailyWTF территории. Он также принимает протокол и слушателя на клиенте, чтобы запросить этот запрос и, следовательно, не работает из pgadmin.

Теперь DO создает анонимную функцию без аргументов и сразу же выполняет ее. Кажется, это ваша реальная проблема.

  1. Ваше лучшее решение - просто создать фактическую функцию с аргументами и принять вход там. Затем его можно использовать где угодно. И вы можете повторно использовать, изменять безопасность и т. Д. Это звучит так, как будто это именно то, что вам нужно.

  2. Если вы не смогли предварительно обработать свой блок do, прежде чем отправлять его.

Ваш лучший дизайн, где вы хотите использовать PL/код PGSQL с входами является использование функции (см CREATE FUNCTION) вместо DO (обратите внимание, вы можете поместить их в другую схему, если это является проблемой).

Смежные вопросы