sql >> データベース >  >> RDS >> Oracle

2つのociクライアントから1つのOracleセッションを維持できますか?

    11gデータベースを使用している場合は、 DBMS_XA<を使用できます。 / code> パッケージ 1つのセッションが最初のセッションによって開始されたトランザクションに参加できるようにします。 Tim Hallが説明するように、あるセッションでトランザクションを開始し、別のセッションからそのトランザクションに参加して、トランザクションで行われたコミットされていない変更を読み取ることができます。ただし、残念ながら、それはセッション変数には役立ちません(「セッション変数」がセッションスコープを持つパッケージ変数を意味すると仮定します)。

    パッケージとテーブルを作成します:

    CREATE TABLE foo( col1 NUMBER );
    
    create or replace package pkg_foo
    as
      g_var number;
      procedure set_var( p_in number );
    end;
    
    create or replace package body pkg_foo
    as
      procedure set_var( p_in number )
      as
      begin
        g_var := p_in;
      end;
    end;
    

    セッション1では、グローバルトランザクションを開始し、パッケージ変数を設定し、テーブルに行を挿入してから、グローバルトランザクションを一時停止します(これにより、別のセッションで再開できます)

    SQL> ed
    Wrote file afiedt.buf
    
      1  declare
      2    l_xid dbms_xa_xid := dbms_xa_xid( 1 );
      3    l_ret integer;
      4  begin
      5    l_ret := dbms_xa.xa_start( l_xid, dbms_xa.tmnoflags );
      6    pkg_foo.set_var(42);
      7    dbms_output.put_line( 'Set pkg_foo.g_var to ' || pkg_foo.g_var );
      8    insert into foo values( 42 );
      9    l_ret := dbms_xa.xa_end( l_xid, dbms_xa.tmsuspend );
     10* end;
    SQL> /
    Set pkg_foo.g_var to 42
    
    PL/SQL procedure successfully completed.
    

    セッション2では、グローバルトランザクションを再開し、テーブルから読み取り、セッション変数を読み取り、グローバルトランザクションを終了します。テーブルに対するクエリでは、挿入した行が表示されますが、パッケージ変数の変更は表示されないことに注意してください。

    SQL> ed
    Wrote file afiedt.buf
    
      1  declare
      2    l_xid dbms_xa_xid := dbms_xa_xid( 1 );
      3    l_ret integer;
      4    l_col1 integer;
      5  begin
      6    l_ret := dbms_xa.xa_start( l_xid, dbms_xa.tmresume );
      7    dbms_output.put_line( 'Read pkg_foo.g_var as ' || pkg_foo.g_var );
      8    select col1 into l_col1 from foo;
      9    dbms_output.put_line( 'Read COL1 from FOO as ' || l_col1 );
     10    l_ret := dbms_xa.xa_end( l_xid, dbms_xa.tmsuccess );
     11* end;
    SQL> /
    Read pkg_foo.g_var as
    Read COL1 from FOO as 42
    
    PL/SQL procedure successfully completed.
    

    セッション間でセッション状態を共有するには、グローバルアプリケーションコンテキスト パッケージ変数を使用するのではなく?これをDBMS_XAと組み合わせることができます データベーステーブルとセッション状態の両方を読み取りたい場合はパッケージ。

    getterとsetterを使用してコンテキストとパッケージを作成します

    CREATE CONTEXT my_context
      USING pkg_foo
      ACCESSED GLOBALLY;
    
    create or replace package pkg_foo
    as
      procedure set_var( p_session_id in number,
                         p_in         in number );
      function get_var( p_session_id in number )
        return number;
    end;
    
    create or replace package body pkg_foo
    as
      procedure set_var( p_session_id in number,
                         p_in         in number )
      as
      begin
        dbms_session.set_identifier( p_session_id );
        dbms_session.set_context( 'MY_CONTEXT', 'G_VAR', p_in, null, p_session_id );
      end;
      function get_var( p_session_id in number )
        return number
      is
      begin
        dbms_session.set_identifier( p_session_id );
        return sys_context('MY_CONTEXT', 'G_VAR');
      end;
    end;
    

    セッション1で、コンテキスト変数 G_VARの値を設定します セッション12345の場合は47まで

    begin
      pkg_foo.set_var( 12345, 47 );
    end;
    

    これで、セッション2はコンテキストから値を読み取ることができます

      1* select pkg_foo.get_var( 12345 ) from dual
    SQL> /
    
    PKG_FOO.GET_VAR(12345)
    ----------------------
                        47
    



    1. PHPでSQLの結果をループする-配列全体を取得しない

    2. PentahoDataIntegrationおよびBAServerツールへのMicrosoftSQLServerJDBCドライバーのインストール

    3. SQLServerのINFORMATION_SCHEMAビュー|テーブルが存在するかどうかを確認します

    4. 不正なダウンロードからファイルを保護する方法