EMPTY_BLOB |
BLOB vide |
|---|---|
| Oracle Database SQL | Oracle 8i (8.1) ou supérieure |
Syntaxe
| EMPTY_BLOB() |
Description
Cette fonction permet de retourner un BLOB vide (Binary Large Object) qui peut être utilisé pour initialiser une colonne ou une variable de type BLOB dans une requête SQL ou PL/SQL. Elle est souvent utilisée lors de l'insertion ou de la mise à jour de données binaires avant de les remplir avec la méthode DBMS_LOB.
Remarques
- Initialisation explicite d'un BLOB : La fonction EMPTY_BLOB permet de créer un BLOB vide, ce qui est essentiel lorsqu'on souhaite insérer une ligne avec une colonne BLOB sans encore y écrire de données. En effet, les colonnes de type BLOB ne peuvent pas être laissées NULL dans certains scénarios, notamment lorsqu'une opération de traitement LOB suit immédiatement l'insertion. Cette initialisation explicite permet donc de réserver l'espace LOB en amont d'un remplissage via DBMS_LOB.
- Utilisation courante avec RETURNING INTO : EMPTY_BLOB est fréquemment utilisé en conjonction avec la clause RETURNING INTO d'une instruction INSERT. Cela permet d'obtenir un pointeur LOB utilisable immédiatement pour écrire du contenu avec des appels à DBMS_LOB.WRITE. Ce modèle est utile pour éviter des allers-retours avec la base, en insérant la ligne et en écrivant dans le BLOB dans la même transaction.
- Compatible avec PL/SQL et SQL : La fonction EMPTY_BLOB est disponible aussi bien dans les blocs PL/SQL que dans les requêtes SQL ordinaires. Cela lui confère une grande flexibilité dans les applications : que ce soit pour des traitements par lots, des déclencheurs, ou des scripts d'intégration, elle s'intègre naturellement. Elle n'a besoin d'aucun paramètre et retourne toujours une instance BLOB vide.
- Fonction utile dans les architectures orientées document : Dans les systèmes où des documents binaires (PDF, images, vidéos,...) sont entreposés dans la base, EMPTY_BLOB joue un rôle fondamental. Il permet de créer une "coquille" LOB que l'on peut remplir ensuite via des outils ou processus externes, souvent avec un ID de document. Cela rend l'approche transactionnelle plus robuste, en assurant que les métadonnées et les contenus soient synchronisés.
- Nécessaire pour éviter des erreurs de type ORA-22275 : Sans une initialisation correcte du champ BLOB, des erreurs comme ORA-22275: invalid LOB locator specified peuvent survenir lorsqu'on tente d'écrire dans un LOB NULL. EMPTY_BLOB() prévient ce type de dysfonctionnement en fournissant un LOB valide mais vide, permettant à Oracle de gérer le stockage sous-jacent sans erreur.
- Non persisté comme NULL : Un champ contenant EMPTY_BLOB() n'est pas équivalent à NULL. Il s'agit bien d'un BLOB valide sans contenu, ce qui est important à noter lors de requêtes de filtrage (IS NULL vs. dbms_lob.getlength(blob_col) = 0). Cela permet une distinction claire entre l'absence de données et un champ préparé pour recevoir des données.
- Peut être utilisé dans les requêtes INSERT ou UPDATE : EMPTY_BLOB s'intègre dans les instructions INSERT INTO et UPDATE pour préparer des champs BLOB en amont de leur utilisation. Par exemple :
- UPDATE documents SET fichier_blob = EMPTY_BLOB() WHERE id = 100 RETURNING fichier_blob INTO :blob_loc;
- Aucune conversion implicite nécessaire : Contrairement à des données de type texte (CLOB ou VARCHAR2), il n'est pas nécessaire de convertir explicitement une valeur pour obtenir un BLOB vide. La fonction EMPTY_BLOB() retourne immédiatement une valeur du bon type, ce qui facilite l'écriture et la lisibilité du code.
- Indispensable pour les traitements LOB transactionnels : Lorsqu'on utilise des traitements LOB avec DBMS_LOB.WRITE, OPEN, CLOSE,..., il est impératif de disposer d'un LOB locator valide. EMPTY_BLOB garantit l'existence de ce locator sans qu'aucune donnée ne soit encore écrite, permettant d'assurer la cohérence de la transaction.
- Pas de support de contenu direct via EMPTY_BLOB : La fonction ne permet pas d'indiquer un contenu par défaut : elle retourne strictement un BLOB vide. Pour injecter du contenu, il faut impérativement utiliser des procédures comme DBMS_LOB.WRITE ou des chargements binaires via des APIs externes (JDBC, ODP.NET,...). Cela évite toute ambiguïté sur son comportement.
- L'utilisation peut varier selon le mode de stockage LOB : En fonction du paramétrage du segment LOB (stockage en ligne ou en dehors des lignes), le comportement de l'allocation via EMPTY_BLOB peut légèrement varier. Cependant, dans les deux cas, Oracle réserve un pointeur valide prêt à accueillir du contenu sans modifier les performances initiales de la requête.
- Comportement stable dans toutes les versions depuis Oracle 8i : Depuis son introduction, la fonction EMPTY_BLOB() n'a pas connu de changements majeurs. Elle est stable, simple, fiable, et continue d'être recommandée dans toutes les versions récentes, y compris Oracle 23c. Son usage est documenté dans tous les guides Oracle liés à la manipulation de LOBs, ce qui témoigne de son importance dans les bonnes pratiques de développement.
Ce modèle est très répandu dans les traitements PL/SQL manipulant de gros fichiers.
Dernière mise à jour : Dimanche, le 29 Juin 2025