2017-01-27 4 views
0


クエリのIDが&のテーブルに保存されたプログラムを作成しました。ユーザーは照会IDを選択し、プログラムは指定されたUNIXディレクトリーへの出力を生成します。

今は、テーブルからテーブルをフェッチした後に、パッケージ本体のグローバル変数にクエリを保存しています。

複数のユーザーが同時にプログラムを実行すると、(SQLクエリを格納している)グローバル変数がそれに応じて更新されますか?例えばパッケージ本体のグローバル変数が複数のユーザのために働く方法

:複数のユーザーが異なるSQL_IDについて同時に、このプログラムを実行すると

create or replace package test 
    is 
    global_sql varchar2(40000); 

     procedure get_sql(p_sql_id number) 
     is 
     begin 

     select sql into global_sql from query_table where sql_id = p_sql_id; 
     //more code  
     end; 

    end; 

今、私のglobal_sqlはそれに応じてすべてのユーザーに対して異なるものになりますでしょうか?

+0

connect test/test set serveroutput on exec dbms_output.put_line(test_var.v_sql_text); /*result is empty*/ exec test_var.v_sql_text := 'TEXT_QUERY:select * from all_tables'; exec dbms_output.put_line(test_var.v_sql_text); -- TEXT_QUERY:select * from all_tables 

リターンを意味するか、別のセッションを開きます*はクエリのグローバル変数に格納されますか? – BobC

+0

@BobC質問を更新しました。私は今質問が明確であることを願っている。 – Wolfgang

答えて

3

あなたはパッケージ変数を意味すると思いますか? この場合、異なる接続のユーザーは、自分の変数のコピーで自分の値を取得します。これらの値はすべてUGA(ユーザーのグローバルエリア)にとどまります。例えば

私は1つの変数を保持するために、本体なしでパッケージを作成します。

connect test/test 

create or replace package test_var is 
    v_sql_text varchar2(4000); 
end test_var; 
/

exec test_var.v_sql_text := 'FIRST_QUERY:select * from dual'; 

あなたは*の結果を最初のセッション

exec dbms_output.put_line(test_var.v_sql_text); 

-- 
FIRST_QUERY:select * from dual 
+2

この回答に追加するだけで、ユーザーごとではなく、データベースセッションごとに行われます。つまり、接続プーリングを使用している場合は注意が必要です。新しい変数を実行するたびにグローバル変数の値をリセットする必要があります。セッションが閉じられてパッケージの状態がリセットされることに依存します。 – Boneist

+0

ありがとう@Michael – Wolfgang

関連する問題