Improve creating session from SQL Developer

This commit is contained in:
Jan Kvetina 2022-01-19 19:53:38 +01:00
parent 32ae5f279d
commit 522e83c9ea
2 changed files with 31 additions and 18 deletions

View File

@ -264,6 +264,7 @@ CREATE OR REPLACE PACKAGE app AS
in_user_id sessions.user_id%TYPE, in_user_id sessions.user_id%TYPE,
in_app_id sessions.app_id%TYPE, in_app_id sessions.app_id%TYPE,
in_page_id navigation.page_id%TYPE := NULL, in_page_id navigation.page_id%TYPE := NULL,
in_session_id sessions.session_id%TYPE := NULL,
in_items VARCHAR2 := NULL in_items VARCHAR2 := NULL
); );

View File

@ -443,6 +443,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
in_user_id sessions.user_id%TYPE, in_user_id sessions.user_id%TYPE,
in_app_id sessions.app_id%TYPE, in_app_id sessions.app_id%TYPE,
in_page_id navigation.page_id%TYPE := NULL, in_page_id navigation.page_id%TYPE := NULL,
in_session_id sessions.session_id%TYPE := NULL,
in_items VARCHAR2 := NULL in_items VARCHAR2 := NULL
) AS ) AS
PRAGMA AUTONOMOUS_TRANSACTION; PRAGMA AUTONOMOUS_TRANSACTION;
@ -453,27 +454,36 @@ CREATE OR REPLACE PACKAGE BODY app AS
'user_id', in_user_id, 'user_id', in_user_id,
'app_id', in_app_id, 'app_id', in_app_id,
'page_id', in_page_id, 'page_id', in_page_id,
'session_id', in_session_id,
'items', in_items 'items', in_items
); );
-- create session from SQL Developer (not from APEX) -- create session from SQL Developer (not from APEX)
BEGIN
IF (in_user_id != app.get_user_id() OR in_app_id != app.get_app_id()) THEN
RAISE NO_DATA_FOUND;
END IF;
IF in_user_id = app.get_user_id() AND in_app_id = app.get_app_id() THEN
-- use existing session if possible -- use existing session if possible
IF (in_session_id > 0 OR in_session_id IS NULL) THEN
BEGIN
APEX_SESSION.ATTACH ( APEX_SESSION.ATTACH (
p_app_id => app.get_app_id(), p_app_id => app.get_app_id(),
p_page_id => NVL(in_page_id, 0), p_page_id => NVL(in_page_id, 0),
p_session_id => app.get_session_id() p_session_id => COALESCE(in_session_id, app.get_session_id())
); );
EXCEPTION EXCEPTION
WHEN OTHERS THEN WHEN OTHERS THEN
app.raise_error('ATTACH_SESSION_FAILED', in_app_id, in_user_id, COALESCE(in_session_id, app.get_session_id()));
END;
END IF;
ELSE
-- find and setup workspace -- find and setup workspace
BEGIN
SELECT a.workspace INTO v_workspace_id SELECT a.workspace INTO v_workspace_id
FROM apex_applications a FROM apex_applications a
WHERE a.application_id = in_app_id; WHERE a.application_id = in_app_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
app.raise_error('INVALID_APP', in_app_id);
END;
-- --
APEX_UTIL.SET_WORKSPACE ( APEX_UTIL.SET_WORKSPACE (
p_workspace => v_workspace_id p_workspace => v_workspace_id
@ -485,8 +495,10 @@ CREATE OR REPLACE PACKAGE BODY app AS
p_userid => APEX_UTIL.GET_USER_ID(in_user_id), p_userid => APEX_UTIL.GET_USER_ID(in_user_id),
p_username => in_user_id p_username => in_user_id
); );
END IF;
-- create APEX session -- create new APEX session
IF (app.get_session_id() IS NULL OR in_session_id = 0) THEN
BEGIN BEGIN
APEX_SESSION.CREATE_SESSION ( APEX_SESSION.CREATE_SESSION (
p_app_id => in_app_id, p_app_id => in_app_id,
@ -495,9 +507,9 @@ CREATE OR REPLACE PACKAGE BODY app AS
); );
EXCEPTION EXCEPTION
WHEN OTHERS THEN WHEN OTHERS THEN
app.raise_error('INVALID_APP', app.get_json_list(in_app_id, in_user_id)); app.raise_error('CREATE_SESSION_FAILED', in_app_id, in_user_id);
END;
END; END;
END IF;
-- continue with standard process as from APEX -- continue with standard process as from APEX
app.create_session(); app.create_session();
@ -618,7 +630,7 @@ CREATE OR REPLACE PACKAGE BODY app AS
RETURN sessions.session_id%TYPE RETURN sessions.session_id%TYPE
AS AS
BEGIN BEGIN
RETURN SYS_CONTEXT('APEX$SESSION', 'APP_SESSION'); -- APEX.G_INSTANCE RETURN SYS_CONTEXT('APEX$SESSION', 'APP_SESSION'); -- APEX_APPLICATION.G_INSTANCE
END; END;