こんにちは、私は私の BEGINとENDブロックDOにおけるユーザからの入力をしたい...PostgresSQL/plpgsqlに入力を入力するようにユーザーに求める方法を教えてください。
私は内部のプロンプト/使用しようとしたが、それは仕事をdoesntの。
ポストグルで関数やブロック内で使用できる方法はありますか?
こんにちは、私は私の BEGINとENDブロックDOにおけるユーザからの入力をしたい...PostgresSQL/plpgsqlに入力を入力するようにユーザーに求める方法を教えてください。
私は内部のプロンプト/使用しようとしたが、それは仕事をdoesntの。
ポストグルで関数やブロック内で使用できる方法はありますか?
重要な注記: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
コマンドは、クライアント側で評価されます。
悪い考えは、セッション識別子としてユーザー名を使用するストアドプロシージャでのユーザー入力を求めています。これは本当に悪い考えです。はい、いくつかの環境ではこれを行う方法があります。しかし、あなたができるからといって、あなたがすべきことではありません。例えば、pl/pythonを使ってネットワーク接続をクライアントコンピュータに戻してより多くの情報を求めている人がいると聞いたことがあります。しかし、これは率直にもDailyWTFの領域です。また、クライアント上のプロトコルとリスナーがこの要求を要求するため、pgadminでは動作しません。
ここで、DOは引数なしで無名関数を作成し、すぐに実行します。これはあなたの本当の問題がどこにあるかのようです。
あなたの最善の解決策は、引数を指定して実際の関数を作成し、そこで入力を受け入れることです。その後どこでも使用できます。また、再利用、セキュリティーの変更などが可能です。これはまさにあなたが必要としているようです。
ブロックを送信する前にdo
ブロックを前処理できなかった場合。あなたが入力してPL/PGSQLコードを再利用したい
あなたの最高のデザインは、(CREATE FUNCTION
を参照)の代わりに、DO
(それが懸念される場合は、別のスキーマにこれらを置くことができますに注意してください)機能を使用することです。
こんにちは@PavelStehule、私はあなたがpgadmin3のワークベンチを介して与えたコマンドを実行しようとしました...しかし、それは動作しません.... –
@MadhuraMhatreは、psqlコンソールでのみ動作することができます。おそらく、pgAdminに変数を入力する可能性はありません –
Hey @PavelStehule、私はoracleでプロンプトに "&variable"を使用できることを知っています。しかし、私はこれをpgadmin workbenchを通してコンソールではなく –