Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

dapatkah saya mempertahankan satu sesi Oracle dari dua klien oci?

Jika Anda menggunakan database 11g, Anda dapat menggunakan DBMS_XA paket untuk mengizinkan satu sesi untuk bergabung dengan transaksi yang dimulai oleh sesi pertama. Saat Tim Hall mendemonstrasikan, Anda dapat memulai transaksi dalam satu sesi, bergabung dengan transaksi itu dari sesi lain, dan membaca perubahan tanpa komitmen yang dibuat dalam transaksi. Sayangnya, bagaimanapun, itu tidak akan membantu dengan variabel sesi (dengan asumsi bahwa "variabel sesi" berarti variabel paket yang memiliki cakupan sesi).

Buat paket dan tabelnya:

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;

Di Sesi 1, kita memulai transaksi global, mengatur variabel paket, dan memasukkan baris ke dalam tabel sebelum menangguhkan transaksi global (yang memungkinkan sesi lain untuk melanjutkannya)

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.

Di sesi 2, kami melanjutkan transaksi global, membaca dari tabel, membaca variabel sesi, dan mengakhiri transaksi global. Perhatikan bahwa kueri terhadap tabel melihat baris yang kami sisipkan tetapi perubahan variabel paket tidak terlihat.

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.

Untuk membagikan status sesi di antara sesi, apakah mungkin menggunakan konteks aplikasi global daripada menggunakan variabel paket? Anda dapat menggabungkannya dengan DBMS_XA paket jika Anda ingin membaca tabel database dan status sesi.

Buat konteks dan paket dengan pengambil dan penyetel

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;

Di sesi 1, atur nilai variabel konteks G_VAR ke 47 untuk sesi 12345

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

Sekarang, sesi 2 dapat membaca nilai dari konteksnya

  1* select pkg_foo.get_var( 12345 ) from dual
SQL> /

PKG_FOO.GET_VAR(12345)
----------------------
                    47



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah Oracle SYS_GUID() UUID RFC 4122 sesuai?

  2. Berapa jumlah maksimum kolom yang diperbolehkan dalam sebuah tabel?

  3. polimorfisme LINQ-ke-XYZ?

  4. Bisakah Anda membantu saya menulis prosedur di Oracle untuk mengumpulkan data dari tabel ke file CSV?

  5. Bagaimana saya bisa melakukan agregat ini?