powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / в 9i есть функция ora_sql_text
30 сообщений из 30, показаны все 2 страниц
в 9i есть функция ora_sql_text
    #32381241
yon_brover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто с этой функцией работал? Приведите пример использования.
Требуется отлавливать текст открытого курсора, в котором
произошла ошибка.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #32381364
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И что это за функция?
В доке я по ней ничего не нашел (плохо искал?)
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #32381381
yon_brover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
ora_sql_text(sql_text out sys.dbms_standard.ora_name_list_t) return binary_integer;


вроде как должна упрощать жизнь, чтоб не делать многомудрый запрос вроде

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT *
  FROM v$sqltext_with_newlines n, v$session s
 WHERE n.address = hextoraw(s.sql_address) AND n.hash_value = s.sql_hash_value AND
       s.audsid = userenv('sessionid')
 ORDER BY piece

...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #32381885
vc123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<quote>
ora_sql_txt (sql_text out ora_name_list_t)

Returns the SQL text of the triggering statement in the OUT parameter.
</quote>


http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96590/adg14evt.htm#998000

Rgds.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #32382279
yon_brover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему эта замечательная функция может применяться только в триггере after servererror on database? Ее было бы удобно использовать не только в триггерах.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #32382301
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Well, it is not just a function but rather an event attribute function. Another words it can be used only when responding to a system event. And the only way to respond to a system event is to create an event trigger. Actually, trying to use event attribute function outside event trigger will most likely cause ORA-03113: end-of-file on communication channel:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> DECLARE
   2   sql_text ora_name_list_t;
   3   n number;
   4   BEGIN
   5   n := ora_sql_txt(sql_text);
   6   END;
   7   /
DECLARE
*
ERROR at line  1 :
ORA- 03113 : end-of-file on communication channel


SY.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #32382309
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Actually, event attribute function ora_sql_txt can be used not just with system but also with client events:

Код: plaintext
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.
SQL> create or replace trigger before_truncate
   2   before truncate on database
   3   declare
   4   sql_text ora_name_list_t;
   5   n number;
   6   BEGIN
   7   n := ora_sql_txt(sql_text);
   8   FOR i IN  1 ..n LOOP
   9     dbms_output.put_line(sql_text(i));
  10   END LOOP;
  11   END;
  12   /

Trigger created.

SQL> connect scott
Enter password: *****
Connected.
SQL> set serveroutput on
SQL> truncate table empx;

Table truncated.

SQL> exec null;
truncate table empx

PL/SQL procedure successfully completed.

SQL> 


SY
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #32382312
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
And you are not limited to DDL triggers:

Код: plaintext
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.
SQL> create or replace trigger before_insert_empx
   2   before insert
   3   on empx
   4   for each row
   5   declare
   6   sql_text ora_name_list_t;
   7   n number;
   8   BEGIN
   9   n := ora_sql_txt(sql_text);
  10   FOR i IN  1 ..n LOOP
  11     dbms_output.put_line(sql_text(i));
  12   END LOOP;
  13   END;
  14   /

Trigger created.

SQL> insert into empx select * from emp;
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp
insert into empx select * from emp

 14  rows created.

SQL> 


SY.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #32382331
yon_brover
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Великолепно!
А могу ли я в BEFORE INSERT триггере на таблицу лога ошибок
использовать функцию, аналогичную, ora_sql_text, но чтобы она выдавала не
INSERT INTO <таблицу лога ошибок> ...,
а SQL statement, вызвавший ошибку?
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #32382420
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 yon_brover:

No, you can not. And before you get too excited, let's talk about the issue. Yes, you can get DML statement (except select) via ora_sql_text by creating a trigger as it was shown in my example, but you will have to create a trigger for every table. Then you could:

Код: plaintext
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.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
SQL> connect system
Enter password: *******
Connected.
SQL> CREATE OR REPLACE
   2     PACKAGE GLOBAL
   3       IS
   4            ERROR_STMT VARCHAR2( 4000 );
   5   END;
   6   /

Package created.

SQL> GRANT EXECUTE ON GLOBAL TO PUBLIC
   2   /

Grant succeeded.

SQL> CREATE PUBLIC SYNONYM GLOBAL FOR GLOBAL
   2   /

Synonym created.

SQL> connect scott
Enter password: 

SQL> CREATE TABLE ERROR_LOG(
   2                          PROGRAM  VARCHAR2( 30 ),
   3                          USERNAME VARCHAR2( 30 ),
   4                          STMT     VARCHAR2( 4000 )
   5                         )
   6   /

Table created.

SQL> GRANT INSERT,SELECT ON ERROR_LOG TO PUBLIC
   2   /

Grant succeeded.

SQL> CREATE PUBLIC SYNONYM ERROR_LOG FOR ERROR_LOG;

Synonym created.

SQL> connect scott
Enter password: *****
Connected.

SQL> CREATE OR REPLACE
   2     TRIGGER BEFORE_INSERT_EMP
   3       BEFORE INSERT
   4       ON EMP
   5       DECLARE
   6           SQL_TEXT ORA_NAME_LIST_T;
   7           N NUMBER;
   8       BEGIN
   9           GLOBAL.ERROR_STMT := NULL;
  10           N := ORA_SQL_TXT(SQL_TEXT);
  11           FOR I IN  1 ..N LOOP
  12             GLOBAL.ERROR_STMT := GLOBAL.ERROR_STMT || SQL_TEXT(I);
  13           END LOOP;
  14   END;
  15   /

Trigger created.

SQL> CREATE OR REPLACE
   2     PROCEDURE P1(X NUMBER)
   3     IS
   4     BEGIN
   5         IF X =  1 
   6           THEN
   7             INSERT INTO EMP SELECT * FROM EMP;
   8           ELSE
   9             INSERT INTO EMP SELECT * FROM EMP WHERE ROWNUM =  1 ;
  10         END IF;
  11   END;
  12   /

Procedure created.

SQL> SELECT * FROM ERROR_LOG
   2   /

no rows selected

SQL> BEGIN
   2       P1( 1 );
   3     EXCEPTION
   4       WHEN OTHERS THEN
   5         INSERT INTO ERROR_LOG VALUES('P1',USER,GLOBAL.ERROR_STMT);
   6   END;
   7   /

PL/SQL procedure successfully completed.

SQL> SELECT * FROM ERROR_LOG
   2   /

PROGRAM                        USERNAME
 ------------------------------ ------------------------------
 
STMT
 --------------------------------------------------------------------------------
 
P1                             SCOTT
INSERT INTO EMP SELECT * FROM EMP


SQL> BEGIN
   2       P1( 2 );
   3     EXCEPTION
   4       WHEN OTHERS THEN
   5         INSERT INTO ERROR_LOG VALUES('P1',USER,GLOBAL.ERROR_STMT);
   6   END;
   7   /

PL/SQL procedure successfully completed.

SQL> SELECT * FROM ERROR_LOG
   2   /

PROGRAM                        USERNAME
 ------------------------------ ------------------------------
 
STMT
 --------------------------------------------------------------------------------
 
P1                             SCOTT
INSERT INTO EMP SELECT * FROM EMP

P1                             SCOTT
INSERT INTO EMP SELECT * FROM EMP WHERE ROWNUM =  1 


SQL> 


SY.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
в 9i есть функция ora_sql_text
    #39707632
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Код: plaintext
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.
SQL> create or replace trigger before_insert_empx

   2   before insert

   3   on empx

   4   for each row

   5   declare

   6   sql_text ora_name_list_t;

   7   n number;

   8   BEGIN

   9   n := ora_sql_txt(sql_text);

  10   FOR i IN  1 ..n LOOP

  11     dbms_output.put_line(sql_text(i));

  12   END LOOP;

  13   END;

  14   /



интересно, почему у меня не инициализируется n в девятой строке?
правда триггер не before, а after.

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39707708
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MadDogправда триггер не before, а after.не систем, а дмл.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39707719
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-MadDogправда триггер не before, а after.не систем, а дмл.

извините, не понял
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39707727
Sheldon Cooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MadDog-2-пропущено...
не систем, а дмл.

извините, не понял

support.oracle.comDoc ID 438324.1
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39707758
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sheldon CooperMadDogпропущено...


извините, не понял

support.oracle.comDoc ID 438324.1

гугл в недоумении: По запросу Doc ID 438324.1 site:support.oracle.com ничего не найдено.

а есть прямая ссылка?
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39707775
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MadDog,

если правильно помню,
то что ora_sql_txt работал в dml триггерах считалось багой

.....
stax
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39707796
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39708107
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicMadDogа есть прямая ссылка? Trigger with ORA_SQL_TXT Returns NULL After Upgrade (Doc ID 438324.1)

спасибо.
но не читал, там какая-то упоротая регистрация.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39708108
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxMadDog,

если правильно помню,
то что ora_sql_txt работал в dml триггерах считалось багой

.....
stax

во как.
спасибо.

а каким тогда способом можно получить текст запроса в триггере?
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39708133
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MadDogа каким тогда способом можно получить текст запроса в триггере?Для тех, кто в танке: никаким.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39708427
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicДля тех, кто в танке: никаким.

В общем случае таки да, а зa исключением MERGE Find triggering statement.

SY.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39708447
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя и MERGE работает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> merge into t using (select 'ABC' txt from dual) s on (1 = 1)
  2  when matched then update set t.txt = s.txt;
CURBOUND*2*69====> update user$ set spare6=DECODE(to_char(:2, 'YYYY-MM-DD'), '0000-00-00', to_date(NULL), :2) where user#=:1
CURBOUND*3*71====>  SELECT VALUE$ FROM SYS.PROPS$ WHERE NAME = 'OGG_TRIGGER_OPTIMIZATION'
CURBOUND*8*76====> merge into t using (select 'ABC' txt from dual) s on (1 = 1) when matched then update set t.txt = s.txt

5 rows merged.

SQL> 



SY.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39708974
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYElicДля тех, кто в танке: никаким.

В общем случае таки да, а зa исключением MERGE Find triggering statement.

SY.

Спасибо.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39708979
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYВ общем случае таки даСоломон, ты уверен в "общности", а следовательно в надёжности "решения"? Что оно не сломается в нетепличных условиях?
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39709346
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicСоломон, ты уверен в "общности", а следовательно в надёжности "решения"? Что оно не сломается в нетепличных условиях?

C INSERT/UPDATE/DELETE/SELECT/MERGE полет нормальный. INSERT ALL и всякую экзотику типа WITH FUNCTION не тестировал. TC может протeстировать. Ну и вообще это баловство нужное разве то для hacking/reverse engineering.

SY.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39709383
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYC INSERT/UPDATE/DELETE/SELECT/MERGE полет нормальный.Я про со 100-%-ной точностью сказать "Вот, это он".
SYНу и вообще это баловство нужное разве то для hacking/reverse engineering.То-то и оно.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39709606
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYC INSERT/UPDATE/DELETE/SELECT/MERGE полет нормальный

то, что нужно.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39709607
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYдля hacking/reverse engineering.

SY.

да, аудит ещё.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39709645
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MadDogда, аудит ещё.не встречал систем, где пользователи массово пишут инсерты, а надзиратель их наказывает за неправильное количество пробелов форматирования.
...
Рейтинг: 0 / 0
в 9i есть функция ora_sql_text
    #39709680
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-MadDogда, аудит ещё.не встречал систем, где пользователи массово пишут инсерты, а надзиратель их наказывает за неправильное количество пробелов форматирования.

я тоже не встречал.
надзиратель пригодился бы.
и не только пользователям.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / в 9i есть функция ora_sql_text
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]