Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_OUTPUT.GET_STATUS ? / 25 сообщений из 36, страница 1 из 2
04.05.2018, 14:50
    #39640093
Nobody111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Можно ли получить, в сессии сейчас dbms_output.enable или disable?
Делаю добавку в код, который выдает в serveroutput дополнительную информацию, но создает некоторое замедление выполнения. Если output выключен, лучше было бы этот код не выполнять.
...
Рейтинг: 0 / 0
04.05.2018, 15:06
    #39640111
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Nobody111, Можно ручками, через контекстные переменные (sys_context)
...
Рейтинг: 0 / 0
04.05.2018, 15:14
    #39640121
Nobody111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
j2k, ручками не то. Пользователь может в sqlplus сказать set serveroutput on, и зачем пользователю тут лишние движения ручками...
...
Рейтинг: 0 / 0
04.05.2018, 15:16
    #39640126
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Nobody111Можно ли получить, в сессии сейчас dbms_output.enable или disable? 21356511
...
Рейтинг: 0 / 0
04.05.2018, 15:30
    #39640138
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> set serverout on
SQL> begin
  2    dbms_output.put_line('132');
  3    begin
  4      dbms_output.put(rpad(1,32767));
  5      dbms_output.put(1);
  6      -- OFF
  7    exception
  8      when others then
  9        null; --ON
 10    end;
 11    dbms_output.put_line('465');
 12  end;
 13  /
132
465

PL/SQL procedure successfully completed.

SQL> set serverout off
SQL> /

PL/SQL procedure successfully completed.
...
Рейтинг: 0 / 0
04.05.2018, 15:44
    #39640153
Nobody111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Elic, класс, спасибо!
...
Рейтинг: 0 / 0
04.05.2018, 15:51
    #39640155
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Nobody111,

если буффер полностью Ваш (до Вас никто на добавлял строки) то можно через одноместо
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare
 v1 varchar2(100);
 s  number;
begin
 dbms_output.disable;
 dbms_output.put_line('test');
 dbms_output.get_line(v1,s);
 if s=1 then
   null; --disable
 else
   null; --enable
 end if; 
 dbms_output.enable;
 dbms_output.put_line(v1||' '||s);
end;
/




зы
как-то ж dbms_output знает свой статус, наверняка enable/disable возводят пакетный флажок
разврапить пакет и глянуть шо там

.....
stax
...
Рейтинг: 0 / 0
04.05.2018, 15:57
    #39640158
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Staxто можно через одноместоСтанислав, я показал то место.
...
Рейтинг: 0 / 0
04.05.2018, 16:01
    #39640160
Nobody111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Staxзы
как-то ж dbms_output знает свой статус, наверняка enable/disable возводят пакетный флажок
разврапить пакет и глянуть шо там

.....
stax
да, тоже такие смутные мысли бродили, надо будет как нибудь...
...
Рейтинг: 0 / 0
04.05.2018, 16:02
    #39640163
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Elic,

красивое решения, не видел (страничку не обновлял) и не знал о таком решении
причем об ORU-10028 я знал
думал что он все-таки добавит в буффер rpad(1,32767);
.....
stax
...
Рейтинг: 0 / 0
04.05.2018, 16:16
    #39640175
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Staxпричем об ORU-10028 я знал
думал что он все-таки добавит в буффер rpad(1,32767);
Код: plsql
1.
2.
3.
4.
5.
6.
      STRLEN := NVL(LENGTHB(A), 0);
      IF ((STRLEN + LINEBUFLEN) > 32767) THEN
        LINEBUFLEN := 0; BUF(PUTIDX) := '';
        RAISE_APPLICATION_ERROR(-20000, 'ORU-10028: line length overflow, ' ||
          'limit of 32767 bytes per line');
      END IF;

...
Рейтинг: 0 / 0
04.05.2018, 16:27
    #39640186
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
ElicStaxпричем об ORU-10028 я знал
думал что он все-таки добавит в буффер rpad(1,32767);
Код: plsql
1.
2.
3.
4.
5.
6.
      STRLEN := NVL(LENGTHB(A), 0);
      IF ((STRLEN + LINEBUFLEN) > 32767) THEN
        LINEBUFLEN := 0; BUF(PUTIDX) := '';
        RAISE_APPLICATION_ERROR(-20000, 'ORU-10028: line length overflow, ' ||
          'limit of 32767 bytes per line');
      END IF;



спасибо, не подозревал об LINEBUFLEN := 0; BUF(PUTIDX) := '';

исходка? как насчет недокументированного "флажка" для enable/disable, спрятали?

зы
хотя уже не актуально
21387793 красиво работает

.....
stax
...
Рейтинг: 0 / 0
04.05.2018, 16:35
    #39640197
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Staxхотя уже не актуально
21387793 красиво работаетОсталось выяснить, что за вычисления делаются ради dbms_output, чтобы такая проверка оказалась дешевле холостого вызова put_line.
...
Рейтинг: 0 / 0
04.05.2018, 17:38
    #39640277
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
-2-,

и надо чутку допилить, а то будет неправильно "слетать" при маленьком size

....
stax
...
Рейтинг: 0 / 0
04.05.2018, 17:50
    #39640289
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Staxи надо чутку допилить, а то будет неправильно "слетать" при маленьком sizeА просто проверить при
Код: plsql
1.
set serverout on size 10000

?
...
Рейтинг: 0 / 0
04.05.2018, 21:53
    #39640424
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
ElicА просто проверить при ?
согласен, Nobody111 не важно из-за чего слетает, важен токо факт

.....
stax
...
Рейтинг: 0 / 0
05.05.2018, 07:33
    #39640541
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Staxне важно из-за чего слетает,Это твои домыслы. "Слетает" так же.
...
Рейтинг: 0 / 0
05.05.2018, 09:24
    #39640558
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
-2-Staxхотя уже не актуально
21387793 красиво работаетОсталось выяснить, что за вычисления делаются ради dbms_output, чтобы такая проверка оказалась дешевле холостого вызова put_line.

добрался до компа
для теста убрал dbms_output.put(1);

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
SQL> ed
Wrote file afiedt.buf

  1  begin
  2    dbms_output.enable(null);
  3    dbms_output.put_line('132');
  4     begin
  5       dbms_output.put(rpad(1,32765));
  6  --     dbms_output.put(1);
  7       -- OFF
  8  --    exception
  9  --      when others then
 10  --        null; --ON
 11      end;
 12      dbms_output.put_line('465');
 13* end;
SQL> /
begin
*
ERROR at line 1:
ORA-20000: ORU-10028: line length overflow, limit of 32767 bytes per line
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
ORA-06512: at "SYS.DBMS_OUTPUT", line 91
ORA-06512: at "SYS.DBMS_OUTPUT", line 112
ORA-06512: at line 12


SQL> ed
Wrote file afiedt.buf

  1  begin
  2    dbms_output.enable(2000);
  3    dbms_output.put_line('132');
  4     begin
  5       dbms_output.put(rpad(1,32765));
  6  --     dbms_output.put(1);
  7       -- OFF
  8  --    exception
  9  --      when others then
 10  --        null; --ON
 11      end;
 12      dbms_output.put_line('465');
 13* end;
SQL> /
begin
*
ERROR at line 1:
ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes
ORA-06512: at "SYS.DBMS_OUTPUT", line 32
ORA-06512: at "SYS.DBMS_OUTPUT", line 97
ORA-06512: at line 5


SQL>




у меня слетает при 32765 (мож от версии зависит/фича)

для себя сделаю разные коды возврата для ORU-10027 и ORU-10028

зы
повторюсь
для obody111 ето не важно

зыы
интересно
ORU уникальны, или могут пересекатся в зависимости от пакета?

.....
stax
...
Рейтинг: 0 / 0
06.05.2018, 17:28
    #39641007
Nobody111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
StaxElicА просто проверить при ?
согласен, Nobody111 не важно из-за чего слетает, важен токо факт

.....[email=]
staxтеоретически не все равно, 5000 за глаза хватит, а практически вероятностью того, что будет зада нsize, можно пренебречь
...
Рейтинг: 0 / 0
07.05.2018, 03:56
    #39641169
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Elic,

спасибо, сохранил себе в таком виде
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace 
function is_output_enabled return boolean deterministic is
   str_long constant varchar(32767):=rpad('x',32767);
begin
   dbms_output.new_line;
   dbms_output.put(str_long);
   dbms_output.put(str_long);
   return false;
exception 
   when others then 
      return true; 
end;
/



зы. с компилированной функцией гораздо быстрее
Код: 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.
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.
SQL> set serverout on size 10000
SQL> begin
  2     dbms_output.put_line('old data');
  3     if is_output_enabled
  4        then dbms_output.put_line('enabled');
  5        else raise_application_error(-20000,'disabled');
  6     end if;
  7  end;
  8  /
old data
enabled

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01
SQL> set serverout off
SQL> begin
  2     dbms_output.put_line('old data');
  3     if is_output_enabled
  4        then dbms_output.put_line('enabled');
  5        else raise_application_error(-20000,'disabled');
  6     end if;
  7  end;
  8  /
begin
*
ERROR at line 1:
ORA-20000: disabled
ORA-06512: at line 5


Elapsed: 00:00:00.01
SQL> declare
  2     function is_output_enabled return boolean deterministic is
  3        str_long constant varchar(32767):=rpad('x',32767);
  4     begin
  5        dbms_output.new_line;
  6        dbms_output.put(str_long);
  7        dbms_output.put(str_long);
  8        return false;
  9     exception
 10        when others then
 11           return true;
 12     end;
 13  begin
 14     dbms_output.put_line('old data');
 15     if is_output_enabled
 16        then dbms_output.put_line('enabled');
 17        else raise_application_error(-20000,'disabled');
 18     end if;
 19  end;
 20  /
declare
*
ERROR at line 1:
ORA-20000: disabled
ORA-06512: at line 17


Elapsed: 00:00:03.08

...
Рейтинг: 0 / 0
07.05.2018, 07:59
    #39641191
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
xtender
Код: plsql
1.
   dbms_output.new_line;

Искажает буфер.
xtender
Код: plsql
1.
2.
SQL> declare
  2     function is_output_enabled return boolean deterministic is

Во-первых, не понимаю, зачем это вообще нужно.
Во-вторых, версионно:
Код: plsql
1.
2.
3.
4.
5.
   function is_output_enabled return boolean deterministic is
            *
ERROR at line 2:
ORA-06550: line 2, column 13:
PLS-00712: illegal option for subprogram IS_OUTPUT_ENABLED


xtenderзы. с компилированной функцией гораздо быстрее
Код: plsql
1.
Elapsed: 00:00:03.08

Тебе показалось. Неужели чудовищная неправдоподобность величины не вызвала сомнений?
...
Рейтинг: 0 / 0
07.05.2018, 09:24
    #39641206
Nobody111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
ElicВо-вторых, версионно:
Код: plsql
1.
2.
3.
4.
5.
   function is_output_enabled return boolean deterministic is
            *
ERROR at line 2:
ORA-06550: line 2, column 13:
PLS-00712: illegal option for subprogram IS_OUTPUT_ENABLED




Ну, 32767 - тоже версионно. Когда-то предел длины строки здесь был 256.
...
Рейтинг: 0 / 0
07.05.2018, 09:39
    #39641216
Nobody111
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Точнее, 255, вроде бы в 9.2 еще.
...
Рейтинг: 0 / 0
07.05.2018, 09:46
    #39641224
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
Nobody111Когда-то предел длины строки здесь был 256.Во-первых, совсем не здесь, а во-вторых, не 256.
...
Рейтинг: 0 / 0
07.05.2018, 12:13
    #39641329
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DBMS_OUTPUT.GET_STATUS ?
ElicИскажает буфер.это лучше, чем потерять put...

ElicВо-вторых, версионно:это не то "версионно", из-за которого стоило бы переживать...

ElicТебе показалось.отнюдь... я прекрасно знаю где, когда и куда это время уходит
Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
SQL> select * from v$version;

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0
PL/SQL Release 12.2.0.1.0 - Production                                                    0
CORE    12.2.0.1.0      Production                                                                0
TNS for Linux: Version 12.2.0.1.0 - Production                                            0
NLSRTL Version 12.2.0.1.0 - Production                                                    0

Elapsed: 00:00:00.30

SQL> @plans/flush_sql.sql
Enter value for sql_id: c8wpgq87py4ax

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.19
SQL> @tests/output
declare
*
ERROR at line 1:
ORA-20000: disabled
ORA-06512: at line 17


Elapsed: 00:00:03.13
SQL> @tests/output
declare
*
ERROR at line 1:
ORA-20000: disabled
ORA-06512: at line 17


Elapsed: 00:00:00.29
SQL> @plans/flush_sql.sql
Enter value for sql_id: c8wpgq87py4ax

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.14
SQL> @tests/output
declare
*
ERROR at line 1:
ORA-20000: disabled
ORA-06512: at line 17


Elapsed: 00:00:03.17

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


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