PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » Procédure multi-requete et php... » 01/06/2009 16:05:20

OK, vu avec Marc en  direct, ce que je veux faire n'existe pas.
Le faire serait de la bidouille en PLSQL.

Ah... y'a des moments je regrette quand même mon SQL Server ;-)

David

NB : Vous pouvez clore le débat...

#2 Re : Général » Procédure multi-requete et php... » 28/05/2009 15:24:38

OK, mais je ne vais pas creer un type par requete à récupérer...
Et pour le return query, si j'ai 2 requetes bien différentes ? Ca donne quoi ?

NB : Tu connais SQL Server ? Si oui, je te filerai un exemple d'une procédure stockée en TSQL.

David

#3 Re : Général » Procédure multi-requete et php... » 28/05/2009 12:40:48

On approche ;-)

J'ai fait cela :

CREATE OR REPLACE FUNCTION testdle9()
  RETURNS SETOF mon_retour AS
$BODY$DECLARE
    curs1 refcursor;
    curs2 refcursor;
    u_id bigint;
    t_id bigint;
    vretour mon_retour;
    

BEGIN
    OPEN curs1 FOR EXECUTE 'SELECT u_id FROM utilisateur';

    LOOP
        FETCH curs1 INTO u_id;
            vretour.u_id:=u_id;
            RETURN NEXT vretour;
        END IF;
    END LOOP;
    CLOSE curs1;

    OPEN curs2 FOR EXECUTE 'SELECT t_id FROM type';
    LOOP
        FETCH curs2 INTO t_id;
            vretour.u_id:=t_id;
            RETURN NEXT vretour;
        END IF;
    END LOOP;
    CLOSE curs2;
END$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

D'abord, "mon_retour", c'est un type... Tu as donc créer un type "date_octet_sens" ? Ou alors c'est autre chose : une vue, ... ?

Ensuite, cela reste toujours pour moi du "remplissage de valeurs" que l'on passe ensuite...

Il n'est pas possible de sortir "directement" le résultat d'une requète un peu plus simplement ?

C'est vraiment chelou...

#4 Re : Général » Procédure multi-requete et php... » 27/05/2009 22:41:37

Bonsoir,

J'ai bien compris qu'il y a des solutions "intermédiaires"... Je connais assez bien le SQL pour pouvoir en trouver moi-meme. Mais je ne veux pas "bidouiller"....

Je vais essayer de donner un exemple concret qui serait difficile à réaliser avec les UNION, même si encore une fois, cet exemple est "débile".

Donc imaginons une procédure qui fasse une requete sur tous les utilisateurs d'une table. Et imaginons que chaque utilisateur aie une table à lui tout seul. Imaginons encore que dans cette table, il y ait une colonne qui indique un "id" et un type d'info. Du genre id = 548 et que cet id est de type "commande" mais cela pourrait tout aussi bien être id = 284 et de type "message". Pour chacun de ses utilisateurs, je voudrais récupérer ses infos, plus ses infos dans "sa" table plus les infos liées à la table "type" grace à l'id.

C'est assez compliqué ?

Va t'en me sortir d'union maintenant... Surtout si j'ajoute encore quelques couches...

Je suis habitué à MySQL (très limité) et à SQL Serveur avec lequel je sais parfaitement faire ce que je cherche... En ASP avec SQL Serveur, vous pouvez faire une procédure qui fait deux, trois, quatre, ..., SELECT  la suite. Et dans le code ASP, vous récupérer le premier jeu de résultat et vous passez au suivant avec "NextRecordSet()".

J'ai l'impression que cela n'est pas possible avec Postgresql et que c'est pour ca que personne ne comprend ce que je cherche à faire......... Je crois que si cela était faisable, on trouverait l'option "SETOF recordS" ou "SETOF record[]", ou un truc du genre....

PS : Je rappelle que ce que j'écris sort tout droit de mon imagination, il est évident que le gars qui ferait un truc du genre serait vraiment tordu... :-)

David

#5 Re : Général » Procédure multi-requete et php... » 27/05/2009 09:15:34

OK mais comment traduire cela en PLPgSql ? Tu as une idée ?

Merci de ta réponse !
David

#6 Général » Procédure multi-requete et php... » 26/05/2009 11:33:44

davidl
Réponses : 11

Bonjour,

Voici plusieurs jours que je bloque sur un truc qui me parait pourtant très simple.
Je ne trouve pas d'exemple, de tuto, ni d'aide sur cela.

Je vous explique...

Je voudrais faire une procédure stockée en postgresql qui renvoie deux jeux de résultats.

Par exemple :

--
-- Name: testdle8(); Type: FUNCTION; Schema: public; Owner: admin
--

CREATE FUNCTION testdle8() RETURNS SETOF record
    AS $$SELECT 123 AS truc1 ;
SELECT u_id AS truc2 FROM utilisateur ;
SELECT 456 AS truc3 ;$$
    LANGUAGE sql;
ALTER FUNCTION public.testdle8() OWNER TO admin;

NB : Ne cherchez pas de cohérence entre les deux requètes, il n'y en a pas dans cet exemple ;-)

Puis, dans mon code PHP, je voudrais pouvoir afficher les noms des utilisateurs puis les titres des actualités.

Voilà, c'est aussi simple que cela.

Lorsque je fait cela et que j'appelle ma fonction, seul le dernier jeu de résultats est accessible. Aussi bien directement sur phpPgAdmin qu'en php...

Pour finir, mon code php :

<?php 
try {
    $hostname = "localhost";
    $dbname = "db";
    $username = "login";
    $pw = "pwd";
    $pdo = new PDO ("pgsql:host=$hostname;dbname=$dbname","$username","$pw");
  } catch (PDOException $e) {
    echo "Failed to get DB handle: " . $e->getMessage() . "\n";
    exit;
  }
      $query = $pdo->prepare("select testdle8()");
      $query->execute();
     
      for($i=0; $row = $query->fetch(); $i++){
	var_dump($row) ;
        echo $i." - ".$row[0]."<br/>";
      }

      unset($pdo);
      unset($query);
?>

Merci pour votre aide...
David

Pied de page des forums

Propulsé par FluxBB