アーカイブ
ODAC 12c Release 4 Visual Studio 2015対応とスキーマ比較の機能追加
ODAC 12c Release 4がダウンロード可能になっています。
OTNダウンロードページ:
http://www.oracle.com/technetwork/topics/dotnet/whatsnew/index.html
NuGet
今回のリリースはVisual Studio 2015への対応とマネージドドライバの機能拡張がほとんどなようですが、個人的に注目すべきはoffline schema comparisonです。
ODAC 12c Release 2で追加されたスキーマ比較はDatabase To Databaseだけだったのですが、今回追加されたOracle Database Project Version2(Beta)を利用すると、Database To Projectまたは、Project To Projectのスキーマ比較とスキーマの更新が利用できます。
サーバーエクスプローラーでの表の見え方が変わっています。関連表、、、まぁわかるけれど、、、
スキーマの比較を選択すると、データベース接続とプロジェクトを選択可能です。
古いデータベースプロジェクトには対象にできないようです。
Betaの悲しさか、サーバーエクスプローラーからデータベースプロジェクトへにインポートができないです。まぁスキーマ比較で入れれば良いんですけれど、、、
Betaが取れるのは何時かな。。。
OraOps12.dllが見つからないと思ったら、MSVCR100.dllがなかった
Oracleに接続するWebサーバーを改めて構築しているわけですが、Oracleクライアントを入れるのもめんどくさい。ただ、これまでのしがらみがあってマネージドドライバーが使えないため、インスタントクライアントを利用することにしました。
いざデプロイしたサイトを実行すると、OraOps12.dllがないエラーでしばらくはまったのでメモ。
ODACをダウンロード
現在の最新版をOTNからダウンロード(現在は12.1.0.2.1)して、C:\install\odacあたりに解凍します。
http://www.oracle.com/us/products/tools/index-090165.html
インスタントクライアントのセットアップ
解凍したODACのフォルダーに移動して、allでinstant Clientをセットアップします。
cd C:\install\odac
install.bat all c:\oracle myorahome true
環境変数の設定
必要な環境変数を設定します。NLS_LANGは環境に合わせて。
環境変数名 | 設定値 | 備考 | |
1 | PATH | c:\oracle/bin;c:\oracle | binを先にする? |
2 | NLS_LANG | JAPANESE_JAPAN.JA16SJISTILDE | 必要な場合 |
動作確認
Webアプリケーションをデプロイして動かしたらこうなった。
System.TypeInitializationException: ‘Oracle.DataAccess.Client.OracleConnection’ のタイプ初期化子が例外をスローしました。
—> System.DllNotFoundException: DLL ‘OraOps12.dll’ を読み込めません:指定されたモジュールが見つかりません。 (HRESULT からの例外:0x8007007E)
場所 Oracle.DataAccess.Client.OpsInit.CheckVersionCompatibility(String version)
場所 Oracle.DataAccess.Client.OracleInit.Initialize()
場所 Oracle.DataAccess.Client.OracleConnection..cctor()— 内部例外スタック トレースの終わり —
場所 Oracle.DataAccess.Client.OracleConnection..ctor(String connectionString)
場所 LoginProcess.Load(String domain)
場所 Login.Page_Load(Object sender, EventArgs e)
場所 System.Web.UI.Control.LoadRecursive()
場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)()
調査中
しょうがないのでConsoleApplicationでDUAL表を検索するおなじみのサンプルを作る。ん?
コンピューターに MSVCR100.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。
Microsoft Visual C++ 2010 再頒布可能パッケージ (x64)のインストール
ダウンロードセンターからダウンロードしてインストールします。
http://www.microsoft.com/ja-jp/download/details.aspx?id=14632
無事動きました。
OracleオフィシャルのNuget版ODP.NET
OracleオフィシャルのNuget版ODP.NETがいつのまにやらリリースされていました。
Visual StudioのNuget パッケージ管理から検索するといろいろ引っかかって紛らわしいですが、Offical版のパッケージ名は、Oracle.ManagedDataAccessになったようです。
PM> Install-Package Oracle.ManagedDataAccess
まだ出始めなので、UnOfficalな子達のほうが上位に上がってきていますが、12cのアイコンが有る奴がOffical版ですね。
インストールするとOracle.ManagedDataAccessが参照に加えられ、app.config/web.configにいくつかの修正が加えられます。あとはこれまでのコーディングと同じくプログラミングすればいいはずです。そういえば、DTCのDLLはどうなるんだ?
Oracle 12cクライアントからOracle 9iには接続できない
前回のエントリーで、PCにODAC 12cを追加インストールしたら、「ORA-03134」が発生してOracle 9iデータベースに接続できなくなってしまいました。Oracle 12c ClientからはOracle 10g R1以前のOracleサーバーに接続できないようです。
Oracle「Oracle Client / Server Interoperability Support」にはまだOracle Client 12.2の記載はありませんが、Oracle Client 12.1.0からOracle Server 10.1以下への接続はNoとなっており接続できない(サポートしないではない)となっています。
困ったことに9iクライアントからは12cに接続できないため、9iと12cに接続する端末には11gや10g R2のOracle Clientを使ってやるか、要件を満たせるのであれば復数のOracle Clientをインストールして切り替えるようにします。
ODAC 12c Relase 3がリリース。Nuget版ODP.NETはもう少し後
Oracle Open World 2014で発表になった機能を実装し、ODAC12c Relase 3が正式リリースされたようです。ただし、このリリースと同時期に提供予定だったNugetの提供はもう少し後になるようです。
関連リソース
32-bit Oracle Data Access Components (ODAC) with Oracle Developer Tools for Visual Studio
http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html
Oracle Database Data Access Components Documentation 12c Release 3 (12.1.0.2.1)
既存のODT.NETのVisual Studioごとの共存が可能に?
インストールの途中にこのODT.NET(Visual Studioの拡張)をインストール済みのどのVisual Studioに適用するかという選択と、ODP.NETをマシンワイドレベルで構成するかという選択が可能になっていました。これまでのODT.NETは単一バージョンのみサポートされていましたが、今回のバージョンからはVisual Studioのバージョンごとに複数バージョンのODT.NETのインストールが可能になっているようです。
左はVisual Studio 2010+ODTwithODAC112012、右はVisual Studio 2013+ODTwithODAC121021
ODT.NETをマシンワイドレベルで構成しない場合、下記のダイアログの説明の通り、machine.configへの登録やGACへの登録が行われないのでアプリケーションで新しいバージョンのODP.NETを利用する場合web.configやapp.configへプロバイダの登録が必要になります(直にDLLを参照する場合はなくても動く)。
インストール後にmachine.configのsystem.dataセクションをみると、Oracle Data Provider for .NETのプロバイダー設定が以前のまま保持されていることを確認できます。既存のアプリケーションは以前のバージョンで開発したい場合などに便利ですね。
<system.data>
<DbProviderFactories>
<add name="Oracle Data Provider for .NET"
invariant="Oracle.DataAccess.Client"
description="Oracle Data Provider for .NET"
type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342" />… 略 …
</DbProviderFactories>
</system.data>
直にDLLを参照するようなアプリケーションを作成する場合は、参照先に注意
マシンワイドレベルで構成しない場合、たしかに既存アプリケーションの参照は以前のものを利用しているようですが、Visual Studioのアセンブリの参照ダイアログからOracle.DataAccess.Clientを選択しようとすると、新しいバージョンしか出てこないので、以前のアセンブリを参照したい場合は参照ボタンからじかにDLLを選択する必要がありそうです。間違って新しいバージョンを参照してアプリを作ってしまうと実行環境で動かないとかいうことも…
#これでやっとスキーマ比較を自分の普段使っているPCでも使えるようになった。
Oracle Database 12cではパッケージ仕様部で定義したコレクション型をパッケージ実装部のSQLで利用することができるみたい。
これまでPL/SQLの内部でSQLを発行するときにIN句に引数の値を利用するには、グローバルな型としてTYPE宣言した方の変数を引数としてもらい、表関数(TABLE)を使ってコレクションのネストを解除して問い合わせを行う必要がありました。
12cでもネストの解除を行う必要が有りますが、パッケージ仕様部で定義したコレクション型をSQLで利用できるようになったようです。
Oracleのマニュアルでは、新機能ガイドでこそっと紹介されています。
Oracle Database 12c 新機能ガイド
2.1.4.12 PL/SQLからSQLへのインタフェースで使用できるPL/SQL固有のデータ型
データ型がPL/SQLで宣言されたコレクションに対するPL/SQLプログラムで表演算子を使用できるようになりました。このとき、データ型としてPL/SQL結合配列を使用することもできます。(以前のリリースでは、コレクションのデータ型をスキーマ・レベルで宣言する必要がありました。)
詳しくはOracle® Database PL/SQL言語リファレンスを参照してくださいということですので、該当の記述があるOracle Database 12cリリース1(12.1)の変更点のPL/SQLとSQL間のインタフェースを越えられるPL/SQL専用データ型の追加を参照してください。
例えばこんなパッケージ定義が有るとします。Test2.Sample1は引数にもらったコレクションを元にtestTableテーブルのId列をIn句で検索してヒットした件数を返します。
create or replace package Test2
astype SampleArrayType is table of char(5);
function Sample1(arr SampleArrayType) return number;
end test2;
create or replace package body Test2
asfunction Sample1(arr SampleArrayType) return number
is
rowCount number(3);
begin
select count(*) into rowCount
from testTable
where id in (select column_value from TABLE(arr));return rowCount ;
end Sample1;end test2;
このSQLを次のような無名ブロックで実行します。
DECLARE
ARR TEST2.SAMPLEARRAYTYPE := TEST2.SAMPLEARRAYTYPE(‘123’, ‘456’);
v_Return NUMBER;
BEGIN
v_Return := TEST2.SAMPLE1(
ARR => ARR
);
DBMS_OUTPUT.PUT_LINE(‘v_Return = ‘ || v_Return);
END;
上記の無名ブロックは12cで実行すると期待通り実行できますが、11gでは下記のようなエラーメッセージが表示され実行できません。12c以前でIn句にコレクションを利用したい場合は、パッケージ仕様部ではなくスキーマのオブジェクトとして配列をTYPE宣言して上げれば同じ結果が得られます。
Error
[row:28,col:1] ORA-21700: オブジェクトが存在しないか、削除マークが設定されています。
ORA-06512: "XXXXX.TEST2", 行9
ORA-06512: 行5
なにげに嬉しいです。
Oracleで長い文字列をVARCHAR2で利用する場合の注意点
ODP.NETで大きなサイズの文字列を扱った際にハマったのでメモです。
VARCHAR2で利用できる最大桁
テーブルに定義する場合は4000byteまで利用できる(Oracle 12c以降は32767まで)。
PL/SQLで利用する場合は 32767まで(4000バイト以上は内部CLOBに自動変換される)
文字列関数
SUBSTRなどの文字列関数はNSL_LANGによって扱える長さが異なる。
例えば、NLS_LANGがJA16SJISなどマルチバイト文字を2バイトで表す場合、SUBSTRで扱える文字列は32767/2=16384までとなる。32767バイトを超えるサイズの文字列を扱う場合は、DBMS_LOBパッケージのSUBSTRなどを利用する。通常のSUBSTRとDBMS_LOB.SUBSTRは微妙にインターフェイスが異なるので注意!!
ODP.NETとの相互運用
ODP.NETのIn/OutパラメーターにVARCHAR2を利用する場合も、NLS_LANGの定義によって利用できる文字列のサイズが決まる。NLS_LANGがJA16SJS*の場合は16384まで利用できる。これ以上の文字サイズを利用する場合は、OracleDbType.Clobを利用する。