Comme vous le savez sans doute, il est possible de développer ses propres procédures/fonctions en Java dans une base de données Oracle. Les procédures Oracle écrites Java référencent des méthodes statiques dans les classes compilées dans la base de données.
Les procédures en Java sont souvent utilisées pour développer les manipulations sur le système de fichier (move, copy, remove, list) car ces actions ne sont pas aisément réalisable avec le package UTL_FILE.
Mon objectif, est de retourner en paramètre OUT de ma procédure le contenu d'un dossier sur mon système de fichier. Le contenu est retourné sous la forme d'un tableau. Voici la procédure à suivre :
1. Définir le type tableau de chaînes de caractères qui contiendra les noms des fichiers
2. Compiler le code Java sur la base de données
Notez l'utilisation d'un array descriptor pour spécifier à Oracle comment transformer l'array de string en sortie.
3. Compiler le package/procédure qui appelle la méthode statique Java
Ainsi, vous pouvez profiter des fonctions de manipulation de fichier disponible dans le package java.io.
Notez que si vous souhaiter mettre un paramètre de type scalaire en sortie (OUT) il est nécessaire que votre méthode statique retourne un tableau de type scalaire étant donné que Java ne gère pas les paramètres passé en sortie.
mercredi 4 avril 2012
vendredi 30 mars 2012
Convertir un hostname IPv6 en IPv4
Depuis Windows Vista, la variable HttpContext.Request.UserHostAddress peut retourner une adresse au format IPv6. Il peut être utile de récupérer cette adresse au format IPv4. Voici une solution qui permet d'avoir une IPv4 à partir du hostname ou de l'adresse IPv6 :
Sources :
mardi 27 mars 2012
Optimisation du Update Set Row
La clause Set Row permet de faire des updates d'une table à partir d'un record PL/SQL. La syntaxe utilisée permet d'avoir un code très clair.
Voici un petit exemple illustrant ce principe :
Il est également possible de faire un insert utilisant cette variable de la manière suivante :
Cependant, l'update via un set row met à jour toutes les colonnes de la table (même la clé primaire) même si cette valeur reste inchangée. La requete équivalente à l'update ci dessus est la suivante :
Il n'y a pas besoin de longues explications pour comprendre que dans le cas d'une large table cela peut couter cher de mettre à jour toutes les colonnes si on ne doit juste mettre à jour une ou 2 colonnes.
Pour contrer ce problème, il suffit de définir un subset de la table à mettre à jour. Oracle comprendra alors qu'il ne doit mettre à jour que les colonnes selectionnées par la sous-requete. Il faudra aussi définir un type ne contenant que les colonnes que l'on souhaite mettre à jour. La requete suivante permet de faire ce que l'on souhaite :
Ainsi seules les colonnes que l'on a définie dans la sous requete sont mises à jour !
Voici un petit exemple illustrant ce principe :
vMyVariable MyTable%RowType;
Update MyTable tab
Set Row = vMyVariable;
Where tab.Id = 5;Il est également possible de faire un insert utilisant cette variable de la manière suivante :
Insert MyTable
Values vMyVariable;
Cependant, l'update via un set row met à jour toutes les colonnes de la table (même la clé primaire) même si cette valeur reste inchangée. La requete équivalente à l'update ci dessus est la suivante :
Update MyTable tab
Set tab.r1 = 1,
tab.r2 = 2,
tab.r3 = 3,
...
Where tab.Id = 5;Il n'y a pas besoin de longues explications pour comprendre que dans le cas d'une large table cela peut couter cher de mettre à jour toutes les colonnes si on ne doit juste mettre à jour une ou 2 colonnes.
Pour contrer ce problème, il suffit de définir un subset de la table à mettre à jour. Oracle comprendra alors qu'il ne doit mettre à jour que les colonnes selectionnées par la sous-requete. Il faudra aussi définir un type ne contenant que les colonnes que l'on souhaite mettre à jour. La requete suivante permet de faire ce que l'on souhaite :
update (Select v.r1,tab.r2 from MyTable tab where tab.id = 5)
Set Row = vMyVariable;
Set Row = vMyVariable;
Ainsi seules les colonnes que l'on a définie dans la sous requete sont mises à jour !
Multi desktop Windows 7

Article technet sur l'outil : http://technet.microsoft.com/en-us/sysinternals/cc817881
Téléchargement : http://download.sysinternals.com/files/Desktops.zip

jeudi 30 juin 2011
Modifier Sysdate
Sysdate est une procédure sans paramètre qui retourne la date/heure de la base de donnée basée sur l'heure de l'OS sur lequel tourne l'instance de la DB.
Il arrive souvent que des procédures basent leur fonctionnement en fonction de la valeur de Sysdate. Afin de bien tester ces procédures, il serait intéressant de pouvoir changer l'heure retournée par cette procédure.
Une première solution est de changer l'heure de l'OS. Ceci changera donc la date de la DB mais également la date de tous les autres programmes s'exécutant sur le serveur. Il existe une autre solution, qui consiste à fixer la date via la commande suivante :
ALTER System set fixed_date="YYYY-MM-DD-HH24:MI:SS"
A partir du moment où vous exécutez cette commande, chaque appel à Sysdate retournera la date que vous avez fixée et cela n'alterera que la DB.
Pour que Sysdate récupère son fonctionnement initial (c'est à dire retourner l'heure courante), il suffit de remplacer la date que vous avez définie par None :
ALTER System set fixed_date=None
Il est ainsi possible de tester des procédures en simulant la date d'éxécution.
source :
http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams073.htm
Il arrive souvent que des procédures basent leur fonctionnement en fonction de la valeur de Sysdate. Afin de bien tester ces procédures, il serait intéressant de pouvoir changer l'heure retournée par cette procédure.
Une première solution est de changer l'heure de l'OS. Ceci changera donc la date de la DB mais également la date de tous les autres programmes s'exécutant sur le serveur. Il existe une autre solution, qui consiste à fixer la date via la commande suivante :
ALTER System set fixed_date="YYYY-MM-DD-HH24:MI:SS"
A partir du moment où vous exécutez cette commande, chaque appel à Sysdate retournera la date que vous avez fixée et cela n'alterera que la DB.
Pour que Sysdate récupère son fonctionnement initial (c'est à dire retourner l'heure courante), il suffit de remplacer la date que vous avez définie par None :
ALTER System set fixed_date=None
Il est ainsi possible de tester des procédures en simulant la date d'éxécution.
source :
http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams073.htm
mardi 15 mars 2011
Periodic Table of HTML5 Elements
Un petit tableau contenant les éléments présents en HTML5 sous forme d'un tableau périodique. Chaque élément du tableau permet d'avoir la description de l'élément ainsi que le lien correspondant sur le site du W3School.
Periodic Table of HTML5 Elements
Periodic Table of HTML5 Elements
Récupérer le nom d'une propriété dynamiquement
Certaines librairies prennent en paramètres de leurs fonctions le nom (sous forme de string) de la propriété sur laquelle doit s'effectuer l'action. Par exemple, avec nhibernate, il est nécessaire lorsque l'on fait un Criteria de donner le nom des propriétés sur lequelles on execute une Restriction.
Le problème avec ce genre de méthode, c'est que le risque de faire une faute de frappe est important et il n'y a pas de vérification à la compilation.
Heureusement, la reflection vient à notre secours! Une solution consiste à passer une lambda expression de la propriété et par reflection récupérer les informations notamment son nom.
Voici une implémentation d'exemple qui extrait de la lumbda expression la propriété de l'objet pour récupérer son nom :
Le problème avec ce genre de méthode, c'est que le risque de faire une faute de frappe est important et il n'y a pas de vérification à la compilation.
Heureusement, la reflection vient à notre secours! Une solution consiste à passer une lambda expression de la propriété et par reflection récupérer les informations notamment son nom.
Voici une implémentation d'exemple qui extrait de la lumbda expression la propriété de l'objet pour récupérer son nom :
Inscription à :
Articles (Atom)