web-dev-qa-db-fra.com

Comment insérer des données dans un tableau à l'aide de procédures stockées dans postgresql

CREATE TABLE app_for_leave
(
  sno integer NOT NULL,
  eid integer,
  ename varchar(20),
  sd date,
  ed date,
  sid integer,
  status boolean DEFAULT false,
  CONSTRAINT pk_snoa PRIMARY KEY (sno)
);

L'insertion de base est ::

INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status)
 VALUES(1,101,'2013-04-04','2013-04-04',2,'f' );

...

INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status) VALUES (?, ?, ?, ?, ?, ?);

Mon exigence :: Comment insérer des données dans une table en utilisant procédures stockées?

19
09Q71AO534

PostgreSQL ne supportait pas les procédures stockées jusqu'à PG11. Avant cela, vous pouviez obtenir le même résultat en utilisant une fonction. Par exemple:

CREATE FUNCTION MyInsert(_sno integer, _eid integer, _sd date, _ed date, _sid integer, _status boolean)
  RETURNS void AS
  $BODY$
      BEGIN
        INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status)
        VALUES(_sno, _eid, _sd, _ed, _sid, _status);
      END;
  $BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Vous pouvez alors l'appeler ainsi:

select * from MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );

Les principales limitations des fonctions stockées de Pg - par rapport aux véritables procédures stockées - sont:

  1. incapacité à renvoyer plusieurs jeux de résultats
  2. pas de support pour les transactions autonomes (BEGIN, COMMIT et ROLLBACK dans une fonction)
  3. pas de prise en charge de la syntaxe CALL standard SQL, bien que les pilotes ODBC et JDBC traduisent les appels pour vous.

Exemple

À partir de PG11, le CREATE PROCEDURE la syntaxe est introduite qui prend en charge les transactions.

CREATE PROCEDURE MyInsert(_sno integer, _eid integer, _sd date, _ed date, _sid integer, _status boolean)
LANGUAGE SQL
AS $BODY$
    INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status)
    VALUES(_sno, _eid, _sd, _ed, _sid, _status);   
$BODY$;

Qui pourrait être appelé avec:

CALL MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );
33
Mike Christensen

À partir de PostgreSQL 11, vous pouvez créer des procédures stockées et les invoquer en utilisant APPELEZ :

CREATE PROCEDURE MyInsert(_sno integer, _eid integer, _sd date,
                          _ed date, _sid integer, _status boolean)
LANGUAGE SQL
AS $$
    INSERT INTO app_for_leave(sno, eid, sd, ed, sid, status)
    VALUES(_sno, _eid, _sd, _ed, _sid, _status);   
$$;

CALL MyInsert(1,101,'2013-04-04','2013-04-04',2,'f' );

De plus, il permet de gérer la transaction

Procédures stockées SQL

PostgreSQL 11 introduit des procédures stockées SQL qui permettent aux utilisateurs d'utiliser des transactions intégrées (par exemple BEGIN, COMMIT/ROLLBACK) dans une procédure. Les procédures peuvent être créées à l'aide de CREATE PROCEDURE et exécutée à l'aide de la commande CALL.

7
Lukasz Szozda

PostgreSQL ne prend pas en charge les procédures stockées , mais vous pouvez obtenir le même résultat en utilisant une fonction.

Quelles que soient les données que vous souhaitez insérer dans le tableau, vous donnez des paramètres à la fonction que vous créez.

CREATE OR REPLACE indique si une fonction du même nom (que vous utilisez) est déjà présente dans la base de données, alors elle sera remplacée ou bien si aucune fonction du même nom n'est présente alors une nouvelle fonction sera créée.

Vous devez écrire la requête insesrtion dans le corps de la fonction.

CREATE OR REPLACE FUNCTION Insert_into_table(_sno INTEGER, _eid INTEGER, _ename VARCHAR(20), _sd DATE, _ed DATE, _sid INTEGER)
      RETURNS void AS
      $BODY$
          BEGIN
            INSERT INTO app_for_leave(sno, eid, sd, ed, sid)
            VALUES(_sno, _eid, _sd, _ed, _sid);
          END;
      $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;

Comme vous l'avez déjà mentionné dans le tableau, une valeur par défaut pour la colonne Status, maintenant il n'est pas nécessaire d'insérer des données dans cette colonne

Voici le SQLFiddle lien pour votre compréhension

2
09Q71A0548
CREATE OR REPLACE FUNCTION  new_bolshek(parent_id bigint, _key text, _value text, enabled boolean)
  RETURNS SETOF bolshekter AS
  $BODY$
  DECLARE
    new_id integer;
    returnrec bolshekter;
  BEGIN
        INSERT INTO bolshekter(parent_id, content_key, content_value, enabled)
        VALUES(parent_id, _key, _value, enabled) RETURNING id INTO new_id;
        FOR returnrec IN SELECT * FROM bolshekter where id=new_id LOOP
            RETURN NEXT returnrec;
        END LOOP;
  END;
  $BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
1
Yerbol