2017-02-08 15 views

答えて

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のワークベンチを介して与えたコマンドを実行しようとしました...しかし、それは動作しません.... –

+0

@MadhuraMhatreは、psqlコンソールでのみ動作することができます。おそらく、pgAdminに変数を入力する可能性はありません –

+0

Hey @PavelStehule、私はoracleでプロンプトに "&variable"を使用できることを知っています。しかし、私はこれをpgadmin workbenchを通してコンソールではなく –

1

悪い考えは、セッション識別子としてユーザー名を使用するストアドプロシージャでのユーザー入力を求めています。これは本当に悪い考えです。はい、いくつかの環境ではこれを行う方法があります。しかし、あなたができるからといって、あなたがすべきことではありません。例えば、pl/pythonを使ってネットワーク接続をクライアントコンピュータに戻してより多くの情報を求めている人がいると聞いたことがあります。しかし、これは率直にもDailyWTFの領域です。また、クライアント上のプロトコルとリスナーがこの要求を要求するため、pgadminでは動作しません。

ここで、DOは引数なしで無名関数を作成し、すぐに実行します。これはあなたの本当の問題がどこにあるかのようです。

  1. あなたの最善の解決策は、引数を指定して実際の関数を作成し、そこで入力を受け入れることです。その後どこでも使用できます。また、再利用、セキュリティーの変更などが可能です。これはまさにあなたが必要としているようです。

  2. ブロックを送信する前にdoブロックを前処理できなかった場合。あなたが入力してPL/PGSQLコードを再利用したい

あなたの最高のデザインは、(CREATE FUNCTIONを参照)の代わりに、DO(それが懸念される場合は、別のスキーマにこれらを置くことができますに注意してください)機能を使用することです。

関連する問題