2010-03-22 5 views
2

Cela semble être très facile ... de toute façon, c'est dans MS SQL ServerComment obtenir une valeur de variable à l'intérieur d'une procédure stockée dans DB2?

Dans une procédure stockée DB2, comment puis-je simplement obtenir la valeur d'une variable? Disons que j'ai la procédure stockée suivante:

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


    return 0; 
END @ 

Je voudrais imprimer la valeur de Stmt après l'avoir définie. L'impression ne fonctionne pas, la sélection ne fonctionne pas. Quelqu'un a dit que je devais d'abord l'insérer dans une table, puis l'obtenir après avoir exécuté la procédure stockée. Est-ce vraiment nécessaire?

Merci, Sylvia

EDIT: J'aurais fait clair que je veux voir la valeur de Stmt chaque fois après avoir mis, et je avoir besoin de définir plusieurs fois dans la même procédure stockée.

Répondre

6

Si vous voulez voir les valeurs alors que vous développez/tester votre procédure stockée, vous devez utiliser IBM Data Studio et débogage votre procédure stockée. Cela fournit une fonctionnalité de débogage normale, de sorte que vous pouvez voir la valeur des variables lors de l'exécution de la procédure.

Cependant, si vous voulez juste d'exécuter votre procédure stockée et voir une histoire de valeurs, je suggère la création d'une table temporaire globale, et l'insertion d'une ligne dans dans votre code:

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

Ensuite, à des points dans votre procédure stockée, ajoutez:

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

Une fois que vous exécutez votre procédure stockée, vous pouvez interroger la table session.StmtHistory et voir les valeurs que vous recherchez. De plus, DB2 9.7 a ajouté la compatibilité Oracle, donc si vous utilisez cette version, vous pouvez réellement utiliser DBMS_OUTPUT.PUT_LINE et DBMS_OUTPUT.GET_LINES pour accomplir ceci, si vous préférez.

+0

Merci Ian. Nous avons écrit des tables temporaires pour obtenir les valeurs, mais nous allons essayer la méthode DBMS_OUTPUT.PUT_LINE. Il semble y avoir des instructions complètes ici: http://www.ibm.com/developerworks/data/library/techarticle/0302izuha/0302izuha.html#download – Sylvia

3

vous devez déclarer la variable dans le constructeur de la procédure:

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 @ 

Cela vous permettra d'y accéder par exemple à partir de la console:

call etl.TestABC(?) 

avec une sortie similaire à celle-ci:

Value of output parameters 

Parameter Name : STMT 
Parameter Value : this is a test 

Return Status = 0 

NB: Je n'ai pas accès à notre serveur DB2 pour l'instant, mais je crois que ce qui précède devrait faire l'affaire. Exemples sur la base: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.sql.doc/doc/t0007055.htm

+0

Merci pour les commentaires. Que se passe-t-il si je modifie la variable à plusieurs points de la procédure stockée et que je veux afficher la valeur à chaque point? Il semble que ce qui précède produirait juste la dernière valeur de la variable si je la lis bien ... – Sylvia

+0

Correct, cela vous laisse avec l'état final de la variable après la fin de la procédure. J'ai peur de ne pas savoir comment obtenir des valeurs intermédiaires autres que (1) en utilisant plusieurs variables OUT; (2) scinder votre procédure unique en plusieurs procédures (où chacune vous donnerait sa propre valeur finale); ou (3) stocker des résultats intermédiaires dans une table. Personnellement, je ne pense pas que vous puissiez exposer nativement les variables internes de la procédure dans PL/SQL autrement qu'en les définissant comme des variables OUT. Les gens plus expérimentés: s'il vous plaît aviser s'il y a un meilleur moyen, cela m'intéresserait aussi. THX! – MicE

1

Essayez la ligne suivante:

values Stmt; 
+0

Je reçois les valeurs suivantes " SQL0104N Un jeton inattendu" (Stmt); valeurs Stmt "a été trouvé suite" – Sylvia

+0

il semble que quelque chose d'autre est funky là-bas. D'où vient le 'values ​​(Stmt)'? vous pouvez aussi essayer quelque chose comme 'select * from (valeurs '34') foo' –

1

Vous pouvez utiliser un système de journalisation tel que 'log4db2' qui vous permet d'écrire des messages dans une table ou un fichier. Les messages sont contrôlés par des enregistreurs qui peuvent être actifs ou inactifs.

Avec log4db2, vous n'avez pas besoin de supprimer les messages de débogage qui pourraient être utilisés dans le futur.Vous désactivez simplement l'enregistreur associé, ou de réduire le niveau de journalisation, exactement comme vous le faites avec « log4j »

Vérifiez que l'utilitaire à: https://github.com/angoca/log4db2

Questions connexes