|
Стек вызова в Oracle 10g
|
|||
---|---|---|---|
#18+
Подскажите, можно ли достать в 10g стек вызова? Хочу протоколировать вызов процедур и функций в своем package, но не хочу каждый раз вручную указывать имя текущей процедуры или функции. FORMAT_CALL_STACK подходит плохо, во-первых стек он выводит просто текстом, во-вторых в стеке есть только номер строки, но нет имени процедуры/функции. UTL_CALL_STACK выглядит более интересно, но это только с 12 версии. Мне полноценный стек не нужен, достаточно знать квалифицированное имя, откуда была вызвана текущая функция, и "глубину" вызова. Вот тут вроде бы бэкпорт UTL_CALL_STACK для 9 и 10 версии, но требует для работы p_stack. p_stack есть рядом , но он у меня не компилируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 16:43 |
|
Стек вызова в Oracle 10g
|
|||
---|---|---|---|
#18+
p_stack загрузить удалось. Во-первых нужно было добавить типы, во-вторых нужно было загружать его в системную схему (чтобы был доступ к ALL_SOURCE). Но теперь он работает только на один уровень. При попытке получить весь стек вызова я получаю ошибку: Код: plaintext 1. 2. 3. 4. 5. 6.
Код: plsql 1.
А c, в свою очередь, объявлена как char. s объявлен как varchar2, и если внутри попадаются юникодные символы, то такая ошибка и возникает. Кириллицу в коде я не использую, только в комментариях и строковых константах. Если в объявлении c я меняю char на nchar, то возникает другая ошибка: Код: plaintext 1. 2. 3. 4. 5. 6.
Код: plsql 1. 2. 3. 4. 5.
Не подскажите, как починить? Менять все char на nchar, varchar2 на nvarchar2 и clob на nclob? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 18:00 |
|
Стек вызова в Oracle 10g
|
|||
---|---|---|---|
#18+
V$SQL это синоним к SYS.V_$SQL. Доступ к этому представлению есть у роли SELECT_CATALOG_ROLE. Добавляю пользователю эту роль — но просмотреть V$SQL не могу (ошибка ORA-00942), хотя само представление вижу. Как правильно сделать? Добавить права на select непосредственно пользователю? Или можно это сделать через роли7 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 18:56 |
|
Стек вызова в Oracle 10g
|
|||
---|---|---|---|
#18+
Вообщем удалось запустить. Пакет P_STACK установил в пользовательскую схему, а не системную. В строке 213 для переменной c тип сменил с char на nchar. На системное представление V_$SQL дал права непосредственно пользователю. Использую так: Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2020, 19:21 |
|
Стек вызова в Oracle 10g
|
|||
---|---|---|---|
#18+
Такой вопрос. Я бегло посмотрел P_STACK, там внутри просто кошмар, ручной парсинг исходников, чуть ли не посимвольный перебор. Работает это не очень быстро, поэтому я функцию сделал такой: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
trc_stack это переменная, статично заданная прямо в коде пакета (я вручную задаю 0 или 1 и компилирую пакет). А может ли это быть сессионная переменная, чтобы не перекомпилировать пакет? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 09:33 |
|
Стек вызова в Oracle 10g
|
|||
---|---|---|---|
#18+
Alibek B. А может ли это быть сессионная переменная, чтобы не перекомпилировать пакет? 1) сделайте переменную пакетной 2) контекст https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5002.htm ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 10:33 |
|
Стек вызова в Oracle 10g
|
|||
---|---|---|---|
#18+
1 это в спецификации пакета? Она сейчас там и прописана: Код: plsql 1. 2.
Сейчас я просто задаю ей значение (0 или 1) и перекомпилирую пакет. Пакет называется CC_GO, из внешнего кода мне нужно написать CC_GO.trc_stack := 0 ? Это будет действовать только в пределах выполняемого блока кода? Или в пределах сессии? Насколько я понял, пакетные переменные действуют в рамках сессии -- изменение trc_stack действует и в новой процедуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 11:45 |
|
Стек вызова в Oracle 10g
|
|||
---|---|---|---|
#18+
Alibek B., Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
зы есть нюанс умные кажись могут пакетные переменные сбрасывать ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 11:59 |
|
Стек вызова в Oracle 10g
|
|||
---|---|---|---|
#18+
Еще такой вопрос. В пакете определен тип, например: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Есть ли возможность простыми способами (не осуществляя парсинг исходных кодов) определить состав этого типа, чтобы вывести наименования и значения членов типа? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 12:21 |
|
|
start [/forum/topic.php?fid=52&fpage=29&tid=1880583]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
2ms |
others: | 305ms |
total: | 451ms |
0 / 0 |