2 Stimmen

Wie man Variablenwert aus einer gespeicherten Prozedur in DB2 erhalten?

Das sollte eigentlich ganz einfach sein... jedenfalls ist es in MS SQL Server

Wie kann ich in einer DB2 Stored Procedure einfach den Wert einer Variablen abrufen? Angenommen, ich habe die folgende gespeicherte Prozedur:

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

    return 0; 
END @ 

Ich möchte den Wert von Stmt ausdrucken, nachdem ich ihn festgelegt habe. Drucken funktioniert nicht, Select funktioniert nicht. Jemand sagte, ich müsse den Wert zuerst in eine Tabelle einfügen und ihn dann abrufen, nachdem ich die gespeicherte Prozedur ausgeführt habe. Ist das wirklich notwendig?

Danke! Sylvia

EDIT: Ich sollte klarer gemacht haben, dass ich den Wert von Stmt jedes Mal sehen möchte, nachdem ich es festgelegt, und ich kann es mehrere Male innerhalb der gleichen gespeicherten Prozedur festlegen müssen.

6voto

Ian Bjorhovde Punkte 10676

Wenn Sie die Werte sehen möchten, während Sie Ihre gespeicherte Prozedur entwickeln/testen, sollten Sie IBM Data Studio verwenden und Ihre gespeicherte Prozedur debuggen. Dies bietet normale Debugger-Funktionen, so dass Sie den Wert der Variablen sehen können, während Ihre Prozedur ausgeführt wird.

Wenn Sie jedoch nur Ihre gespeicherte Prozedur ausführen und eine Historie der Werte sehen möchten, schlage ich vor, eine globale temporäre Tabelle zu erstellen und eine Zeile in diese Tabelle in Ihrem Code einzufügen:

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

Fügen Sie dann an einigen Stellen in Ihrer gespeicherten Prozedur hinzu:

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

Nachdem Sie Ihre gespeicherte Prozedur ausgeführt haben, können Sie die Tabelle abfragen session.StmtHistory und sehen Sie die Werte, nach denen Sie suchen.

Außerdem wurde mit DB2 9.7 die Oracle-Kompatibilität hinzugefügt. Wenn Sie also diese Version verwenden, können Sie möglicherweise DBMS_OUTPUT.PUT_LINE und DBMS_OUTPUT.GET_LINES verwenden, um dies zu erreichen, wenn Sie dies bevorzugen.

3voto

MicE Punkte 4912

Müssen Sie die Variable im Konstruktor der Prozedur deklarieren:

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 @ 

So können Sie z. B. von der Konsole aus darauf zugreifen:

call etl.TestABC(?)

mit einer ähnlichen Ausgabe wie dieser:

Value of output parameters

Parameter Name  : STMT
Parameter Value : this is a test

Return Status = 0

NB: Ich habe im Moment keinen Zugang zu unserem DB2-Server, aber ich glaube, dass die obige Lösung ausreichen sollte. Beispiele basierend auf: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.sql.doc/doc/t0007055.htm

1voto

Peter Schuetze Punkte 15915

Versuchen Sie die folgende Zeile:

values Stmt;

1voto

AngocA Punkte 7545

Sie können ein Protokollierungssystem wie 'log4db2' verwenden, mit dem Sie Meldungen in eine Tabelle oder Datei schreiben können. Die Meldungen werden von Loggern gesteuert, die aktiv oder inaktiv sein können.

Mit log4db2 müssen Sie keine Debugging-Meldungen löschen, die Sie in Zukunft noch verwenden könnten. Sie deaktivieren einfach den zugehörigen Logger oder reduzieren den Logging-Level, genau wie bei 'log4j'

Überprüfen Sie dieses Dienstprogramm unter: https://github.com/angoca/log4db2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X