IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Sybase Discussion :

[ASA 8] Procédure stockée et requete dynamique


Sujet :

Sybase

  1. #1
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [ASA 8] Procédure stockée et requete dynamique
    Bonjour,
    je cherche à faire une procedure stockee qui "construise" dynamiquement une requete SQL (possiblité de choisir les colonne et le tri) puis qui me renvoie N lignes à partir de la position M (fonction LIMIT sous MySQL). Pour faire tout cela, j'utilise un curseur.

    J'y suis presque arrivé (cf. code ci-dessous) mais ma procedure stockee me renvoie les résultats triés aléatoirement alors que j'ai mis un order dans ma requete.
    Je m'explique : (je fais un tri sur la col n°1)
    Si N=3Lignes et M=1erePosition
    Alors
    1, toto, motdepasse1
    3, titi, motdepasse3
    2, tutu, motdepasse2

    Si N=5Lignes et M=1erePosition
    Alors
    1, toto, motdepasse1
    3, titi, motdepasse3
    5, tete, motdepasse5
    2, tutu, motdepasse2
    4, tata, motdepasse4

    Voilà, ça fait un petit moment que je bloque dessus et je commence à me demander si je vais dans la bonne direction pour résoudre mon problème ou si je me gourre.
    Merci d'avance pour votre aide.
    Xavier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    44
    45
     
    CREATE PROCEDURE PROC(
    	IN PARAMS ....)
    BEGIN
    	--DECLARE VARIABLES ....
    	DECLARE l_err		EXCEPTION FOR SQLSTATE VALUE '02000';
     
    	DECLARE LOCAL TEMPORARY TABLE l_result(COLS ...) ON COMMIT PRESERVE ROWS;
     
    	SET l_query='SELECT * FROM TR_TEST WHERE ';
    	IF(CONDITION) THEN
    		SET l_query=l_query || '(COL1 ';
    		CASE i_doc
    			WHEN '' THEN SET l_query=l_query || 'LIKE ''%''';
    			ELSE SET l_query=l_query || '= ' || i_param;
    		END CASE;
    	ELSE
    		SET l_query=l_query || '(CODE_DOCS LIKE ''%' || i_num || '%''';
    	END IF;
     
    	CASE i_col
    		WHEN 'login' THEN SET l_query=l_query || ') ORDER BY COL1 ' || i_order;
    		ELSE SET l_query=l_query || ') ORDER BY COL2';
    	END CASE;
     
    	BEGIN
    		DECLARE l_curs DYNAMIC SCROLL CURSOR USING l_query;
     
    		OPEN l_curs;
    			-- On positionne le pointeur du curseur la ligne n° "i_pos"
    			FETCH ABSOLUTE i_pos l_curs INTO ...;
     
    			SET l_cpt=0;
    			-- Lecture du curseur jusqu'à i_range
    			WHILE((l_cpt<i_range) AND (SQLSTATE <> l_err)) LOOP
    				INSERT INTO l_result VALUES(...);
    				SET l_cpt=l_cpt+1;
    				FETCH NEXT l_cursDocs INTO ...;
    			END LOOP;
    		CLOSE l_cursDocs;
     
    		SELECT * FROM l_result;
    	END
     
    END;

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 569
    Points
    19 569
    Billets dans le blog
    25
    Par défaut
    Pourquoi ne pas remplacer votre curseur par un TOP ?

    http://manuals.sybase.com/onlinebooks/group-sas/awg0800e/dbrfen8/@Generic__BookView;pt=557;lang=fr?DwebQuery=top

  3. #3
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Parce que je souhaite imiter le comportement du LIMIT de MySQL sans utiliser TOP
    J'ai trouvé la possiblité de réaliser cette contrainte (cf http://sqlserver.developpez.com/faq/?page=Recordset#JE2). Mais je n'aime pas cette façon de faire

  4. #4
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai trouvé javascript:emoticon('')

    L'erreur venais de moi (comme toujours). Je pensais que lorsque l'on stockait le résultat d'un curseur dans une table, il stocké les data dans l'ordre de lecture du curseur. Et bien, c'est faux!!!

    Pour résoudre mon probleme, j'ai ajouté à ma table une colonne autoincremnet et j'ordonne ma table grace a cette colonne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2005] Procédure stockée avec construction dynamique de requête
    Par droliprane dans le forum Développement
    Réponses: 13
    Dernier message: 25/11/2014, 17h48
  2. Execution Procédure stockée dans requete
    Par Alexis35 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 21/11/2012, 15h33
  3. Procédure stockée locale requetant sur serveur lié
    Par dily0403 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/05/2012, 17h49
  4. [Procédure Stockée] Nom table dynamique
    Par Kirua76 dans le forum Développement
    Réponses: 1
    Dernier message: 23/11/2011, 16h36
  5. Procédure stockée locale requetant sur serveur lié
    Par dily0403 dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 14/11/2007, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo