Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / в 9i есть функция ora_sql_text / 25 сообщений из 30, страница 1 из 2
20.01.2004, 10:10
    #32381241
yon_brover
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
Кто с этой функцией работал? Приведите пример использования.
Требуется отлавливать текст открытого курсора, в котором
произошла ошибка.
...
Рейтинг: 0 / 0
20.01.2004, 11:09
    #32381364
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
И что это за функция?
В доке я по ней ничего не нашел (плохо искал?)
...
Рейтинг: 0 / 0
20.01.2004, 11:14
    #32381381
yon_brover
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
Код: 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
20.01.2004, 15:48
    #32381885
vc123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
<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
20.01.2004, 18:54
    #32382279
yon_brover
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
Почему эта замечательная функция может применяться только в триггере after servererror on database? Ее было бы удобно использовать не только в триггерах.
...
Рейтинг: 0 / 0
20.01.2004, 19:08
    #32382301
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
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
20.01.2004, 19:18
    #32382309
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
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
20.01.2004, 19:23
    #32382312
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
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
20.01.2004, 19:46
    #32382331
yon_brover
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
Великолепно!
А могу ли я в BEFORE INSERT триггере на таблицу лога ошибок
использовать функцию, аналогичную, ora_sql_text, но чтобы она выдавала не
INSERT INTO <таблицу лога ошибок> ...,
а SQL statement, вызвавший ошибку?
...
Рейтинг: 0 / 0
21.01.2004, 02:31
    #32382420
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
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
Период между сообщениями больше года.
25.09.2018, 13:06
    #39707632
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
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
25.09.2018, 14:18
    #39707708
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
MadDogправда триггер не before, а after.не систем, а дмл.
...
Рейтинг: 0 / 0
25.09.2018, 14:33
    #39707719
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
-2-MadDogправда триггер не before, а after.не систем, а дмл.

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

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

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


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

support.oracle.comDoc ID 438324.1

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

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

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

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

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

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

.....
stax

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

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

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

SY.
...
Рейтинг: 0 / 0
26.09.2018, 13:58
    #39708447
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
Хотя и 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
27.09.2018, 06:24
    #39708974
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
в 9i есть функция ora_sql_text
SYElicДля тех, кто в танке: никаким.

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

SY.

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

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

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


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