septembre
2005
Oracle a récemment annoncé la release de la version 10g R2 intégrant un runtime .NET.
Il est désormais possible d’utiliser le C# pour développer des procédures stockées en plus du PL/SQL et de JAVA.
Oracle propose un tutoriel sur la création d’une application NET utilisant Oracle Developer Tools (ODT) pour Visual Studio .NET.
Ainsi qu’une vidéo (+ de 50 mn) sur les nouveautés d’ODT et ODP.NET(Requière Windows Media Player 9 or supérieure).
Je suis en train d’étudier les classes ODP sous Delphi, elles sont aisées à manipuler mais parfois le comportement de base n’est pas assez documenté.
Par exemple la création d’une procédure stockée via un TMemo n’est pas possible car ce composant gére les fin de lignes par un retour chariot suivi d’un line feed.
J’ai passé un petit bout de temps à comprendre, merci le mode trace du client Oracle :-), qu’il fallait utiliser un StringBuilder !
// Crée la procédure stocké sur le serveur
(*
Create or replace Procedure GetNameOfPresident(
Parametre_IN IN SCOTT.EMP.JOB%TYPE,
NomPresident_OUT OUT VARCHAR2) IS
begin
Select ENAME INTO NomPresident_OUT from scott.emp where job=Parametre_IN;
NomPresident_OUT:=Parametre_IN||' = '||NomPresident_OUT;
end;
*)
var TextePrcStck : StringBuilder;
begin
try
// Crée une procédure stockée
TextePrcStck:=StringBuilder.create;
// L'ajout de CR+LF en fin de chaîne n'est pas compatible (avec le parseur SQL sur le serveur Oracle ?), LF suffit.
TextePrcStck.Append('Create or replace Procedure GetNameOfPresident('+LF);
// La requête renvoie une seule ligne, Parametre_IN ne gére que 'PRESIDENT'
TextePrcStck.Append(' Parametre_IN IN SCOTT.EMP.JOB%TYPE,'+LF);
// La taille de la valeur de retour doit être supérieure à la taille du champ SCOTT.EMP.ENAME%TYPE
TextePrcStck.Append(' NomPresident_OUT OUT VARCHAR2) IS '+LF);
TextePrcStck.Append('begin'+LF);
TextePrcStck.Append(' Select ENAME INTO NomPresident_OUT from scott.emp where job=Parametre_IN;'+LF);
TextePrcStck.Append(' NomPresident_OUT:=Parametre_IN||'' = ''||NomPresident_OUT;'+LF);
TextePrcStck.Append('end;'+LF);
Commande.CommandText:= TextePrcStck.ToString;
Commande.ExecuteNonQuery;
except
on E:OracleException do
ShowOracleException(E.Errors);
end;
end;
Les exceptions d’ODP proposent de nombreuses informations utiles :
var ErrorMessage : String;
Error : OracleError;
begin
For Error in Errors do
begin
errorMessage:='';
errorMessage:= Concat( errorMessage,'Source : '+error.Source+System.Environment.NewLine);
errorMessage:= Concat( errorMessage,'Message : '+error.Message+System.Environment.NewLine);
errorMessage:= Concat( errorMessage,'Number : '+error.Number.ToString+System.Environment.NewLine);
errorMessage:= Concat( errorMessage,'DataSource : '+error.DataSource+System.Environment.NewLine);
errorMessage:= Concat( errorMessage,'Procedure : '+error.&Procedure+System.Environment.NewLine);
MessageBox(0,errorMessage, 'Erreur',MB_OK );
end;
end;
En revanche pour certains type d’appel sur le serveur le passage de paramètres n’est pas documenté j’aborderais ceci dans un prochain tutoriel …
10 Commentaires + Ajouter un commentaire
Articles récents
Archives
- juin 2011
- août 2010
- avril 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- septembre 2009
- août 2009
- juillet 2009
- juin 2009
- mai 2009
- avril 2009
- mars 2009
- février 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- juillet 2008
- mai 2008
- avril 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juin 2007
- mai 2007
- avril 2007
- mars 2007
- février 2007
- janvier 2007
- décembre 2006
- novembre 2006
- octobre 2006
- septembre 2006
- août 2006
- juillet 2006
- juin 2006
- mai 2006
- mars 2006
- février 2006
- janvier 2006
- décembre 2005
- novembre 2005
- octobre 2005
- septembre 2005
- juillet 2005
- juin 2005
- mai 2005
Pour répondre aux interrogations précédente.
-La procédure stockée C# utilise bien un wrapper comme le JAVA ou une DLL externe.
-L’assembly doit donc être au format DLL et est déployé sur le serveur en tant fichier externe.
-Son usage peut se faire au sein d’un package, procédure, fonction et triggers
-L’accés aux données est possible et se fait via ODP, avec un chaîne de connexion particuliére. Mais ici les accés seront plus lent (CLR=process externe) qu’en JAVA ( runtime ‘intégré’ dans le noyau Oracle)
-Le framework .NET doit être installé sur le serveur.
-Le déploiement via le Wizard d’ODT pour VS 2005 nécessite les droits SYSDBA sur le serveur cible.
-Nécessite le client 10g r2 pour le développement et le déploiement
Donc pour utiliser les mêmes assemblies C# pour Sql-Server (ADO) et Oracle(ODP) seul le type du provider peut poser soucis il me semble et l’usage du langage de script (PL/SQL ou Transact-SQL) dans du code dynamique.
Voilà les dernières infos.
Je pense que les assemblies CLS-Compliant de Delphi .NET pourront être utilisés mais là je dois creuser un peu plus !
Je confirme que le partenariat d’Oracle avec Microsoft ne permet à Oracle d’utiliser la CLR que sur la version Windows.
Par contre, il semble se dire qu’un développement avec Mono existe… Ya du Testing déja pour que la lib ODP.net fonctionne parfaitement avec Mono.
merci,
il serait interessant que oracle se rapproche du projet mono (allez rêvons encore) et file un coup de main au projet).
Pour les curieux
Oracle Database Extensions for .NET Developer
Bonne lecture
Pour le moment je crois que c’est uniquement sous Windows, Oracle doit bien accéder aux assemblies (pour ce dernier point c’est à vérifier).
Extrait d’un article sur le sujet issu de Oracle magazine ,september/october 2005,(c) Oracle.
Windows .NET integration
Oracle Database 10g R2 for Windows 2000/2003/XP includes the common language runtime (CLR) environment running as an external host process in tandem with the Oracle database instance.
Application developpers can write stored procedures and functions using any .NET-compliant language, such as C# or Visual Basic .NET, and use these .NET stored procedures in the database, just as they can use PL/SQL or JAVA stored procedure.
oracle on mono… mouahahahahahaa ! ca serait la fin
Bonne question de lunatix
A moins que oracle utilise mono ? hmmm j’ai du mal à le croire …
Je dois étudier la doc, elle vient d’être mise à jour il y a qq jours.
Ne connaissant pas SQL-Server et pas suffisament ODT, je ne saurais répondre.
Pour le code ‘classique’ à prioris oui, en revanche pour l’accés au données je ne sais pas s’il existe qq chose se rapprochant du Pro*C permettant d’intégrer du SQL dans du code C# au sein d’une procédure stockée.
Il vaut mieux, je pense, le cantonner à des traitements sans accés au données, le PL/SQL fait ça trés bien.
Sous Oracle une procédure stockée C# nécessite un wrapper comme le JAVA. C’est à confirmer.
j’ai une question… si au final on decide d’herberger Oracle sur un *nix (ce qui est quand meme tres courant voir la norme). Ca marche toujours ?
J’achète
Je suis sous oracle 8i et oracle et ADO.NET sont parfois trés peu copain.
Vivement cette dernière version que je migre :).
J’ai encore trés peu regardé les procédures stockés en .NET sous oracle… puis-je avoir un maigre espoir de retrouver des similitudes entre les procédures stockées de SQL-Server 2005 et oracle ? Bon je crois que je rêve un peu, en tous cas ça sera toujours plus pratique que le PL/SQL ou le java