1. August 2008

Mit SQL*Plus auf eine APEX Session "aufsetzen"

English title: Joining an Oracle Application Express session: from SQL*Plus

Heute habe ich im Rahmen der deutschen APEX Community einen Tipp veröffentlicht, wie man von SQL*Plus aus "auf eine APEX Session aufsetzen" kann und dann Zugriff auf den Session State hat. Da dies vielleicht auch für manche von euch interessant ist, hier einfach nochmal ...
Today I released a SQL script for attaching to an Oracle Application Express session from SQL*Plus on the website of the German Application Express Community. Since this might be also of interest to some of you here's the script also as a blog posting.
Also ... zunächst der Session-State in der normalen "APEX Ansicht" (Willkommensseite der "Sample Application"). Wenn Ihr also eine APEX Session am Laufen habt, startet SQL*Plus als der Datenbankuser, dem der APEX Workspace gehört (Parsing Schema der Applikation) und lasst dann dieses Skript hier laufen ...
So ... this image shows the browser's view on the state of the current APEX session (the welcome page of the "Sample Application"). Now start SQL*Plus, log on as the database user which owns the APEX Workspace (Application Parsing Schema) and start the following script ...
set verify off

prompt ***********************************************************************
prompt * Verbindung zu einer APEX-Session ...
prompt ***********************************************************************
prompt 

accept WSNAME                 prompt '>> APEX-Workspace (Name):          '
accept SESSID                 prompt '>> APEX Session-ID:                '
accept APP                    prompt '>> APEX Anwendungs-ID:             '
accept APUSER default 'ADMIN' prompt '>> APEX User:              [ADMIN] '

set timing off

declare
  l_cgivar_name owa.vc_arr;
  l_cgivar_val  owa.vc_arr;
  l_wsid        number;
begin
  htp.init;

  l_cgivar_name(1) := 'REQUEST_PROTOCOL';
  l_cgivar_val(1)  := 'HTTP';
  owa.init_cgi_env(
      num_params => 1,
      param_name => l_cgivar_name,
      param_val  => l_cgivar_val );
 
  select workspace_id into l_wsid from apex_workspaces where workspace='&WSNAME.';
  wwv_flow_api.set_security_group_id(
    p_security_group_id=>l_wsid
  );

  apex_application.g_flow_id      := &APP.;
  apex_application.g_instance     := &SESSID.;
  apex_application.g_flow_step_id := 1;

  apex_custom_auth.define_user_session('&APUSER.','&SESSID.');
  wwv_flow_custom_auth_std.post_login(
    p_uname => '&APUSER.',
    p_session_id => apex_application.g_instance,
    p_flow_page => apex_application.g_flow_id||':'||apex_application.g_flow_step_id
  );
  wwv_flow.show (
    p_flow_id      => apex_application.g_flow_id,
    p_flow_step_id => apex_application.g_flow_step_id,
    p_instance     => apex_application.g_instance
  );
end;
/

accept ITEM                   prompt '>> Inhalt von APEX Element zeigen: '

select v('&ITEM.') "&ITEM." from dual
/
Die Ausgabe sollte dann in etwa so aussehen ...
The output should then look like the following ...
C:\>sqlplus [username]/[password]

SQL*Plus: Release 10.2.0.1.0 - Production on Fr Aug 1 12:29:51 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Verbunden mit:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> @attach_session
***********************************************************************
* Verbindung zu einer APEX-Session ...
***********************************************************************

>> APEX-Workspace (Name):          PARTNER
>> APEX Session-ID:                3934214310093418
>> APEX Anwendungs-ID:             120
>> APEX User:              [ADMIN] DEMO

PL/SQL procedure successfully completed.

>> Inhalt von APEX Element zeigen: P1_QUOTA

P1_QUOTA
--------------------------------------------------------------------------------
  $15,000.00

1 row selected.

SQL>
Viel Spaß damit ...
Have fun!

Kommentare:

Sascha Linke hat gesagt…

Hallo,

ich benutze ApEx nun auch schon eine ganze Weile und finde, dass das Ganze etwas zu kompliziert ist.

Ich verwende das etwas "unkomplizierter":

begin
wwv_flow_api.set_security_group_id(
p_security_group_id=>apex_util.find_security_group_id('&ws.'));
apex_application.g_flow_id := &appid.;
apex_application.g_instance := &session.;
apex_application.g_flow_step_id := 1;
end;

Die Abfragen auf die einzelnen Items in der Instanz kann man dann mit folgendem Select erledigen:

SELECT t.page_id
,t.page_name
,t.item_name
,vvw_flow.fetch_item(t.item_id) item_value
FROM apex_application_page_items t
WHERE t.application_id = &appid.


Mit der Abfrage kann man dann immer wieder die Items abfragen, solange man die SQL-Session nicht verlässt.

Sascha

Carsten Czarski hat gesagt…

Hallo,

Je einfacher, desto besser.

Vielen Dank dafür!

-Carsten

Beliebte Postings