Как получить значение переменной из хранимой процедуры в DB2? - PullRequest
2 голосов
/ 22 марта 2010

Кажется, это должно быть очень просто ... в любом случае, это в MS SQL Server

Как можно получить значение переменной в хранимой процедуре DB2? Скажем, у меня есть следующая хранимая процедура:

CREATE PROCEDURE etl.TestABC( 
) 
LANGUAGE SQL 
  BEGIN 
    declare      Stmt              varchar(2048); 
    set Stmt = 'this is a test';
-- print Stmt;
-- select Stmt;


    return 0; 
END @ 

Я бы хотел распечатать значение Stmt после его установки. Печать не работает, выбор не работает. Кто-то сказал, что я должен сначала вставить его в таблицу, а затем получить после того, как запустил хранимую процедуру. Это действительно необходимо?

Спасибо, Sylvia

РЕДАКТИРОВАТЬ: я должен был прояснить, что я хочу видеть значение Stmt каждый раз после его установки, и мне может потребоваться установить его несколько раз в рамках одной хранимой процедуры.

Ответы [ 4 ]

6 голосов
/ 23 марта 2010

Если вы хотите видеть значения во время разработки / тестирования вашей хранимой процедуры, вам следует использовать IBM Data Studio и отладить вашу хранимую процедуру. Это обеспечивает нормальную функциональность отладчика, поэтому вы можете видеть значение переменных при выполнении вашей процедуры.

Однако, если вы просто хотите выполнить свою хранимую процедуру и просмотреть историю значений, я предлагаю создать глобальную временную таблицу и вставить в нее строку в вашем коде:

declare global temporary table StmtHistory (
  when timestamp not null with default current timestamp, 
  stmt varchar(2048) not null
  ) on commit preserve rows;

Затем в пунктах вашей хранимой процедуры добавьте:

insert into session.StmtHistory (stmt) values (stmt);

После выполнения вашей хранимой процедуры вы можете запросить таблицу session.StmtHistory и посмотреть значения, которые вы ищете.

Кроме того, в DB2 9.7 добавлена ​​совместимость с Oracle, поэтому если вы используете эту версию, вы можете использовать DBMS_OUTPUT.PUT_LINE и DBMS_OUTPUT.GET_LINES, если хотите, для этого.

3 голосов
/ 22 марта 2010

Вы должны объявить переменную в конструкторе процедуры:

CREATE PROCEDURE etl.TestABC(
    OUT Stmt varchar(2048)
) 
LANGUAGE SQL 
BEGIN 
    --    declare      Stmt              varchar(2048); 
    set Stmt = 'this is a test';
    -- print Stmt;
    -- select Stmt;

    return 0;
END @ 

Это позволит вам получить к нему доступ, т.е. с консоли:

call etl.TestABC(?)

с выводом, похожим на это:

Value of output parameters

Parameter Name  : STMT
Parameter Value : this is a test

Return Status = 0

NB: В данный момент у меня нет доступа к нашему серверу DB2, но я считаю, что вышеприведенное должно помочь. Примеры на основе: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.sql.doc/doc/t0007055.htm

1 голос
/ 26 сентября 2014

Вы можете использовать систему журналирования, такую ​​как 'log4db2', которая позволяет вам писать сообщения в таблице или файле. Сообщения контролируются регистраторами, которые могут быть активными или неактивными.

С log4db2 вам не нужно удалять отладочные сообщения, которые могут быть использованы в будущем. Вы просто деактивируете ассоциированный регистратор или уменьшите уровень регистрации, точно так же, как вы делаете с 'log4j'

Проверьте эту утилиту по адресу: https://github.com/angoca/log4db2

1 голос
/ 22 марта 2010

Попробуйте следующую строку:

values Stmt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...