2010-07-19 9 views
0

Je suis très proche de l'exécution de ma première procédure stockée. Celui-ci compile, mais quand je le lance avec call test.fttest5('YEAR'); il renvoie une erreurQuel est le problème avec cette procédure stockée?

Etat SQL: 22001 Code fournisseur: -303 Message: [SQL0303] variable hôte * N pas compatible. Cause . . . . . : FETCH, SELECT, CALL, SET, VALUES INTO, GET DIAGNOSTICS, GET DESCRIPTOR ou SET DESCRIPTOR ne peuvent pas être effectués car le type de données de la variable hôte * N n'est pas compatible avec le type de données de l'élément de liste correspondant.

De même, comment spécifier un type de données illimité dans ma procédure stockée? J'ai essayé DECLARE temp VARCHAR(MAX); mais cela n'a pas fonctionné. Ma plate-forme est ISeries DB2 V5R4.

create procedure test.fttest5 
    (IN ftExpression CHARACTER(30)) 
    language sql 
    reads sql data 
    dynamic result sets 1 
    begin 

    declare cmd VARCHAR(50); 
    declare whr VARCHAR(50) 
; 

    declare x cursor for sl; 
    set cmd='select * from testSchema.tempTable' ; 
    if ftExpression IS NOT NULL 
THEN 
    set whr= ftExpression; 
    END IF; 

    set cmd=cmd || CASE WHEN whr IS NULL THEN '' ELSE ' ORDER BY ' || whr END; 
    prepare sl from cmd; 
    open x; 
    return; 
    end 
    ; 

Répondre

2

Je crois que l'erreur que vous obtenez ici se produit réellement avant même que votre procédure soit invoquée. Vous avez la procédure définie avec un paramètre qui est un CHAR mais vous l'appelez avec un VARCHAR. Lorsque vous tapez SQL de manière interactive comme si les paramètres venaient en tant que VARCHAR.

Essayez d'appeler comme ceci: call test.fttest5(CHAR('YEAR'))

Ou vous pouvez changer le paramètre à un VARCHAR aussi, si vous voulez toujours tester l'appeler avec un CHAR pour voir ce qui se passerait. Mais je pense qu'il vous manque la ligne SET RESULT SETS CURSOR x. Aussi je mettrais la préparation avant la déclaration car je pense que l'ordre pourrait être important.

La documentation IBM est au http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzaik/rzaikspresultsets.htm.

+0

Merci, je vais regarder dans ce que vous avez dit et garder ce fil posté! –

+0

compris, merci. Vous étiez sur place. –

1

Sélection * est mauvais, surtout si vous sélectionnez des vues complexes ou grandes.

Les curseurs sont généralement mauvais car vous parcourez chaque ligne au lieu de travailler avec des ensembles.

Pensez-vous également s'il y a besoin d'un SQL dynamique?

Quel est le but de cette procédure stockée? Il semble plutôt simple et je me demande si vous pouvez le réécrire en utilisant des ensembles, au lieu d'itérer avec le curseur?

+0

Merci pour la réponse, c'est juste un exemple de déclaration et une procédure de test. Le scénario actuel est une clause dynamic where pour un long filtre et une requête de recherche (DYNAMIC WHERE & ORDER BY). Tout ce que je sais maintenant, c'est que je dois utiliser un curseur pour faire fonctionner ma procédure stockée, pouvez-vous me montrer comment utiliser les ensembles avec mon exemple? –