Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

क्या मैं दो ओसीआई ग्राहकों से एक ओरेकल सत्र बनाए रख सकता हूं?

यदि आप 11g डेटाबेस का उपयोग कर रहे हैं, तो आप DBMS_XA<का उपयोग कर सकते हैं /कोड> पैकेज एक सत्र को पहले सत्र द्वारा शुरू किए गए लेनदेन में शामिल होने की अनुमति देने के लिए। जैसा कि टिम हॉल प्रदर्शित करता है, आप एक सत्र में एक लेनदेन शुरू कर सकते हैं, दूसरे सत्र से उस लेनदेन में शामिल हो सकते हैं, और लेनदेन में किए गए अप्रतिबंधित परिवर्तनों को पढ़ सकते हैं। दुर्भाग्य से, हालांकि, यह सत्र चर के साथ मदद नहीं करेगा (यह मानते हुए कि "सत्र चर" का अर्थ पैकेज चर है जिसमें सत्र का दायरा है)।

पैकेज और टेबल बनाएं:

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 . के साथ जोड़ सकते हैं पैकेज यदि आप डेटाबेस टेबल और सत्र स्थिति दोनों को पढ़ना चाहते हैं।

गेट्टर और सेटर के साथ संदर्भ और पैकेज बनाएं

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संग्रहित प्रक्रिया-एसक्यूएल डेवलपर

  2. sqlplus कमांड लाइन के साथ सादा पाठ पासवर्ड छिपाना

  3. ओरेकल पीएल/एसक्यूएल में चर का उपयोग कैसे करें जहां खंड

  4. ओएस एक्स 2013-004 के लिए जावा स्विंग अनुप्रयोगों को कैसे प्रभावित (ब्रेक) करता है?

  5. मैं रेल में GROUP_CONCAT का उपयोग कैसे कर सकता हूं?