Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
1

Sys_context

09.11.2015, 18:24. Показов 2495. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер.

Попробую объяснить своими словами. В веб-апликухе, с которой я работаю, есть кнопка для создания файлов, в которые заносятся автоматически определенные данные. И в этот файл должны заносится имя и фамилия человека, который создает этот файл из под своей учетки.

В пакете, который отвечает за генерацию файла, данную штуку описывает данная функция
SQL
1
SYS_CONTEXT('my_info', 'u_name')
я почитал, что такое SYS_CONTEXT и что его можно вызвать обычным селектом, попробовал, но контекст ничего не возвращает, как и собственно в файл и мне нужно найти причину данной проблемы. Где мне искать, что такое my_info и u_name и что предопределяет эти значения?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2015, 18:24
Ответы с готовыми решениями:

Вывести список пространств имен функции SYS_CONTEXT
Здравствуйте. Подскажите как можно узнать весь список пространств имен для функции SYS_CONTEXT и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
10.11.2015, 09:26 2
Цитата Сообщение от пк00мук Посмотреть сообщение
Где мне искать, что такое my_info и u_name и что предопределяет эти значения?
SQL Reference

Function

SYS_CONTEXT

Можно также посмотреть функцию dbms_session.set_context и
SQL
1
2
SELECT *
FROM dba_context
0
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
11.11.2015, 11:19  [ТС] 3
Цитата Сообщение от Grossmeister Посмотреть сообщение
SQL Reference
Function
SYS_CONTEXT
не совсем понятно, где это. или это то, что гуглить нужно? гуглил, но особо ничего не понял

через
SQL
1
SELECT * FROM dba_context
нашел пакет, в котором все значения указываются, но к сожалению не могу дебажить в нем DBMS_SESSION.SET_CONTEXT.

И еще вопрос, почему в
SQL
1
SELECT * FROM dba_context
нет USERNV или я его не вижу?
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
11.11.2015, 12:19 4
Цитата Сообщение от пк00мук
не совсем понятно, где это.
Это оф. дока. SQL Reference - том доки, остальное - глава и подглава.
Докой можно пользоваться и через Инет, но я предпочитаю скачивать ее с оф. сайта и пользовать локально, поэтому url на конкретную главу дать не могу.
Можно еще посмотреть том Application Developer Guide

Цитата Сообщение от пк00мук
И еще вопрос, почему в dba_context нет USERNV или я его не вижу?
Там контексты, созданные с пом. CREATE CONTEXT, вовсе не обязательно, что они установлены.
1
4 / 4 / 0
Регистрация: 28.02.2015
Сообщений: 51
11.11.2015, 23:38 5
Контекст это такая специальная структура данных, которая создается в PGA на уровне сессии. Таких структур данных, контекстов может быть несколько. Каждая структура имеет имя. Данная структура по сути представляет из себя набор пар имя_параметра, значение параметра. Эта структура может изменяться только определенной, доверенной процедурой, которую надо регистрировать.
В вашем случае, судя по всему, контекст не устанавливается. Его надо устанавливать в сессии.
Продебажить DBMS_SESSION.SET_CONTEXT не получится, так как он завраплен.
Покажите полный код процедуры, которая устанавливается параметры контекста.
0
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
12.11.2015, 10:55  [ТС] 6
Цитата Сообщение от Raidman Посмотреть сообщение
Покажите полный код процедуры, которая устанавливается параметры контекста.
Тут их 2, почти ничем не отличаются, видимо какаято из них
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    
 
-- устанавливаю параметры сессии (всю необходимую мне информацию)
    PROCEDURE SetPersonnelInfo(login_ VARCHAR2, passwd_ IN VARCHAR2) IS
        v_u_id   INTEGER;
        v_prs_id INTEGER;
        v_passwd VARCHAR2(32);
    BEGIN
        DBMS_SESSION.SET_CONTEXT('my_info', 'u_name', login_);
        SELECT u_id, passwd, prs_id
          INTO v_u_id, v_passwd, v_prs_id
          FROM dms_user
         WHERE LOWER(login) = LOWER(login_)
           AND u_lock = 0; -- and passwd=passwd_ ;
 
        -- проверяю пароль
        IF v_passwd IS NULL
           OR v_passwd <> passwd_ THEN
            DBMS_APPLICATION_INFO.SET_CLIENT_INFO(CLIENT_INFO => '');
            DBMS_SESSION.SET_CONTEXT('my_info', 'prs_id', '');
            DBMS_SESSION.SET_CONTEXT('my_info', 'u_id', '');
            RETURN;
        END IF;
 
        DBMS_SESSION.SET_CONTEXT('my_info', 'prs_id', v_prs_id);
        DBMS_SESSION.SET_CONTEXT('my_info', 'u_id', v_u_id);
 
        SetRoleArray;
 
        -- для совместимости с старыми версиями
        DBMS_APPLICATION_INFO.SET_CLIENT_INFO(CLIENT_INFO => login_);
        --EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD/MM/YYYY-HH24:MI:SS''';
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_APPLICATION_INFO.SET_CLIENT_INFO(CLIENT_INFO => '');
            DBMS_SESSION.SET_CONTEXT('my_info', 'prs_id', '');
            DBMS_SESSION.SET_CONTEXT('my_info', 'u_id', '');
    END;
 
    -- устанавливаю параметры сессии (всю необходимую мне информацию)
    PROCEDURE SetPersonnelInfoSys(login_ VARCHAR2) IS
        v_u_id   INTEGER;
        v_prs_id INTEGER;
    BEGIN
        DBMS_SESSION.SET_CONTEXT('my_info', 'u_name', login_);
        SELECT u_id, prs_id
          INTO v_u_id, v_prs_id
          FROM dms_user
         WHERE LOWER(login) = LOWER(login_)
           AND u_lock = 0;
 
        DBMS_SESSION.SET_CONTEXT('my_info', 'prs_id', v_prs_id);
        DBMS_SESSION.SET_CONTEXT('my_info', 'u_id', v_u_id);
 
        SetRoleArray;
 
        -- для совместимости с старыми версиями
        DBMS_APPLICATION_INFO.SET_CLIENT_INFO(CLIENT_INFO => login_);
        --EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''DD/MM/YYYY-HH24:MI:SS''';
    EXCEPTION
        WHEN OTHERS THEN
            DBMS_APPLICATION_INFO.SET_CLIENT_INFO(CLIENT_INFO => '');
            DBMS_SESSION.SET_CONTEXT('my_info', 'prs_id', '');
            DBMS_SESSION.SET_CONTEXT('my_info', 'u_id', '');
    END;
0
4 / 4 / 0
Регистрация: 28.02.2015
Сообщений: 51
12.11.2015, 12:07 7
Выполните пожалуйста следующий запрос:
SQL
1
2
3
SELECT * 
 FROM dba_context 
WHERE UPPER(NAMESPACE) = 'MY_INFO'
0
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
12.11.2015, 12:25  [ТС] 8
Цитата Сообщение от Raidman Посмотреть сообщение
Выполните пожалуйста следующий запрос:
1MY_INFODPUDPU_INFOACCESSED LOCALLY
0
4 / 4 / 0
Регистрация: 28.02.2015
Сообщений: 51
12.11.2015, 15:08 9
Ну вот и ответ на Ваш вопрос.
Нужно создать контекс my_info.
create context my_info using <название пакета>.
Название пакета это название того пакета, который будет использоваться в качестве доверительного и через который будут устанавливаться его параметры.
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
12.11.2015, 15:22 10
Цитата Сообщение от Raidman Посмотреть сообщение
Нужно создать контекс my_info
Как я понял, приведенная картинка - это строка из dba_context (хотя и в несколько странном виде ), т.е. такой контекст уже создан.
0
4 / 4 / 0
Регистрация: 28.02.2015
Сообщений: 51
12.11.2015, 15:35 11
Поищете где в вашем приложении вызываются эти процедуры, потому что они должны валится с ошибкой. Но судя по тому как используется exception when others, вполне возможно что это происходит в тихую.

Добавлено через 11 минут
А, действительно, я не внимательно посмотрел, контекст создан. Странно просто результат приложен =)
Тогда ищет проблему в следующих местах:
1. Вызываются ли ваши доверенные процедуры в сессии.
2. Exception when others так использовать не стоит. Возможно они и вызвыаются, но падают в exception и все это происходит абсолютно молча. Дерните эту процедуру напрямую в сессии, а потом проверьте что выдает изначальный селект, то есть:
SQL
1
2
3
4
5
6
7
 BEGIN
    dpu_info.SetPersonnelInfoSys('Test_login');
  END;
/
SELECT sys_context('my_info','u_name')
  FROM dual 
/
0
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
12.11.2015, 16:23  [ТС] 12
Цитата Сообщение от Grossmeister Посмотреть сообщение
хотя и в несколько странном виде
обернул через тег в таблицу, как и у меня в девелопере)

Цитата Сообщение от Raidman Посмотреть сообщение
Поищете где в вашем приложении вызываются эти процедуры, потому что они должны валится с ошибкой. Но судя по тому как используется exception when others, вполне возможно что это происходит в тихую.
Процедура не валится, если её протесить то она доходит до
SQL
1
DBMS_APPLICATION_INFO.SET_CLIENT_INFO(CLIENT_INFO => login_);
заносит в login_ мой логин и выходит.

дописал для проверки
SQL
1
SELECT (SELECT SYS_CONTEXT('my_info', 'u_id') FROM dual) INTO v_final FROM dual;
вот тут уже видимо SYS_CONTEXT отработал и записал v_final значение u_id.

а просто с sql window вызвать контекст не могу
0
4 / 4 / 0
Регистрация: 28.02.2015
Сообщений: 51
12.11.2015, 17:07 13
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE context my_info1 USING p111;
/
CREATE OR REPLACE package p111
AS
   PROCEDURE p2;
 END;
/   
CREATE OR REPLACE package body p111
AS 
PROCEDURE p2
    AS
      BEGIN
         DBMS_SESSION.SET_CONTEXT('my_info1', 'prs_id', '1');
        END;
END; 
/    
BEGIN
    p111.p2;
  END;  
/    
SELECT sys_context('my_info1','prs_id') FROM dual
Все работает =)
Показывайте скриншот =)
0
9 / 9 / 1
Регистрация: 08.06.2011
Сообщений: 185
12.11.2015, 17:28  [ТС] 14
Цитата Сообщение от Raidman Посмотреть сообщение
Показывайте скриншот =)
может я чтото не так делаю, видно же что в u_id записало
Миниатюры
Sys_context   Sys_context  
0
4 / 4 / 0
Регистрация: 28.02.2015
Сообщений: 51
12.11.2015, 20:59 15
Контекст устанавливается на уровне сессии. То есть если у вас есть две сессии, и вы в одной из них вызвали доверенную процедуру, а в в другой пытаетесь читать, то вы ничего не увидите.
Вы уверены что сессия тест TestScript и и select from dual у вас в одной сессии?
Выполните код, который я предложил в посте #11. В одной и той же сессии дергаете процедуру и сразу же за ней дергаете select from dual.
0
12.11.2015, 20:59
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru