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 Site PostgreSQL.fr » Problème de sequence "avançant" toute seule » 12/09/2019 09:04:17

jollt
Réponses : 1

Bonjour,
j'utilise une séquence pour numéroter des objet dans mon application.
Par exemple, les risques doivent avoir comme numéro

GA_1
GA_2
GA_3
GA_4
GA_5
GA_6
GA_7
etc...

j'ai donc une séquence qui me renvoi le prochain numéro.
Pour une raison que je n'arrive pas à déterminer, cette séquence avance toute seule et je me retrouve avec des trous de numérotation

GA_1
GA_2
GA_3
GA_9
GA_10
GA_37
GA_38
GA_39
GA_45
etc...

Comment est-ce possible?

Merci d'avance pour votre aide

#2 Re : PL/pgSQL » tableau php vs pgsql » 28/03/2013 14:43:22

N'étant jamais mieux servi que par soi-même, j'ai trouvé une solution à mon problème :-)

Ce n'est peut-être pas la plus élégante, mais elle fonctionne.
Si quelqu'un voit plus élaguant, plus efficace ou si des fonctions existent pour faire ça, je suis preneur.
En attendant, cela pourra peut-être servir à quelqu'un.


Les tableaux associatifs n'existant pas en pgsql  (à ma connaissance tout du moins), je suis passé par data type hstore (attention, il s’agit d'une extension qu'il faut installer : CREATE EXTENSION IF NOT EXISTS hstore;)


hstore permet de stocker des couples clé/valeur et de les lire comme ceci : var_hstore->clé.


Une variable hstore s'écrit comme ça :
     ('clé_1=>valeur_1, clé_2=>valeur_2, clé_3=>valeur_3')::hstore


Il faut donc transformer le tableau php en un tableau pgsql de variables hstore


Pour ce faire, j'ai écrit un petit algorithme, partant du principe que mon tableau php était le suivant  :


$t2 = array();
$t2[0] = array('cli_id' =>  0, 'cli_nom' => 'client_0', 'cli_desc' => 'desc_client_0');
$t2[1] = array('cli_id' =>  1, 'cli_nom' => 'client_1', 'cli_desc' => 'desc_client_1');
$t2[2] = array('cli_id' =>  3, 'cli_nom' => 'client_2', 'cli_desc' => 'desc_client_2');


La transformation en "pgsql" donne ça :


$i = 0;
$hstore_row = "";
$hstore_array = "array[";
for ($i=0; $i<count ($t2) ; $i++) {
    if ($hstore_array != "array[") $hstore_array = $hstore_array . ", ";
    $hstore_row = "('";
    foreach ($t2[$i] as $key => $value) {
        if ($hstore_row != "('") $hstore_row = $hstore_row. ", ";
        $hstore_row = $hstore_row.$key."=>".$value;
    };
    $hstore_row = $hstore_row."')::hstore";
    $hstore_array = $hstore_array.$hstore_row;
}
$hstore_array = $hstore_array."]";


On obtient ici
$hstore_array = array[('cli_id=>0, cli_nom=>client_0, cli_desc=>desc_client_0')::hstore, ('cli_id=>1, cli_nom=>client_1, cli_desc=>desc_client_1')::hstore, ('cli_id=>3, cli_nom=>client_2, cli_desc=>desc_client_2')::hstore]


On peut alors appeler depuis php la fonction pgsql qui va bien :


$arrRetour = pgQuery($conn, "select proc_test_array_hstore('test', ".$hstore_array.")");


Dans la procédure pgsql  proc_test_array_hstore on accèdera facilement aux donnée :
var_in_hstore[2]->cli_nom renverra la valeur de la clé cli_nom de la deuxième variable hstore du tableau, à savoir ici client_1


Voilou...

#3 PL/pgSQL » tableau php vs pgsql » 28/03/2013 10:53:34

jollt
Réponses : 1

Bonjour,
ce que je recherche est certainement très simple, mais je me mélange un peu les pinceaux entre php et postgre

J'ai le tableau suivant en php :

$t = array();
$t[0] = array('cli_id' =>  0, 'cli_nom' => 'client_0', 'cli_desc' => 'desc_client_0');
$t[1] = array('cli_id' =>  1, 'cli_nom' => 'client_1', 'cli_desc' => 'desc_client_1');
$t[2] = array('cli_id' =>  2, 'cli_nom' => 'client_2', 'cli_desc' => 'desc_client_2');

Cela me permet de récupérer les valeurs des champs :

Echo 'Nom 1 : '.$t2[1]['cli_nom'] .'<br>'; // renvoye client_1
Echo 'Desc 2: '.$t2[2]['cli_desc'] .'<br>'; // renvoye desc_client_2



Y a-t-il un moyen de convertir ce tableau php en tableau pgsql utilisable de la même manière et que l'on puisse passer en paramètre de type anyarray à une fonction?

Si non, quelle serait la syntaxe pgsql pour obtenir un tel tableau?

Merci d'avance.

Pied de page des forums

Propulsé par FluxBB