ORACLE : Insertion multiple en un seul appel dans une base Oracle
Par Mikaël GAUTHIER, mercredi 12 avril 2006 à 14:50 :: Lu sur le Web :: #2066 :: rss
Voilà une petite astuce afin d'améliorer les performances de vos traitements lors d'insertions multiples dans une ou plusieurs tables.
Lors de développements il est souvent question d'insérer plusieurs lignes dans une base et ce, dans un même script. Or cette procédure requiert de faire un appel par insertion ce qui peut, au final, être lourd quand on a besoin d'insérer un gand nombre de données.
Un moyen efficace de gagner du temps est de délégué les insertions à la base de données et non au script PHP. Pour cela, deux objets sont disponibles avec Oracle, les collections et les procédures stockées. Les collections sont l'équivalent des tableaux en PL/SQL et les procédures stockées permettent d'exécuter un script PL/SQL stocké dans la base de données.
L'opération se décompose en 2 parties :
- Création de la collection et de la procédure stockée,
- Exécution de la procédure depuis PHP.
Il existe plusieurs types de collections, nous utilisons ici les VARRAY, cette structure nécessite que sa taille et que le type des données contenues soient indiquées.
CREATE OR REPLACE TYPE v_arr AS VARRAY(100) OF NUMBER;Ici nous déclarons donc un tableau de taille maximum 100 contenant des données numériques.
Création de la procédure :
IL s'agît d'un simple script contenant une boucle et une requête d'insertion.
CREATE OR REPLACE PROCEDURE update_order(order_id IN NUMBER,arr_items IN v_arr) IS
BEGIN
FOR i IN 1 .. arr_items.count LOOP
INSERT INTO ORDER_ITEMS (order_line_id,order_id,item_id)
VALUES(ORDER_LINE_SQ.nextval,order_id,arr_items(i));
END LOOP;
END;
/
La procédure prend en paramètres les données nécessaires à l'insertion dont la collection (arr_items). Précisons que les données communes aux lignes à insérées peuvent être passées directement en paramètres, les données variant à chaque lignes doivent être placées dans des collections.Exécution de la procédure depuis PHP :
Tout d'abord on crée la collection :
$collection = oci_new_collection($db,"V_ARR");$db représente l'objet de connexion à la base de données, le second paramètre représente le type de la collection a créer.
Deuxièmement on remplie la collection avec nos données à insérer :
foreach ($arr_order_items as $item)
{
$collection->append($item);
}
$arr_order_items représente un tableau contenant nos données.3e étape, préparation de la procédure :
$stmt = oci_parse($db,"BEGIN UPDATE_ORDER(:order_id,:arr_items); END;");Le second paramètre est un bloc PL/SQL qui sera exécuté par Oracle.
4e étape, renseignement des paramètres :
oci_bind_by_name($stmt,':order_id',$order_id); oci_bind_by_name($stmt,':arr_items',$collection,-1,OCI8_B_NTY);On affecte donc à chaque paramètre passé à la procédure UPDATE_ORDER sa variable correspondant en PHP. Pour la collection, le 4e paramètre précise la taille maximale de la variable PHP (nombre d'éléments pris en compte), le -1 indique de prendre comme valeur la taille actuelle de la variable. Si vous utilisez PHP 4.x ou inférieur, changez le 5e paramètre avec OCI8_B_SQLT_NTY.
Dernière étape, exécution de la procédure :
oci_execute($stmt);Le gain de performance apporté par cette méthode est plus conséquent lorsque l'on travaille sur de grandes quantités de données et peut ne pas être visible sur un faible nombre d'insertions.
Pour consulter l'article original et obtenir bien plus de détails dirigez vous ici.







Commentaires
#1 - Le mardi 23 mai 2006 à 11:31, par Stos
#2 - Le lundi 19 février 2007 à 18:07, par ouzin
Ajouter un commentaire
Vous pouvez soumettre un commentaire en remplissant le formulaire ci-dessous. Toutes les contributions font l'objet d'une étape de modération par notre équipe.
Le code HTML dans le commentaire sera affiché comme du texte, les adresses internet seront converties automatiquement.