アーカイブ

Archive for the ‘Oracle’ Category

ODAC 12c Release 4 Visual Studio 2015対応とスキーマ比較の機能追加

2015年10月16日 コメントを残す

ODAC 12c Release 4がダウンロード可能になっています。

OTNダウンロードページ:

http://www.oracle.com/technetwork/topics/dotnet/whatsnew/index.html

NuGet

 https://www.nuget.org/profiles/Oracle

 

今回のリリースはVisual Studio 2015への対応とマネージドドライバの機能拡張がほとんどなようですが、個人的に注目すべきはoffline schema comparisonです。

ODAC 12c Release 2で追加されたスキーマ比較はDatabase To Databaseだけだったのですが、今回追加されたOracle Database Project Version2(Beta)を利用すると、Database To Projectまたは、Project To Projectのスキーマ比較とスキーマの更新が利用できます。

キャプチャ 

サーバーエクスプローラーでの表の見え方が変わっています。関連表、、、まぁわかるけれど、、、

キャプチャ2

スキーマの比較を選択すると、データベース接続とプロジェクトを選択可能です。

古いデータベースプロジェクトには対象にできないようです。

image

Betaの悲しさか、サーバーエクスプローラーからデータベースプロジェクトへにインポートができないです。まぁスキーマ比較で入れれば良いんですけれど、、、

Betaが取れるのは何時かな。。。

カテゴリー:Oracle, Visual Studio

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表を検索するおなじみのサンプルを作る。ん?

image

コンピューターに MSVCR100.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。

Microsoft Visual C++ 2010 再頒布可能パッケージ (x64)のインストール

ダウンロードセンターからダウンロードしてインストールします。

http://www.microsoft.com/ja-jp/download/details.aspx?id=14632

 

無事動きました。

カテゴリー:ASP.NET, Oracle タグ:

OracleオフィシャルのNuget版ODP.NET

2015年2月6日 1件のコメント

OracleオフィシャルのNuget版ODP.NETがいつのまにやらリリースされていました。

Visual StudioのNuget パッケージ管理から検索するといろいろ引っかかって紛らわしいですが、Offical版のパッケージ名は、Oracle.ManagedDataAccessになったようです。

PM> Install-Package Oracle.ManagedDataAccess

image

まだ出始めなので、UnOfficalな子達のほうが上位に上がってきていますが、12cのアイコンが有る奴がOffical版ですね。

image

インストールするとOracle.ManagedDataAccessが参照に加えられ、app.config/web.configにいくつかの修正が加えられます。あとはこれまでのコーディングと同じくプログラミングすればいいはずです。そういえば、DTCのDLLはどうなるんだ?

image

カテゴリー:プログラミング, Oracle タグ: ,

Oracle 12cクライアントからOracle 9iには接続できない

2015年1月15日 コメントを残す

前回のエントリーで、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をインストールして切り替えるようにします。

カテゴリー:Oracle タグ:

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)

http://docs.oracle.com/cd/E56485_01/index.htm

既存のODT.NETのVisual Studioごとの共存が可能に?

インストールの途中にこのODT.NET(Visual Studioの拡張)をインストール済みのどのVisual Studioに適用するかという選択と、ODP.NETをマシンワイドレベルで構成するかという選択が可能になっていました。これまでのODT.NETは単一バージョンのみサポートされていましたが、今回のバージョンからはVisual Studioのバージョンごとに複数バージョンのODT.NETのインストールが可能になっているようです。

image

左はVisual Studio 2010+ODTwithODAC112012、右はVisual Studio 2013+ODTwithODAC121021

ODT.NETをマシンワイドレベルで構成しない場合、下記のダイアログの説明の通り、machine.configへの登録やGACへの登録が行われないのでアプリケーションで新しいバージョンのODP.NETを利用する場合web.configやapp.configへプロバイダの登録が必要になります(直にDLLを参照する場合はなくても動く)。

image

インストール後に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を選択する必要がありそうです。間違って新しいバージョンを参照してアプリを作ってしまうと実行環境で動かないとかいうことも…

image

#これでやっとスキーマ比較を自分の普段使っているPCでも使えるようになった。

カテゴリー:Oracle, Visual Studio, 未分類 タグ: ,

Oracle Database 12cではパッケージ仕様部で定義したコレクション型をパッケージ実装部のSQLで利用することができるみたい。

2014年12月4日 コメントを残す

これまで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
as

type SampleArrayType is table of char(5);

function Sample1(arr SampleArrayType) return number;

end test2;

create or replace package body Test2
as

function 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 タグ: ,

Oracleで長い文字列をVARCHAR2で利用する場合の注意点

2014年11月20日 コメントを残す

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を利用する。

カテゴリー:プログラミング, Oracle タグ:

ODP.NETもNugetで簡単接続

2014年10月10日 コメントを残す

2015/02/06追記

OracleオフィシャルのNuGetパッケージが出ています。できるだけこちらを使用してください。

OracleオフィシャルのNuget版ODP.NET

 

Oracle Open World 2014のPPTを見ていて気づいたんですが、ODP.NET(マネージド版)はNugetで配布されているんですね!!非マネージド版は相変わらずOracleClientを必要とするので最低でもInstantClientのXCOPYデプロイが必要になります。(管理対象とか、非管理対象とか日本語に訳さないようがいいような気がする。)

https://www.nuget.org/packages/odp.net.managed/121.1.2

image

まぁ実際に開発で使う場合にはODT.NETのサポートも受けたほうが効率がいいので、おそらくOTNからODT.NETをダウンロードしてインストールしますが、Oracleクライアントをインストールしていない端末でも簡単にOracleに接続するプログラムを構築できるようになったのは大きいです。

これまでODT.NETは復数バージョンのインストールが難しかったのでNugetを使うことでプロジェクト内でDLLのバージョンが閉じてくれるのは嬉しいですね。また、ビルドサーバーなんかでは復数のプロジェクトをホストするはずなのでOracleClientをいくつも入れなくていいのも嬉しい限り。Visual Studio OnlineなんかみたいにOracleClientをインストール出来ない環境もありますし。

この他にもODP.NETの次期バージョンではEF6+CodeFirstがサポートされるようなのでこちらにも期待です。Oracle Open WorldのWindows/.NET関連のセッション一覧とスライドはここから確認できます。

.NET Development/Oracle Database on Windows

あとはこいつがPCL化してくれればストアアプリやスマートフォンからも。。。って、もちろんしますよね。Oracleさん!!

カテゴリー:プログラミング, Oracle タグ:

ODT.NET 12.1.0.1.2のスキーマ比較はUIからのみ実行でき、対象はDBスキーマのみ

2014年3月26日 コメントを残す

昨日の記事でODT.NETの12.1.0.1.2ではスキーマ比較ができるようになったってエントリーを書いたんですが、その後データベースプロジェクトとの比較と自動ビルドからのスキーマ比較を調べていたら、どうも今回のリリースは制限リリースで、データベースのスキーマ同士以外のスキーマ比較は対応していなそうです。

ODT.NETをインストールしたORACLE_HOMEにあるODACDocフォルダーにあるODTのreadmeのKnown Issuesを見るとこんな記述がありました。

image

Oracle Open World の.NET関連のスライドにある、ALM with Visual Studio: SQL and PL/SQL Development, Source Control, and Deploymentのスライド(45ページあたり)を見ても、データベースどうしの比較についてのみ触れられているので、このリリースに関してはデータベースプロジェクトとの比較はできないようです。また、当然ながらTFSの自動ビルドと組み合わせて自動配置ってのも難しそう。

うーん、今のところってことなんだよね??(希望)。

カテゴリー:Oracle, Visual Studio タグ:

ODT.NETのスキーマ比較を使ってみる

2014年3月25日 3件のコメント

ちょっと前にでODAC 12c Relase2では、ついにOracleデータベースに対してVisual Studioからスキーマ比較ができるようになったってのを触れたと思いますが、どんな感じで使えるのか確認してみます。

Oracle Data Provider for .NET 12.1のODP.NET管理対象ドライバ

ダウンロード/インストール

最初につまづきます。日本のOTNにあるODT.NETのリンクからはXCopy版のODP.NETしかリンクされておらず、ODT.NET(Visual Studioの拡張機能を含んだアーカイブ)が見当たらないので、本家のダウンロードリンクからダウンロードします。インストール自体はダウンロードしたアーカイブ中のSetupを実行してウィザードにしたがってインストールしていけばOKです。

32-bit Oracle Data Access Components (ODAC)  with Oracle Developer Tools for Visual Studio

データベースに接続する

Visual Studioのサーバーエクスプローラーから、新規の接続を作成します。

image

スキーマ比較を行うデータベースへの接続情報を入力します。接続タイプでEZ接続を選択すると、簡易接続子を利用してTNSを利用しないで接続することもできます。ココでは比較元をDEV、比較先をSTGという名前で接続を作成します。

image

2つのデータベーススキーマを比較する

比較元のデータベースを選択し、コンテキストメニューからOracleスキーマの比較を選択します。

image

どのスキーマを比較対象にするかを選択し、OKボタンをクリックします。詳細ボタンを押すとスキーマ比較の比較対象を設定することができます。

image

比較が開始され、、、

image

比較結果が表示されます。比較結果は右上のフィルターアイコンから異なる定義のみなどに絞ることができます。また、SQLの更新ペインにはスキーマをソースと同じ定義に変更するためのDDLが出力されます。

image

まずはここまで。SQL Serverのデータベースプロジェクトでは随分前に同じことができていたので、OracleもやっとVisual Studioに対応したというところですね。そういえば、Oracle SQL Developerのデータベース差分は別にライセンスが必要だったってのを見たことがあるけれどこちらは特に触れられていないですね。→ Oracleのスキーマを比較するツール

参考:Using Schema Compare in Visual Studio 2012

カテゴリー:メモ, Oracle, Visual Studio タグ: ,