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 10/11/2015 18:08:32

Papychampi
Membre

[PARAMETRES] - Passer un tableau en paramètres d'une fonction

Bonjour,
Je développe une application en php/postgresql et je voudrais faire passer un tableau dans une de mes procédures stockée. Seulement Php me retourne cette erreur...

Notice: Array to string conversion in [...] commandes.php on line 47

Du coup je voudrais savoir quelle est la syntaxe correcte pour passer des tableaux en paramètres de fonctions postgresql...

if (isset($_POST['submit'])){
	if ($_POST['submit']){
		$qua = array();
		for ($i=0;$i<$_POST['nb_choix'];$i++){
			$qua[$i] = $_POST['quantity' . $i];
		}
		$bat = array();
		for ($i=0;$i<$_POST['nb_choix'];$i++){
			$bat[$i] = $_POST['batch' . $i];
		}
		$sn = array();
		for ($i=0;$i<$_POST['nb_choix'];$i++){
			$sn[$i] = $_POST['sn' . $i];
		}
		for ($i = 0; $i < $_POST['nb_choix'];$i++){
			$res = pg_query_params($conn, "SELECT * FROM product_types WHERE ptypeid = $1", array($_POST['batch' . $i]));
			$data = pg_fetch_row($res);
			$corps = str_ireplace("V", "", $data[4]); 
			$v[$i] = str_ireplace("R", "", $corps);
			$save = ltrim($data[3], "FABfab");
			$f[$i] = str_ireplace(" ", "", $save);
			$d[$i] = $_POST['d' . $i];
			$n[$i] = $_POST['n' . $i];
		}
		$sql = "SELECT add_cmd_gen(" . $_POST['nb_choix'] . ", " . $_POST['orderform'] . ", " . $_POST['total'] . ", " . $_POST['orderform'] . ", " . $bat . ", " . $_POST['startdate'] . ", " . $_POST['startdate'] . ", " . $_POST['supplierdeliveries'] . ", " . $sn . ", " . $_POST['supplierdeliveries'] . ", " . $qua . ", " . $ptypeid . ")";
		$res = pg_query($conn, $sql);

Hors ligne

#2 10/11/2015 19:36:53

rjuju
Administrateur

Re : [PARAMETRES] - Passer un tableau en paramètres d'une fonction

Il s'agit d'une erreur côté php. La syntaxe d'un tableau dans postgres est la suivante : '{"elem1","elem2"}' pour un tableau de texte et '{1,2}' pour des entiers par exemple.

Avez-vous vérifié que la fonction pl/pgsql fonctionnait correctement ? Un exemple de fonction pl/pgsql qui prend un tableau en entrée :

create or replace function nb_elem(a integer[]) returns integer as
$$
declare
    nb integer;
begin
select array_upper(a,1) into nb;
return nb;
end;
$$ language plpgsql;

select nb_elem('{1,1,1}');
 nb_elem 
═════════
       3
(1 row)

Hors ligne

#3 12/11/2015 10:02:09

Papychampi
Membre

Re : [PARAMETRES] - Passer un tableau en paramètres d'une fonction

Bonjour,

Voici le code de ma fonction SQL:

CREATE OR REPLACE FUNCTION add_cmd_gen(
    _cadences integer,
    _orderform integer,
    _total integer,
    _batch integer,
    _stardate date,
    _date date,
    _supplier text,
    _sn text,
    _quantity integer[],
    _ptypeid integer[])
  RETURNS boolean AS
$BODY$DECLARE
	i integer;
	j integer;
BEGIN
	RAISE LOG 'Création de la commande générale...';
	SELECT check_sn16(_orderform);
	IF (_orderform ~ '^CC[0-9]{2}(0[1-9]|1[0-2])(00[1-9]|0[1-9][0-9]|[1-9][0-9]{2})$')
	THEN
		IF (_supplier ~ '^[A-Z]+$')
		THEN
			IF (_startdate ~ '^(199[6-9]|[2-9][0-9]{3})-(0[1-9]|1[0-2])$')
			THEN
				IF (_quantity ~ '^[0-9]+$')
				THEN
					INSERT INTO supplierorders (orderform, startdate, quantity, supplier) VALUES (_orderform, _startdate, _total, _supplier) RETURNING sorderid;
					RAISE LOG 'Terminé';
				ELSE
					RAISE LOG 'La quantité n est pas correct!';
				END IF;
			ELSE
				RAISE LOG 'La date n est pas correct!';
			END IF;
		ELSE
			RAISE LOG 'Le nom du fournisseur n est pas correct!';
		END IF;
	ELSE
		RAISE LOG 'La date n est pas correct!';
	END IF;
	RAISE LOG 'Création des sous-commandes...';
	j = 0;
	WHILE _batch[j] IS NOT NULL LOOP
		IF (_sorderid ~ '^[0-9]+$')
		THEN
			IF (_ptypeid[j] ~ '^[0-9]+$')
			THEN
				IF (_batch[j] ~ '^[0-9]+$')
				THEN
					IF (_quantity[j] ~ '^[0-9]+$')
					THEN
						INSERT INTO supplierdeliveries (sorderid, ptypeid, batch, quantity) VALUES (_sorderid, _ptypeid[j], _batch[j], _quantity[j]);
						i = 0;
						FOR i IN REVERSE 0 .. _quantity LOOP
							INSERT INTO products (sdeliveryid, ptypeid, sn, status, date) VALUES (_sdeliveryid, _ptypeid, _sn, 'Commandées', GETDATE());
						END LOOP;
				ELSE
						RAISE LOG 'La quantité n est pas correcte';
					END IF;
				ELSE
					RAISE LOG 'Le numéro de lot n est pas correcte';
				END IF;
			ELSE
				RAISE LOG 'Le type de produit n est pas correcte';
			END IF;
		ELSE
			RAISE LOG 'La date n est pas correcte';
		END IF;
		j = j + 1;
	END LOOP;
	RAISE LOG 'Terminé';
END;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION add_cmd_gen(integer, integer, integer, integer, date, date, text, text, integer[], integer[])
  OWNER TO postgres;

Dernière modification par Papychampi (12/11/2015 10:18:28)

Hors ligne

Pied de page des forums