<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - Astuces Dev Oracle par McM</title>
		<link>https://www.developpez.net/forums/blogs/20669-mcm/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Thu, 09 Apr 2026 13:27:19 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - Astuces Dev Oracle par McM</title>
			<link>https://www.developpez.net/forums/blogs/20669-mcm/</link>
		</image>
		<item>
			<title>Générer un QR Code en PL/SQL</title>
			<link>https://www.developpez.net/forums/blogs/20669-mcm/b9789/generer-qr-code-pl-sql/</link>
			<pubDate>Mon, 07 Sep 2020 13:35:44 GMT</pubDate>
			<description>Voici une procédure qui...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Voici une procédure qui permet de générer un QR Code en PL/SQL.<br />
Je me suis basé sur le site <a href="http://www.thonky.com/qr-code-tutorial" target="_blank">http://www.thonky.com/qr-code-tutorial</a> qui détaille très bien toutes les étapes de calculs et de placement.<br />
<br />
En entrée de procédure : Le texte, et en option, la qualité (défaut Q), et un mask pattern (pour le mode débug)<br />
En sortie, on retourne un tableau de ligne  (4000 caractères) contenant les 1 (case noire) et 0 (case blanche), ainsi que la hauteur et largeur de l'image à générer<br />
<br />
Je me base sur mon package de gestion d'image (amélioré depuis mon blog précédent avec une gestion du format png et un nouveau paramètre d'inversion noir/blanc)<br />
<br />
Voici le package d'image et la procédure de génération de QRCode : <a href="https://www.developpez.net/forums/attachments/p578703d1599482454/dotnet/general-dotnet/types-projets-realisez-net/qrcode.zip/"  title="Nom : QRCODE.zip
Affichages : 410
Taille : 24,7 Ko">QRCODE.zip</a><br />
<br />
<b>Exemples d'utilisation :</b><br />
 Création d'un QRCODE dans la table WTT_UPLOAD (id=151) en PNG<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span>
  v_image IMAGE_PKG.LIGNE_DATA;
  v_larg <span style="color: #0000ff;">NUMBER</span>;
  v_haut <span style="color: #0000ff;">NUMBER</span>;
<span style="color: #0000ff;">BEGIN</span>
 	P_QRCODE <span class="br0">&#40;</span>p_chaine =&gt; <span style="color: #FF0000;">'CECI EST MON QRCODE'</span>, p_quality =&gt; <span style="color: #FF0000;">'Q'</span>, p_image =&gt; v_image, p_largeur =&gt; v_larg, p_hauteur =&gt; v_haut<span class="br0">&#41;</span>;
  IMAGE_PKG.CREATION_FICHIER_IMAGE <span class="br0">&#40;</span>p_data =&gt; v_image, p_largeur =&gt; v_larg, p_hauteur =&gt; v_haut, p_typeImg =&gt; <span style="color: #FF0000;">'PNG'</span>, p_IDWTT =&gt; <span style="color: #cc66cc;">151</span>, p_Nbcoul =&gt; <span style="color: #cc66cc;">2</span>, p_negatif =&gt; <span style="color: #FF0000;">'O'</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div><br />
Génération d'un QRCode dans un BLOB (en inversant le noir et le blanc)<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span>
  v_image IMAGE_PKG.LIGNE_DATA;
  v_larg <span style="color: #0000ff;">NUMBER</span>;
  v_haut <span style="color: #0000ff;">NUMBER</span>;
  v_lob <span style="color: #0000ff;">BLOB</span>;
<span style="color: #0000ff;">BEGIN</span>
 	P_QRCODE <span class="br0">&#40;</span>p_chaine =&gt; <span style="color: #FF0000;">'CECI EST MON QRCODE'</span>, p_quality =&gt; <span style="color: #FF0000;">'Q'</span>, p_image =&gt; v_image, p_largeur =&gt; v_larg, p_hauteur =&gt; v_haut<span class="br0">&#41;</span>;
  v_lob := IMAGE_PKG.CREATION_BMP<span class="br0">&#40;</span>p_data =&gt; v_image, p_largeur =&gt; v_larg, p_hauteur =&gt; v_haut, p_Nbcoul =&gt; <span style="color: #cc66cc;">2</span>, p_negatif =&gt; <span style="color: #FF0000;">'O'</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div><br />
Création d'un BMP en damier de 2x2 dans un BLOB<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code SQL :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span>
  v_lob <span style="color: #0000ff;">BLOB</span>;
  v_image IMAGE_PKG.LIGNE_DATA;
  v_larg <span style="color: #0000ff;">NUMBER</span> := <span style="color: #cc66cc;">2</span>;
  v_haut <span style="color: #0000ff;">NUMBER</span> := <span style="color: #cc66cc;">2</span>;
<span style="color: #0000ff;">BEGIN</span>
  v_image<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> := <span style="color: #FF0000;">'01'</span>;
  v_image<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> := <span style="color: #FF0000;">'10'</span>;
  v_lob := IMAGE_PKG.CREATION_BMP<span class="br0">&#40;</span>p_data =&gt; v_image, p_largeur =&gt; v_larg, p_hauteur =&gt; v_haut, p_Nbcoul =&gt; <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>McM</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/20669-mcm/b9789/generer-qr-code-pl-sql/</guid>
		</item>
		<item>
			<title>Sqlite db Reader en PLSQL</title>
			<link>https://www.developpez.net/forums/blogs/20669-mcm/b3103/sqlite-db-reader-plsql/</link>
			<pubDate>Wed, 07 Jun 2017 16:03:05 GMT</pubDate>
			<description>*Utilité : Afin de lire les...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><b><font color="#0000FF">Utilité</font> : Afin de lire les données d'une base sqlite et de sélectionner des données directement en plsql.</b><br />
<br />
J'utilisais le plugin Firefox &quot;SQlite Manager&quot;, mais le besoin de mettre à jour ma base Oracle nécessitait des exports et des transformations sur le fichier d'export.<br />
<br />
Certaines informations ne sont pas très clairement documentées.<br />
Sources : <a href="https://sqlite.org/fileformat.html" target="_blank">https://sqlite.org/fileformat.html</a> et <a href="http://forensicsfromthesausagefactory.blogspot.fr/2011/05/analysis-of-record-structure-within.html" target="_blank">http://forensicsfromthesausagefactor...re-within.html</a><br />
<br />
Un fichier sqlite.db est assez simple à lire :<br />
les 100 premiers caractères correspondent à la description de la base (taille de page, etc..)<br />
Le fichier est découpé en pages qui ont toutes la même taille.<br />
Chaque page correspond à un seul objet (une seule table ou un seul index)<br />
Une page contient soit un ensemble de pointeurs vers d'autres pages, soit les lignes de la table.<br />
Le catalogue des tables,index, etc.. de la base est donné dans la première page (table nommée sqlite_master).<br />
<br />
Je n'ai créé qu'une récupération des données des tables. A ce que j'ai lu, certaines tables sont créées sans rowid et ne sont que des indexes.<br />
<br />
<b><font color="#0000FF">Installation</font></b> <br />
1 : Créer une table qui va contenir la liste des objets de la base sqlite (master_table) qui permet d'associer une Table à un n° de page.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">GLOBAL</span> <span style="color: #0000ff;">TEMPORARY</span> <span style="color: #0000ff;">TABLE</span> GTT_SQLITE_MASTER
<span class="br0">&#40;</span> IDROW      <span style="color: #0000ff;">NUMBER</span>  <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>,
  TYPE       <span style="color: #0000ff;">VARCHAR2</span><span class="br0">&#40;</span><span style="color: #cc66cc;">30</span><span class="br0">&#41;</span>, <span style="color: #808080;">-- table, index, trigger</span>
  NAME       <span style="color: #0000ff;">VARCHAR2</span><span class="br0">&#40;</span><span style="color: #cc66cc;">255</span><span class="br0">&#41;</span>, <span style="color: #808080;">-- nom sqlite</span>
  TABLENAME  <span style="color: #0000ff;">VARCHAR2</span><span class="br0">&#40;</span><span style="color: #cc66cc;">128</span><span class="br0">&#41;</span>, <span style="color: #808080;">-- nom de la table</span>
  ROOTPAGE   <span style="color: #0000ff;">NUMBER</span>, <span style="color: #808080;">-- Page Initiale de la table</span>
  SQLTEXT    <span style="color: #0000ff;">VARCHAR2</span><span class="br0">&#40;</span><span style="color: #cc66cc;">4000</span><span class="br0">&#41;</span> <span style="color: #808080;">-- Ordre sql de cr&eacute;ation</span>
<span class="br0">&#41;</span>
<span style="color: #0000ff;">ON</span> <span style="color: #0000ff;">COMMIT</span> <span style="color: #0000ff;">PRESERVE</span> <span style="color: #0000ff;">ROWS</span>;</pre></td></tr></table></pre>
</div><br />
2 : Compiler le package <a href="https://www.developpez.net/forums/attachments/p536097d1580900461/c-cpp/outils-c-cpp/visual-cpp/mfc/adolib-v1-43-classes-encapsulant-classes-ado-2-07/sqlitedb_pkg.sql/"  title="Nom : sqlitedb_pkg.sql
Affichages : 635
Taille : 31,8 Ko">sqlitedb_pkg.sql</a><br />
<br />
<b><font color="#0000FF">Utilisation</font></b> <br />
Récupérer une base de données Sqlite et la mettre dans une variable de type BLOB.<br />
Dans les exemples suivants, le fichier sqlite.db a été inséré dans une table : WSQLITEDB (NOM VARCHAR2(128) NOT NULL, DB BLOB)<br />
<br />
<ul><li style=""><b><font color="#FF0000">Toujours à faire en premier</font></b> :  Récupérer le catalogue des tables de la db sqlite</li></ul><br />
La table est temporaire et garde les lignes au commit. Donc il ne faut le refaire que si on ouvre une nouvelle base sqlite ou si on a fermé sa session.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span>
 vdb <span style="color: #0000ff;">BLOB</span>;
<span style="color: #0000ff;">BEGIN</span>
 <span style="color: #0000ff;">SELECT</span> db <span style="color: #0000ff;">INTO</span> vdb <span style="color: #0000ff;">FROM</span> WSQLITEDB <span style="color: #0000ff;">WHERE</span> nom = <span style="color: #FF0000;">'McM'</span>;  <span style="color: #808080;">-- R&eacute;cup&egrave;re la db sqlite </span>
 SQLDB_PKG.P_LIST_OBJECTS<span class="br0">&#40;</span>vdb<span class="br0">&#41;</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div><br />
Voir la liste des tables :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">SELECT</span> * <span style="color: #0000ff;">FROM</span> GTT_SQLITE_MASTER <span style="color: #0000ff;">WHERE</span> TYPE = <span style="color: #FF0000;">'table'</span> <span style="color: #0000ff;">ORDER</span> <span style="color: #0000ff;">BY</span> tablename</pre>
</div><br />
<br />
<ul><li style="">Function qui renvoie le nombre de lignes d'une table</li></ul><br />
FUNCTION <b>F_NBLIG</b> (pDB IN OUT NOCOPY BLOB, p_nomtable IN VARCHAR2) RETURN NUMBER;<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">dbms_output.put_line('Nb de ligne de TARTICLE :'|| sqlitedb_pkg.F_NBLIG(vdb, 'TARTICLE'));</pre>
</div><br />
<ul><li style="">Fonction pour les dates</li></ul><br />
Les dates Sqlite sont au format Varchar : '2017-02-22 19:18:52.0'<br />
La fonction <b>F_DATE</b> renvoie la date (niveau seconde, sans le .0) <br />
FUNCTION <b>F_DATE</b>(p_chaine IN VARCHAR2)  RETURN DATE;<br />
<br />
<br />
<ul><li style="">Procédure de récupération des lignes d'une table</li></ul><br />
<b>P_GETROWS</b>(pDB IN OUT NOCOPY BLOB, p_nomtable IN VARCHAR2);<br />
<br />
Récupère les enregistrements de la table<br />
Les données sont dans les 3 tableaux du package sqlitedb_pkg : lnum, lchar, lblob<br />
La définition de chaque donnée est dans le tableau ldef du package (contient 'NUM', 'CHAR', 'BLOB')<br />
L'index de ldef est à utiliser sur les tableaux lnum, lchar, lblob suivant ce que contient ldef<br />
ex ldef(5) = 'CHAR' =&gt; donnée dans lchar(5)<br />
ldef(8) = 'NUM' =&gt; donnée dans lnum(8)<br />
ldef(6) = 'BLOB' =&gt; données dans lblob(6)<br />
<br />
La variable sqlitedb_pkg.nbcols contient le nombre de colonnes <br />
<font color="#FF0000">Attention </font>par défaut on récupère aussi la colonne interne ROWID de sqldb qu'on met en première colonne. Désactivable par la variable sqlitedb_pkg.vgetrowid<br />
<font color="#FF0000">S'il n'y a pas de ligne, la variable nbcols = 0</font><br />
<br />
Les tableaux contiennent les données de toutes les lignes de la table. Exemple une table avec 3 colonnes ( nom VARCHAR, dtenaiss VARCHAR, photo BLOB). <br />
Le table contient 2 lignes. <br />
<br />
Si sqlitedb_pkg.vgetrowid = <b>TRUE</b> et lancement de <b>P_GETROWS</b> <br />
ldef(1) = 'NUM' ; ldef(2) = 'CHAR' ; ldef(3) = 'CHAR' ; ldef(4) = 'BLOB'; ldef(5) = 'NUM' ; ldef(6) = 'CHAR' ; ldef(7) = 'CHAR' ; ldef(8) = 'BLOB'<br />
sqlitedb_pkg.nbcols = 4<br />
<br />
Les index 1-4 = Première ligne  : Lnum(1) =rowid ; Lchar(2)=nom ; Lchar(3)=dtenaiss ; Lblob(4)=photo<br />
Les index 5-8 = Seconde ligne : Lnum(5) =rowid ; Lchar(6)=nom ; Lchar(7)=dtenaiss ; Lblob(8)=photo <br />
<br />
Si sqlitedb_pkg.vgetrowid = <b>FALSE</b> et lancement de <b>P_GETROWS</b> <br />
ldef(1) = 'CHAR' ; ldef(2) = 'CHAR' ; ldef(3) = 'BLOB'; ldef(4) = 'CHAR' ; ldef(5) = 'CHAR' ; ldef(6) = 'BLOB'<br />
sqlitedb_pkg.nbcols = 3<br />
<br />
Les index 1-3 = Première ligne  : Lchar(1)=nom ; Lchar(2)=dtenaiss ; Lblob(3)=photo<br />
Les index 4-6 = Seconde ligne : Lchar(4)=nom ; Lchar(5)=dtenaiss ; Lblob(6)=photo <br />
<br />
<br />
<b>Exemple concret</b><br />
Récupérer les lignes de TARTICLE (sqlite) qu'on va insérer dans la table TEMP_ARTICLE (oracle) <br />
		<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span>
 vdb <span style="color: #0000ff;">BLOB</span>; v <span style="color: #0000ff;">NUMBER</span>;
<span style="color: #0000ff;">BEGIN</span>
 <span style="color: #0000ff;">SELECT</span> db <span style="color: #0000ff;">INTO</span> vdb <span style="color: #0000ff;">FROM</span> wsqlitedb <span style="color: #0000ff;">WHERE</span> nom= <span style="color: #FF0000;">'McM'</span>;
    sqlitedb_pkg.vgetrowid := TRUE; 
    sqlitedb_pkg.p_list_objects<span class="br0">&#40;</span>vdb<span class="br0">&#41;</span>;
&nbsp;
 sqlitedb_pkg.vgetrowid := FALSE; <span style="color: #808080;">-- Je ne veux pas r&eacute;cup&eacute;rer les rowid des lignes </span>
 sqlitedb_pkg.P_GETROWS<span class="br0">&#40;</span>vdb, <span style="color: #FF0000;">'TARTICLE'</span><span class="br0">&#41;</span>;    <span style="color: #808080;">-- On r&eacute;cup&egrave;re les donn&eacute;es de TARTICLE </span>
&nbsp;
 <span style="color: #0000ff;">IF</span> sqlitedb_pkg.nbcols &gt; <span style="color: #cc66cc;">0</span> <span style="color: #808080;">-- Evite de planter si la table est vide.</span>
 <span style="color: #0000ff;">THEN</span> 
  <span style="color: #0000ff;">FOR</span> i <span style="color: #0000ff;">IN</span> <span style="color: #cc66cc;">1</span>.. <span class="br0">&#40;</span>sqlitedb_pkg.ldef.COUNT / sqlitedb_pkg.nbcols<span class="br0">&#41;</span>
  <span style="color: #0000ff;">LOOP</span>
	v := <span class="br0">&#40;</span>i-<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> * sqlitedb_pkg.nbcols + <span style="color: #cc66cc;">1</span>;
    	<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> TEMP_ARTICLE<span class="br0">&#40;</span>IDART, LIBART, DATE_CREA<span class="br0">&#41;</span>
      <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>sqlitedb_pkg.lnum<span class="br0">&#40;</span>v<span class="br0">&#41;</span>, sqlitedb_pkg.lchar<span class="br0">&#40;</span>v+<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>, sqlitedb_pkg.f_date<span class="br0">&#40;</span>sqlitedb_pkg.lchar<span class="br0">&#40;</span>v+<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">LOOP</span>;
<span style="color: #0000ff;">END</span> <span style="color: #0000ff;">IF</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div><br />
Si j'ai besoin de récupérer les données d'une autre table, pas besoin de refaire un P_LIST_OBJECTS<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span>
	vdb <span style="color: #0000ff;">BLOB</span>; v <span style="color: #0000ff;">NUMBER</span>;
<span style="color: #0000ff;">BEGIN</span>
 <span style="color: #0000ff;">SELECT</span> db <span style="color: #0000ff;">INTO</span> vdb <span style="color: #0000ff;">FROM</span> wsqlitedb <span style="color: #0000ff;">WHERE</span> nom= <span style="color: #FF0000;">'McM'</span>;
&nbsp;
 sqlitedb_pkg.P_GETROWS<span class="br0">&#40;</span>vdb, <span style="color: #FF0000;">'TSTOCK'</span><span class="br0">&#41;</span>;
&nbsp;
 <span style="color: #0000ff;">IF</span> sqlitedb_pkg.nbcols &gt; <span style="color: #cc66cc;">0</span> <span style="color: #808080;">-- Evite de planter si la table est vide.</span>
 <span style="color: #0000ff;">THEN</span> 
  <span style="color: #0000ff;">FOR</span> i <span style="color: #0000ff;">IN</span> <span style="color: #cc66cc;">1</span>.. <span class="br0">&#40;</span>sqlitedb_pkg.ldef.COUNT / sqlitedb_pkg.nbcols<span class="br0">&#41;</span>
  <span style="color: #0000ff;">LOOP</span>
	v := <span class="br0">&#40;</span>i-<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> * sqlitedb_pkg.nbcols + <span style="color: #cc66cc;">1</span>;
    	<span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> TEMP_STOCK<span class="br0">&#40;</span>IDART, QTE<span class="br0">&#41;</span>
      <span style="color: #0000ff;">VALUES</span><span class="br0">&#40;</span>sqlitedb_pkg.lnum<span class="br0">&#40;</span>v<span class="br0">&#41;</span>, sqlitedb_pkg.lnum<span class="br0">&#40;</span>v+<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">LOOP</span>;
<span style="color: #0000ff;">END</span> <span style="color: #0000ff;">IF</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div><br />
<b><font color="#0000FF">Quelques spécificités</font></b> <br />
Les bases sqlite sont codées en UTF8 ou UTF16. La variable de package vcharset contient UTF8, UTF16le ou UTF16be<br />
Les accents et symboles € étaient mal récupérés donc j'ai mis un CONVERT vers la fin de la procédure SQLDB avec le charset de mon serveur ('WE8MSWIN1252') dans la variable de package vconvert.<br />
<br />
Les données NULL n'ont pas de type, donc je mets les 3 tableaux lnum, lchar et lblob à NULL pour cette donnée, ne sachant pas si c'est un NUM, VARCHAR ou BLOB.<br />
<br />
Les nombres à virgule sont décodés avec UTL_RAW.cast_to_binary_double, il faut visiblement arrondir.<br />
<br />
<b><font color="#0000FF">Limitations</font></b> <br />
Je n'ai pas encore testé de lire des tables avec de très nombreuses lignes (je ne sais pas comment est codé la rootpage si le nombre de sous-pages ne rentre pas dans l'espace de la rootpage).<br />
<br />
N'hésitez pas à commenter.</blockquote>

]]></content:encoded>
			<dc:creator>McM</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/20669-mcm/b3103/sqlite-db-reader-plsql/</guid>
		</item>
		<item>
			<title>Créer et Décoder un fichier BMP en PL/SQL</title>
			<link>https://www.developpez.net/forums/blogs/20669-mcm/b674/creer-decoder-fichier-bmp-pl-sql/</link>
			<pubDate>Fri, 07 Aug 2015 12:21:22 GMT</pubDate>
			<description>Pour pouvoir générer des...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pour pouvoir générer des QRCode, des codes barres, ou décoder un fichier image BMP, j'ai eu besoin de créer un fichier BMP dans un BLOB.<br />
<br />
Première étape, <b><a href="http://www.commentcamarche.net/contents/1200-bmp-format-bmp" target="_blank">comment ça marche</a><br />
</b>1 partie Header, 1 partie Entête et 1 partie Donnée.<br />
Très simple car la partie donnée n'est pas cryptée.<br />
Je n'ai eu besoin que de faire du Noir &amp; Blanc, donc je n'ai pas approfondi le reste.<br />
<br />
Petite info marrante (je trouve), dans un BMP on code la résolution verticale et horizontale en Pixel / Mètre !<br />
#0B13h = 2835 px/m =&gt; 2835 / 39.3701 =&gt; 72dpi (pixel par inch)<br />
<br />
Pour la partie Data j'avais déjà un tableau de chaine de caractère contenant chaque ligne de ma future image, avec des 0 ou 1 contenant chaque pixel.<br />
La seule fonction à créer a été de passer du Binaire en Décimal afin de repasser en Raw (Hexa)<br />
<br />
<font color="#008000"><b>Voici le source :</b></font> <a href="https://www.developpez.net/forums/attachments/p184899d1438949534/c-cpp/outils-c-cpp/cppbuilder/fichiers-d-projet/creer_bmp_pkg.sql/"  title="Nom : creer_bmp_pkg.sql
Affichages : 1214
Taille : 12,7 Ko">creer_bmp_pkg.sql</a><br />
<br />
La fonction <b>Generer_BMP</b> prend en paramètres : Le tableau de données, la largeur et la hauteur, et le nombre de couleur.<br />
Elle renvoie un BLOB contenant l'image.<br />
La couleur : toujours mettre 2, le reste n'est pas codé.<br />
La hauteur doit être égal au nombre de lignes du tableau de données<br />
<br />
<br />
J'ai eu besoin de &quot;décoder&quot; un fichier BMP N&amp;B afin d'insérer un logo dans une imprimante ticket en mode ESC/POS<br />
La procédure <b>P_GET_DATA</b> prend en paramètre un Blob (image BMP Noir et Blanc), et renvoie la hauteur/largeur et le tableau de données.<br />
Il n'y a encore que les images Noir &amp; Blanc qui sont prises en compte.<br />
<br />
La procédure <b>CREER_FIC_IMG_IMP_ESCPOS</b> est spécifique à la création d'un fichier texte à envoyer sur une imprimante ESC/POS.<br />
<br />
<br />
<i>Le prochain billet sera la création d'un code barre (EAN13, EAN128, QRCode) en Pl/Sql utilisant ce package afin de générer directement sous Forms l'image correspondante.</i></blockquote>

]]></content:encoded>
			<dc:creator>McM</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/20669-mcm/b674/creer-decoder-fichier-bmp-pl-sql/</guid>
		</item>
		<item>
			<title>Créer et Modifier un fichier zip en PL/SQL</title>
			<link>https://www.developpez.net/forums/blogs/20669-mcm/b472/creer-modifier-fichier-zip-pl-sql/</link>
			<pubDate>Tue, 28 Jul 2015 16:34:03 GMT</pubDate>
			<description>En cherchant à générer un zip...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">En cherchant à générer un zip en plsql sans passer par du java ou par l'OS, je suis tombé sur le bon site de Anton Scheffer<br />
<b>Website</b>: <a href="http://technology.amis.nl/blog" target="_blank">http://technology.amis.nl/blog</a> qui fournit un code permettant de créer un fichier zip contenant plusieurs fichiers dans un BLOB : <a href="https://technology.amis.nl/2010/06/09/parsing-a-microsoft-word-docx-and-unzip-zipfiles-with-plsql" target="_blank">Parsing a Microsoft Word docx, and unzip zipfiles, with PL/SQL</a><br />
<br />
C'était une excellente base de départ, mais on ne pouvait que créer un fichier zip, puis le lire, mais pas moyen de maintenir.<br />
<br />
<font color="#0000ff"><b>1/ Analyse<br />
</b></font>Comprendre comment est généré un fichier zip, très simple en fait, chaque fichier (compressé) est concaténé au précédent, et tout à la fin, on met les infos globales du zip et de tous les fichiers.<br />
Donc pour rajouter un fichier, il suffit de supprimer les infos globales, concaténer son fichier compressé et recréer les infos globales.<br />
J'ai donc créé la procédure INIT_ZIP qui modifie le Blob Zippé en supprimant les infos globales [appelé Central Directory], après avoir mémorisé le commentaire.<br />
<br />
<font color="#0000ff"><b>2/ Débugages</b></font><br />
<br />
<i>a)</i> Après chargement de mes zip créés sous linux (par un zip -j), j'avais un plantage lorsque je rajoutais des fichiers<br />
Il s'avère que dans le zip créé sous Linux, l'extrafield est différent entre l'entête et le directory (8 bytes de plus)<br />
Correction de FINISH_ZIP<br />
<br />
<i>b)</i> J'ai eu un plantage en prod car un fichier faisait 0 octet.<br />
Debug Fonction FILE2BLOB si la source est à 0 octet<br />
<br />
<b><font color="#0000ff">3/ Cosmétique </font></b><br />
Ajout d'un paramètre Compression (add1file), <br />
Ajout des informations Date Maj, size_comp et size_uncomp dans File_List<br />
<br />
<font color="#006400"><b>Voici le script finalisé : <a href="https://www.developpez.net/forums/attachments/p184650d1438706960/parkings/restreint-parking-admin/sgbd-utilisez/as_zip.sql/"  title="Nom : as_zip.sql
Affichages : 2499
Taille : 26,0 Ko">as_zip.sql</a></b></font><br />
<br />
<b><font color="#0000ff">4/ Etape finale :</font></b> L'écran Forms afin de lister les fichiers zip, télécharger les fichiers compressés, ou les zip<br />
Le seul problème que j'ai eu a été sur la gestion de la récupération de la liste du zip avec un filtre par nom directement depuis le package As_zip qui me plantait Forms.<br />
<br />
J'ai donc créé une fonction de type pipelined et de faire un curseur pour renseigner le bloc liste<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"><span style="color: #0000ff;">SELECT</span> filename, datemaj, size_comp, size_uncomp <span style="color: #0000ff;">FROM</span> <span style="color: #0000ff;">TABLE</span> <span class="br0">&#40;</span>F_LISTING_ZIP<span class="br0">&#40;</span>:archives.nomdoc, :q1.nomfic<span class="br0">&#41;</span><span class="br0">&#41;</span></pre>
</div><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">OR</span> <span style="color: #0000ff;">REPLACE</span> TYPE TYP_REC_VARCHAR <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">OBJECT</span> <span class="br0">&#40;</span>filename <span style="color: #0000ff;">VARCHAR2</span><span class="br0">&#40;</span><span style="color: #cc66cc;">2000</span><span class="br0">&#41;</span>, datemaj <span style="color: #0000ff;">DATE</span>, size_comp <span style="color: #0000ff;">NUMBER</span>, size_uncomp <span style="color: #0000ff;">NUMBER</span><span class="br0">&#41;</span>;
<span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">OR</span> <span style="color: #0000ff;">REPLACE</span> TYPE TYP_TAB_VARCHAR <span style="color: #0000ff;">AS</span> <span style="color: #0000ff;">TABLE</span> <span style="color: #0000ff;">OF</span> TYP_REC_VARCHAR;</pre></td></tr></table></pre>
</div><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">FUNCTION</span> F_LISTING_ZIP <span class="br0">&#40;</span>p_doc <span style="color: #0000ff;">IN</span> <span style="color: #0000ff;">VARCHAR2</span>, p_nomfic <span style="color: #0000ff;">IN</span> <span style="color: #0000ff;">VARCHAR2</span> <span style="color: #0000ff;">DEFAULT</span> <span style="color: #0000ff;">NULL</span><span class="br0">&#41;</span>  
  <span style="color: #0000ff;">RETURN</span> TYP_TAB_VARCHAR PIPELINED <span style="color: #0000ff;">AS</span>
  zip_files as_zip.file_list;
  v_doc <span style="color: #0000ff;">BLOB</span>;
&nbsp;
  <span style="color: #808080;">-- p_doc : Doc Zip pour r&eacute;cup&eacute;rer le blob</span>
  <span style="color: #808080;">-- p_nomfic : Afficher la liste des noms de fichier contenant p_nomfic</span>
&nbsp;
<span style="color: #0000ff;">BEGIN</span>
<span style="color: #808080;">/*</span>
<span style="color: #808080;">drop TYPE TYP_TAB_VARCHAR </span>
<span style="color: #808080;">CREATE OR REPLACE TYPE TYP_REC_VARCHAR AS OBJECT (filename VARCHAR2(2000), datemaj DATE, size_comp NUMBER, size_uncomp NUMBER);</span>
<span style="color: #808080;">CREATE OR REPLACE TYPE TYP_TAB_VARCHAR AS TABLE OF TYP_REC_VARCHAR;</span>
<span style="color: #808080;">*/</span>
    <span style="color: #0000ff;">SELECT</span> blob_zip
    <span style="color: #0000ff;">INTO</span> v_doc
    <span style="color: #0000ff;">FROM</span> ARCHIVE_FIC
    <span style="color: #0000ff;">WHERE</span> nomdoc = p_doc;
&nbsp;
  zip_files  := as_zip.get_file_list<span class="br0">&#40;</span> v_doc<span class="br0">&#41;</span>;
  <span style="color: #0000ff;">IF</span> zip_files <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span>
  <span style="color: #0000ff;">THEN</span>
    <span style="color: #0000ff;">FOR</span> i <span style="color: #0000ff;">IN</span> zip_files.FIRST .. zip_files.LAST
    <span style="color: #0000ff;">LOOP</span>
      <span style="color: #0000ff;">IF</span> <span class="br0">&#40;</span>p_nomfic <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NOT</span> <span style="color: #0000ff;">NULL</span> <span style="color: #0000ff;">AND</span> zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.filename <span style="color: #0000ff;">LIKE</span> <span style="color: #FF0000;">'%'</span>|| p_nomfic ||<span style="color: #FF0000;">'%'</span><span class="br0">&#41;</span>
      <span style="color: #0000ff;">OR</span> p_nomfic <span style="color: #0000ff;">IS</span> <span style="color: #0000ff;">NULL</span>
      <span style="color: #0000ff;">THEN</span>
        PIPE ROW<span class="br0">&#40;</span> TYP_REC_VARCHAR <span class="br0">&#40;</span>zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.filename, zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.datemaj, zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.size_comp, zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.size_uncomp<span class="br0">&#41;</span><span class="br0">&#41;</span>;
      <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">IF</span>;
    <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">LOOP</span>;
    <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">IF</span>;
  <span style="color: #0000ff;">RETURN</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div><br />
<b><font color="#0000ff">5/ Exemples :</font></b><br />
<br />
zipper un le fichier toto.pdf (présent dans le directory MYDIR) dans le directory MYDIR et s'appelant toto.zip<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span>
  v_zip <span style="color: #0000ff;">BLOB</span>;
<span style="color: #0000ff;">BEGIN</span>
  AS_ZIP.Add1File<span class="br0">&#40;</span>v_zip, <span style="color: #FF0000;">'toto.pdf'</span>, AS_ZIP.File2Blob<span class="br0">&#40;</span> <span style="color: #FF0000;">'MYDIR'</span>, <span style="color: #FF0000;">'toto.pdf'</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>;
  AS_ZIP.Finish_Zip<span class="br0">&#40;</span>v_zip<span class="br0">&#41;</span>;
  AS_ZIP.Save_Zip<span class="br0">&#40;</span>v_zip, <span style="color: #FF0000;">'MYDIR'</span>, <span style="color: #FF0000;">'toto.zip'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div><br />
Rajout du fichier toto.txt à mon fichier toto.zip<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span>
  v_zip <span style="color: #0000ff;">BLOB</span>;
<span style="color: #0000ff;">BEGIN</span>
  v_zip := AS_ZIP.File2Blob<span class="br0">&#40;</span> <span style="color: #FF0000;">'MYDIR'</span>, <span style="color: #FF0000;">'toto.zip'</span> <span class="br0">&#41;</span>;
  AS_ZIP.Init_Zip<span class="br0">&#40;</span>v_zip<span class="br0">&#41;</span>;
  AS_ZIP.Add1File<span class="br0">&#40;</span>v_zip, <span style="color: #FF0000;">'toto.txt'</span>, AS_ZIP.File2Blob<span class="br0">&#40;</span> <span style="color: #FF0000;">'MYDIR'</span>, <span style="color: #FF0000;">'toto.txt'</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>;
  AS_ZIP.Finish_Zip<span class="br0">&#40;</span>v_zip<span class="br0">&#41;</span>;
  AS_ZIP.Save_Zip<span class="br0">&#40;</span>v_zip, <span style="color: #FF0000;">'MYDIR'</span>, <span style="color: #FF0000;">'toto.zip'</span> <span class="br0">&#41;</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div><br />
Dézipper un fichier zip dans un directory Oracle (Attention, les noms de fichier peuvent contenir des répertoires, ce code ne le gère pas)<br />
On affiche le nom de fichier, la date et les tailles.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:192px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">DECLARE</span>
  v_zip <span style="color: #0000ff;">BLOB</span>;
  zip_files AS_ZIP.file_list;
  v_doc <span style="color: #0000ff;">BLOB</span>;
<span style="color: #0000ff;">BEGIN</span>
  v_zip := AS_ZIP.File2Blob<span class="br0">&#40;</span>p_dir =&gt;<span style="color: #FF0000;">'MYDIR'</span>, p_file_name =&gt; <span style="color: #FF0000;">'toto.zip'</span><span class="br0">&#41;</span>;
  zip_files  := AS_ZIP.Get_File_List<span class="br0">&#40;</span> v_zip <span class="br0">&#41;</span>;
  <span style="color: #0000ff;">FOR</span> i <span style="color: #0000ff;">IN</span> zip_files.FIRST<span class="br0">&#40;</span><span class="br0">&#41;</span> .. zip_files.LAST
  <span style="color: #0000ff;">LOOP</span>
        dbms_output.put_line<span class="br0">&#40;</span>DBMS_LOB.SUBSTR<span class="br0">&#40;</span>zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.filename,<span style="color: #cc66cc;">2000</span>,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> ||<span style="color: #FF0000;">' '</span>|| TO_CHAR<span class="br0">&#40;</span>zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.datemaj,<span style="color: #FF0000;">'DD/MM/RRRR HH24:MI:SS'</span><span class="br0">&#41;</span> ||<span style="color: #FF0000;">' size:'</span>|| zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.size_comp ||<span style="color: #FF0000;">' / '</span>|| zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.size_uncomp<span class="br0">&#41;</span>;
        v_doc := AS_ZIP.Get_File<span class="br0">&#40;</span>v_zip, DBMS_LOB.SUBSTR<span class="br0">&#40;</span>zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.filename,<span style="color: #cc66cc;">2000</span>,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>;
    AS_ZIP.Save_Zip<span class="br0">&#40;</span>p_zipped_blob =&gt; v_doc, p_dir =&gt; <span style="color: #FF0000;">'MYDIR'</span>, p_filename =&gt; DBMS_LOB.SUBSTR<span class="br0">&#40;</span>zip_files<span class="br0">&#40;</span>i<span class="br0">&#41;</span>.filename,<span style="color: #cc66cc;">2000</span>,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
  <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">LOOP</span>;
<span style="color: #0000ff;">END</span>;</pre></td></tr></table></pre>
</div><br />
Toutes les lignes de chargement de fichier zip depuis le serveur [<b>v_zip := AS_ZIP.File2Blob(p_dir =&gt;'MYDIR', p_file_name =&gt; 'toto.zip');</b>] peut bien sur être remplacé par un SELECT<br />
Attention toutefois aux limitations sur les BLOB (il faut en faire une copie avant de l'utiliser, à moins de passer par un select for update, mais plus dangereux)<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code sql :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0">dbms_lob.createtemporary<span class="br0">&#40;</span> v_zip, TRUE <span class="br0">&#41;</span>;
<span style="color: #0000ff;">SELECT</span> BLOB_ZIP <span style="color: #0000ff;">INTO</span> v_lob <span style="color: #0000ff;">FROM</span> ARCHIVE_FIC <span style="color: #0000ff;">WHERE</span> NOMZIP = <span style="color: #FF0000;">'archive_2015'</span>;
DBMS_LOB.append<span class="br0">&#40;</span>v_zip, v_lob<span class="br0">&#41;</span>;
AS_ZIP.Init_Zip<span class="br0">&#40;</span>v_zip<span class="br0">&#41;</span>;
AS_ZIP.Add1File<span class="br0">&#40;</span>v_zip, ....<span class="br0">&#41;</span>;
AS_ZIP.Finish_Zip<span class="br0">&#40;</span>v_zip<span class="br0">&#41;</span>;
  ...
dbms_lob.freetemporary<span class="br0">&#40;</span>v_zip<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>McM</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/20669-mcm/b472/creer-modifier-fichier-zip-pl-sql/</guid>
		</item>
	</channel>
</rss>
