powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DBMS_OUTPUT
13 сообщений из 13, страница 1 из 1
DBMS_OUTPUT
    #37438271
Bart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет,
Есть-ли какая-нибудь возможность получать оутпут из DBMS_OUTPUT используя .Net provider?
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37438355
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bart,

Здравствуйте.

Вроде должна быть.
DBMS_OUTPUT.GET_LINES
и получить строки в output параметр типа array:
IBM Data Server Provider for .NET has been enhanced
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37438655
Bart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Используя примеры процедур из твоей ссылки и вызвав процедуру на выполнение используя CLP
Я увижу следующее:

db2 => SET SERVEROUTPUT ON
DB20000I The SET SERVEROUTPUT command completed successfully.
db2 => CALL proc2

Return Status = 0

PROC1 put this line in the message buffer.
PROC1 put this line in the message buffer.
PROC2 put this line in the message buffer.
PROC1 put this line in the message buffer.
PROC2 put this line in the message buffer.
db2 =>

(Эта фича позволяет не меняя структуру процедуры,- что очень важно (типа использования output параметр типа array))
получать некие сообщения из процедуры

Использую .Net приложение (с .Net провайдером) получить данные сообщения невозможно(насколько я вижу),- что очень огорчает
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37438714
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bart,

Я не специалист в .Net технологиях, но общий смысл в следующем:

Пусть есть процедура proc, внутри которой есть вызов dbms_output.put*.
Эти вызовы помещают сообщения в буфер сообщений.
Когда вы вызываете proc из CLP, оно как-то достаёт внутри эти сообщения и выводит в консоль.
Если вы вызываете процедуру из .Net (или любой другой среды, например java), то, чтобы добраться до сообщений, которые она поместила в буфер, надо после вызова этой процедуры вызвать процедуру dbms_output.get*, в выходной параметр-массив которой и будет помещены сообщения.

Т.е. вы не меняете процедуру proc и её вызов, вы только в приложении после её вызова вызываете dbms_output.get*.
Но для этого, конечно, надо модифицировать вызывающее процедуру .Net приложение...
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37438826
Bart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы,
Потыкался немного,
Чтобы включить оутпут, мне нужно вызвать из приложения SET SERVEROUTPUT ON
http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.cmd.doc/doc/r0053562.html

Используя .Net provider, команда падает с ошибкой
ERROR [42601] [IBM][DB2/NT] SQL0104N An unexpected token "SERVEROUTPUT" was found following "SET ". Expected tokens may include: "SSA".

P.S.
"DBMS_OUTPUT.ENABLE" is part of "SET SERVEROUTPUT ON"
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37439167
sadsad_at_tomsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bart,

Я не понимаю зачем это нужно, но сделать это можно вот так:

Код: 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.
            using (DB2Connection con = new DB2Connection("Server=127.0.0.1:50000;Database=test_ora;UID=db2admin;PWD=db2admin; pooling=false;"))
            {
                con.Open();

                using (DB2Command cmd = new DB2Command("call dbms_output.enable()", con))
                {
                    cmd.ExecuteNonQuery();
                    cmd.CommandText = "call dbms_output.put_line('hello')";
                    cmd.ExecuteNonQuery();

                    cmd.CommandText = "call dbms_output.put_line('world')";
                    cmd.ExecuteNonQuery();

                    cmd.CommandText =
                    "BEGIN" + "\r\n" +
                    "     DECLARE l_lines      DBMS_OUTPUT.CHARARR;" + "\r\n" +
                    "     DECLARE l_numlines   INTEGER DEFAULT 10000;" + "\r\n" +
                    "     DECLARE l_result     VARCHAR(32000) DEFAULT '';" + "\r\n" +
                    "     DECLARE i            INTEGER;" + "\r\n" +
                    "     " + "\r\n" +
                    "     --now extract the data" + "\r\n" +
                    "     CALL DBMS_OUTPUT.GET_LINES( l_lines, l_numlines );" + "\r\n" +
                    "     SET i = 1;" + "\r\n" +
                    "     WHILE i <= l_numlines DO" + "\r\n" +
                    "        SET l_result = l_result || l_lines[i] || chr(13) || chr(10);" + "\r\n" +
                    "        SET i = i + 1;" + "\r\n" +
                    "     END WHILE;" + "\r\n" +
                    "     SET @RES = l_result;" + "\r\n" +
                    "END";


                    DB2Parameter par = new DB2Parameter("RES", DB2Type.VarChar);

                    par.Direction = ParameterDirection.Output;

                    cmd.Parameters.Add(par);

                    cmd.ExecuteNonQuery();

                    MessageBox.Show(cmd.Parameters[0].Value.ToString());
                }
            }

...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37439501
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bart,

в java это выглядит так:
java
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CallableStatement cs =  null ;
cs = con.prepareCall("call dbms_output.enable(NULL)");
cs.execute();
cs.close(); cs =  null ;
cs=con.prepareCall("call dbms_output.put_line(?)");
cs.registerOutParameter( 1 , java.sql.Types.VARCHAR);
 int  i;
 for  (i= 1 ; i<= 10 ; i++) {
  cs.setString( 1 , "Message "+i);
  cs.execute();
}
cs.close(); cs =  null ;

cs=con.prepareCall("call dbms_output.get_lines(?, ?)");
cs.registerOutParameter( 1 , java.sql.Types.ARRAY);
cs.registerOutParameter( 2 , java.sql.Types.INTEGER);
cs.setInt( 2 ,  100 );
cs.execute();
java.sql.Array arr = cs.getArray( 1 );
 if  (arr!= null ) {
  String[] msg = (String []) arr.getArray();
   for  (i= 0 ; i<msg.length; i++)
    System.out.println("["+i+"]: "+msg[i]);
}
Или можно в цикле вызывать dbms_output.get_line(?, ?), пока 2-й параметр не станет равным 1.
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37441781
Bart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за ответы (к сожалению, это все частные случаи).
Насчет того, зачем это нужно: Разрабатывается (и уже продается) коробочный продукт в котором есть редактор для выполнения различных стейтментов.
Хотелось в следующую версию, для удобства, включить поддержку вывода оутпута как это сделано в CLP
(Да и клиенты это уже хотят)
P.S.
Ладно, буду PRM создавать
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37441806
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bart...
Хотелось в следующую версию, для удобства, включить поддержку вывода оутпута как это сделано в CLPчто вам мешает в своём редакторе команд после вызова любой команды делать вызов dbms_output.get_line*?
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37442049
Bart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ваш вариант конечно имеет право на жизнь но..
После каждой процедуры выполнять некие вызовы, в особенности если в 99% они не нужны для юзера, как-то нехорошо.

Как я это вижу:
Если юзеру необходим оутпут, он выполняет соотверствующую DB2 команду
SET SERVEROUTPUT ON

После этого, в соответствии с предназначением той комманды сервер сам понимает когда передать событие
(что уменьшает количество лишних вызовов)

((DB2Connection) m_idbConnection).InfoMessage += Connection_InfoMessage;

protected virtual void Connection_InfoMessage(object sender, DB2InfoMessageEventArgs e)
{
}
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37445016
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bart, разработчики-то видят по-другому, так что SET SERVEROUTPUT ON - это команда не серверу, а командному процессору, то есть приложению. Которое, в свою очередь, вызывает DBMS_OUTPUT.ENABLE и потом GET_LINES.
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37445021
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитав /topic/879299&pg=1, решил немного поиграть с DB2-шным PL/SQL (на пробной версии 9.7.4). Фана я от этого совсем не получил. Даже такие крохотные кусочки кода без проблем не переносятся. Производительность тоже не обрадовала. Впридачу ко всему и DBMS_OUTPUT ведёт себя... странно (если это не PL/SQL ведёт себя странно).

Код:
Код: plaintext
DECLARE\n  --p_DecNo  integer     := 274206200820069491214664742303;\n  --p_DecNo  decfloat(34)     := 274206200820069491214664742303;\n  p_DecNo  decfloat( 34 )       :=  1000000000000000000 ;\n  p_Base   decfloat( 34 )      :=  36 ;\n  ---- Characters for conversion\n  v_AnyNo varchar2( 36 ) := \'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\';\n  ---- Variables for conversion\n  n_DecNo  decfloat( 34 )      := p_DecNo;\n  n_Base   decfloat( 34 )      := p_Base;\n  v_Return varchar2 ( 100 )    := NULL;\n  n_Cnt    decfloat( 34 )      :=  0 ;\n  n_Val    decfloat( 34 )      :=  0 ;\nBEGIN\n   ---- Check Base decfloat(34) and decfloat(34) to convert\n--   IF (NOT n_Base BETWEEN 2 AND 36) OR (n_DecNo < 0) THEN\n--      RETURN NULL;\n--   ELSIF (n_DecNo = 0) THEN\n--      RETURN \'0\';\n--   END IF;\n   ---- Initialize Variables\n   v_Return := \'\';\n   n_Cnt    :=  0  ;\n   DBMS_OUTPUT.PUT_LINE(\'  _x_\'||p_DecNo||\'_x_\');\n   ---- Loop and convert\n   WHILE (n_DecNo <>  0 ) LOOP\n      DBMS_OUTPUT.PUT_LINE(\'^^^^^^^^^^^^^^^^^\');\n\n      n_Val    := mod (n_DecNo,power(n_Base,(n_Cnt+ 1 )))/power(n_Base,n_cnt);\n      DBMS_OUTPUT.PUT_LINE(\'n_val=\'|| n_Val );\n\n      n_DecNo  := n_DecNo - (n_Val * power(n_Base,n_Cnt));\n      DBMS_OUTPUT.PUT_LINE(\'n_decno=\'|| n_DecNo);\n\n      v_Return := substr (v_AnyNo, n_Val+ 1 ,  1 ) || v_Return;\n      DBMS_OUTPUT.PUT_LINE(\'v_return=\'|| v_Return);\n\n      n_Cnt    := n_Cnt +  1 ;\n      DBMS_OUTPUT.PUT_LINE(n_Cnt ||\',\'|| n_Val ||\',\'|| n_DecNo ||\',\'|| v_Return);\n\n      DBMS_OUTPUT.PUT_LINE(\'________________\');\n   END LOOP;\n\n   DBMS_OUTPUT.PUT_LINE(\'  Decimal_2_Any_Base(\'||p_DecNo||\',\'||p_Base||\')=\'||v_Return);\n-- EXCEPTION\n--    WHEN OTHERS THEN\n--        RETURN NULL;\nEND;\n/\n


Результат:
Код: plaintext
SQL>\nDECLARE\n--p_DecNo  integer     := 274206200820069491214664742303;\n--p_DecNo  decfloat(34)     := 274206200820069491214664742303;\np_DecNo  decfloat( 34 )       :=  1000000000000000000 ;\np_Base   decfloat( 34 )      :=  36 ;\n---- Characters for conversion\nv_AnyNo varchar2( 36 ) := \'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\';\n---- Variables for conversion\nn_DecNo  decfloat( 34 )      := p_DecNo;\nn_Base   decfloat( 34 )      := p_Base;\nv_Return varchar2 ( 100 )    := NULL;\nn_Cnt    decfloat( 34 )      :=  0 ;\nn_Val    decfloat( 34 )      :=  0 ;\nBEGIN\n---- Check Base Number and Number to convert\n--   IF (NOT n_Base BETWEEN 2 AND 36) OR (n_DecNo < 0) THEN\n--      RETURN NULL;\n--   ELSIF (n_DecNo = 0) THEN\n--      RETURN \'0\';\n--   END IF;\n---- Initialize Variables\nv_Return := \'\';\nn_Cnt    :=  0  ;\nDBMS_OUTPUT.PUT_LINE(\'  _x_\'||p_DecNo||\'_x_\');\n---- Loop and convert\nWHILE (n_DecNo <>  0 ) LOOP\nDBMS_OUTPUT.PUT_LINE(\'^^^^^^^^^^^^^^^^^\');\n\nn_Val    := mod (n_DecNo,power(n_Base,(n_Cnt+ 1 )))/power(n_Base,n_cnt);\nDBMS_OUTPUT.PUT_LINE(\'n_val=\'|| n_Val );\n\nn_DecNo  := n_DecNo - (n_Val * power(n_Base,n_Cnt));\nDBMS_OUTPUT.PUT_LINE(\'n_decno=\'|| n_DecNo);\n\nv_Return := substr (v_AnyNo, n_Val+ 1 ,  1 ) || v_Return;\nDBMS_OUTPUT.PUT_LINE(\'v_return=\'|| v_Return);\n\nn_Cnt    := n_Cnt +  1 ;\nDBMS_OUTPUT.PUT_LINE(n_Cnt ||\',\'|| n_Val ||\',\'|| n_DecNo ||\',\'|| v_Return);\n\nDBMS_OUTPUT.PUT_LINE(\'________________\');\nEND LOOP;\n\nDBMS_OUTPUT.PUT_LINE(\'  Decimal_2_Any_Base(\'||p_DecNo||\',\'||p_Base||\')=\'||v_Return);\n-- EXCEPTION\n--    WHEN OTHERS THEN\n--        RETURN NULL;\nEND\n/\n  _x_1000000000000000000_x_\n^^^^^^^^^^^^^^^^^\nn_val= 28 \nn_decno= 999999999999999972 \nv_return=S\n 1 , 28 , 999999999999999972 ,S\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 33 \nn_decno= 999999999999998784 \nv_return=XS\n 2 , 33 , 999999999999998784 ,XS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 20 \nn_decno= 999999999999972864 \nv_return=KXS\n 3 , 20 , 999999999999972864 ,KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 4 \nn_decno= 999999999999786240 \nv_return=4KXS\n 4 , 4 , 999999999999786240 ,4KXS\n________________\n  _x_1000000000000000000_x_\n^^^^^^^^^^^^^^^^^\nn_val= 28 \nn_decno= 999999999999999972 \nv_return=S\n 1 , 28 , 999999999999999972 ,S\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 33 \nn_decno= 999999999999998784 \nv_return=XS\n 2 , 33 , 999999999999998784 ,XS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 20 \nn_decno= 999999999999972864 \nv_return=KXS\n 3 , 20 , 999999999999972864 ,KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 4 \nn_decno= 999999999999786240 \nv_return=4KXS\n 4 , 4 , 999999999999786240 ,4KXS\n________________\nn_val= 33 \nn_decno= 999999999944358912 \nv_return=X4KXS\n 5 , 33 , 999999999944358912 ,X4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 35 \nn_decno= 999999997828042752 \nv_return=ZX4KXS\n 6 , 35 , 999999997828042752 ,ZX4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 33 \nn_decno= 999999925994225664 \nv_return=XZX4KXS\n 7 , 33 , 999999925994225664 ,XZX4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 14 \nn_decno= 999998828895928320 \nv_return=EXZX4KXS\n 8 , 14 , 999998828895928320 ,EXZX4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 14 \n  _x_1000000000000000000_x_\n^^^^^^^^^^^^^^^^^\nn_val= 28 \nn_decno= 999999999999999972 \nv_return=S\n 1 , 28 , 999999999999999972 ,S\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 33 \nn_decno= 999999999999998784 \nv_return=XS\n 2 , 33 , 999999999999998784 ,XS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 20 \nn_decno= 999999999999972864 \nv_return=KXS\n 3 , 20 , 999999999999972864 ,KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 4 \nn_decno= 999999999999786240 \nv_return=4KXS\n 4 , 4 , 999999999999786240 ,4KXS\n________________\nn_val= 33 \nn_decno= 999999999944358912 \nv_return=X4KXS\n 5 , 33 , 999999999944358912 ,X4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 35 \nn_decno= 999999997828042752 \nv_return=ZX4KXS\n 6 , 35 , 999999997828042752 ,ZX4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 33 \nn_decno= 999999925994225664 \nv_return=XZX4KXS\n 7 , 33 , 999999925994225664 ,XZX4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 14 \nn_decno= 999998828895928320 \nv_return=EXZX4KXS\n 8 , 14 , 999998828895928320 ,EXZX4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 14 \nv_return=EEXZX4KXS\n 9 , 14 , 999959333357223936 ,EEXZX4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 18 \nn_decno= 998131254137192448 \nv_return=IEEXZX4KXS\n 10 , 18 , 998131254137192448 ,IEEXZX4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 21 \nn_decno= 921351926895869952 \nv_return=LIEEXZX4KXS\n 11 , 21 , 921351926895869952 ,LIEEXZX4KXS\n________________\n^^^^^^^^^^^^^^^^^\nn_val= 7 \nn_decno= 0 \nv_return=7LIEEXZX4KXS\n 12 , 7 , 0 ,7LIEEXZX4KXS\n________________\n  Decimal_2_Any_Base( 1000000000000000000 , 36 )=7LIEEXZX4KXS\n\nDB250000I: Команда выполнена успешно.\n\nSQL>\nexit;\n
...
Рейтинг: 0 / 0
DBMS_OUTPUT
    #37445025
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строка " _x_1000000000000000000_x_" встречается три раза, хотя должна была быть всего один раз.
В Oracle (с заменой decfloat(34) на number) таких аномалий нет.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DBMS_OUTPUT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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