원클릭으로
dotnet-access-to-oracle-migration
こんなときに使う: Migrate Access SQL to Oracle, generate .NET C# code. Use when converting Access queries to Oracle.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
こんなときに使う: Migrate Access SQL to Oracle, generate .NET C# code. Use when converting Access queries to Oracle.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | dotnet-access-to-oracle-migration |
| description | こんなときに使う: Migrate Access SQL to Oracle, generate .NET C# code. Use when converting Access queries to Oracle. |
| license | MIT |
| metadata | {"author":"RyoMurakami1983","tags":["dotnet","oracle","access","csharp","database-migration"],"invocable":false} |
AccessデータベースクエリをOracleに移行し、.NET(C#)IOracle実装クラスを生成するためのエンドツーエンドワークフロー。TNS解決、VIEW/SYNONYM検出、SQL変換、レコード数検証をカバー。
以下の場合にこのスキルを使用してください:
skill — 公開前のスキル検証・改善skill-writing-guide — スキル作成のベストプラクティス. → _変換を逆転してOracle形式に戻す(基礎と型)tnspingコマンド用)Oracle接続を試行する前に、必要な情報をすべて事前に収集する。
ユーザーから収集する項目:
Why: 事前に情報を集めないと、複数回の往復が発生する(TNS名違い → 再確認、認証情報不足 → 再確認)。一括収集により1パスで移行完了できる。
Values: 基礎と型 / 継続は力
tnspingを実行して、TNS/DSN名をOracle.ManagedDataAccess.Coreが必要とするEZ Connect形式に変換する。
# ✅ 正解 — TNS名をEZ Connect形式に解決
tnsping PROD_DSN
出力から抽出:
192.0.2.10, PORT: 1521, SERVICE_NAME: prod_service192.0.2.10:1521/prod_serviceWhy: Oracle.ManagedDataAccess.CoreはEZ Connect形式を要求する。形式を推測するとORA-50201エラーが発生し、デバッグ時間を浪費する。
Values: 基礎と型 / ニュートラル
ORA-*エラーコードを学習シグナルとして活用し、DSN・認証・ネットワークの問題を修正する。
# ✅ 正解 — エラーハンドリング付き接続テスト
Add-Type -Path "Oracle.ManagedDataAccess.dll"
$conn = New-Object Oracle.ManagedDataAccess.Client.OracleConnection
$conn.ConnectionString = "User Id=SCHEMA_A;Password=your_password;Data Source=192.0.2.10:1521/prod_service"
try {
$conn.Open()
Write-Host "✓ 接続成功"
$conn.Close()
} catch {
Write-Host "Error: $($_.Exception.Message)"
}
| Error Code | Cause | Solution |
|---|---|---|
| ORA-50201 | DSN形式不正 | tnspingでEZ Connect取得 |
| ORA-01017 | 認証情報誤り | ユーザー名/パスワード再確認 |
| ORA-12154/12545 | TNS/ネットワーク問題 | EZ Connectまたはファイアウォール確認 |
Values: 基礎と型 / 成長の複利
Accessの . → _ 変換を逆転:SCHEMA_A_production_info → SCHEMA_A."production_info"
// ✅ 正解 — 最初のアンダースコアでのみ分割
var parts = "SCHEMA_A_production_info".Split('_', 2);
string oracleFormat = $"{parts[0]}.\"{parts[1]}\""; // SCHEMA_A."production_info"
Why: Accessはリンクテーブル名の.を暗黙的に_に変換する。これを逆転しなければ、すべてのOracleクエリが「テーブルが見つからない」エラーになる。
Values: 基礎と型
TABLEと決めつけずオブジェクトタイプを確認する。Accessはすべてのリンクオブジェクトを「テーブル」として表示し、Oracleの実際の構造を隠す。
-- ✅ 正解 — TABLEと決めつけずオブジェクトタイプを確認
SELECT owner, object_name, object_type
FROM all_objects
WHERE object_name IN ('production_info', 'detasheet_info')
AND owner IN ('SCHEMA_A', 'SCHEMA_B', 'PUBLIC')
ORDER BY owner, object_name;
Why: このステップを飛ばすと、カラムクエリとSQL変換で連鎖的なエラーが発生する。
Values: ニュートラル / 基礎と型
実際のテーブル所有者(SYNONYM所有者ではない)でall_tab_columnsを照会し、正確なカラム名を取得する。
-- ✅ 正解 — 実際のテーブル所有者からカラムを照会
SELECT column_id, column_name, data_type, data_length
FROM all_tab_columns
WHERE table_name = 'production_info'
AND owner = 'SCHEMA_B' -- SYNONYM所有者ではなく実際の所有者
ORDER BY column_id;
Why: Oracleのカラム名は大文字小文字を区別する。カラムの欠落やスペルミスはサイレントなデータ損失やクエリエラーの原因になる。
Values: 基礎と型 / 継続は力
3つのルールを一貫して適用し、Access SQLをOracle SQLに変換する。
Rule 1: テーブル名 — SCHEMA_A_production_info → SCHEMA_A."production_info"
Rule 2: カラム名 — ship_date → "ship_date"
Rule 3: 文字列リテラル — "202601" → '202601'
-- ❌ 誤り — Access SQL
SELECT SCHEMA_A_production_info.ship_date
FROM SCHEMA_A_production_info
WHERE SCHEMA_A_production_info.ship_date >= "202601"
-- ✅ 正解 — 適切なクォートを使用したOracle SQL
SELECT s."ship_date"
FROM SCHEMA_A."production_info" s
WHERE s."ship_date" >= '202601'
Why: AccessとOracleは逆のクォート規則を使用する。3ルールを一貫して適用することで、最も一般的なSQL変換エラーを防止できる。
Values: 基礎と型 / ニュートラル
変換したSQLをOracleで実行し、レコード数をAccess件数と比較する。±5件差を許容。
# ✅ 正解 — Oracleレコード数を取得して比較
$cmd = $conn.CreateCommand()
$cmd.CommandText = 'SELECT COUNT(*) FROM SCHEMA_A."production_info" s WHERE s."ship_date" >= ''202601'''
$oracleCount = [int]$cmd.ExecuteScalar()
$accessCount = 178
$diff = [Math]::Abs($oracleCount - $accessCount)
if ($diff -le 5) {
Write-Host "✓ Near Equal: Access=$accessCount, Oracle=$oracleCount (diff=$diff)"
} else {
Write-Host "⚠ Difference too large (diff=$diff)"
}
Why: 正確な件数一致は稀である(AccessとOracleは異なるタイミングでクエリを実行するため)。Near Equalは同一スナップショットを要求せずに正確性を検証する。
Values: 成長の複利 / 継続は力
検証済みOracle SQLを使用して、IOracleインターフェースを実装するC#クラスを作成する。
// ✅ 正解 — IOracle実装テンプレート
using System;
namespace OracleApp
{
internal class SampleDataExtractor : IOracle
{
string IOracle.User => Environment.GetEnvironmentVariable("ORA_USER") ?? "SCHEMA_A";
string IOracle.Password => Environment.GetEnvironmentVariable("ORA_PW") ?? "your_password";
string IOracle.Dsn => Environment.GetEnvironmentVariable("ORA_DSN") ?? "192.0.2.10:1521/prod_service";
// C# verbatim strings (@"") require doubling internal quotes
public string Sql => @"
SELECT
s.""ship_date"",
s.""prod_number""
FROM SCHEMA_A.""production_info"" s
WHERE s.""ship_date"" >= '202601'";
}
}
C#文字列エスケープルール: Oracle "ship_date" → C# @""ship_date""(引用符を二重にする!)
Why: コード生成は最終ステップ。SQL検証前にコードを生成すると、SQLレベルの失敗より追跡が困難なランタイムエラーが発生する。
Values: 継続は力 / 成長の複利
What: 接続前にtnspingを実行してTNS/DSN名をEZ Connect形式に解決する。
Why: ORA-50201エラーを排除し、正確なHOST/PORT/SERVICE_NAMEを取得できる。
Values: 基礎と型(再現可能な型)
What: カラムやデータをクエリする前にall_objectsとall_synonymsを確認する。
Why: AccessはOracleのVIEW/SYNONYM構造を隠す。TABLEと決めつけると連鎖的なエラーが発生する。
Values: ニュートラル(偏らない検証)/ 基礎と型
What: SQL変換前にすべてのAccessカラムがOracleに正確なスペルで存在することを確認する。
Why: 大文字小文字区別のカラム名はサイレントなデータ損失を引き起こす。早期検証が遅い失敗を防ぐ。
Values: 継続は力(段階的検証)
Problem: Oracle.ManagedDataAccess.CoreにData Source=PROD_DSNを渡す。
// ❌ 誤り — ODBC DSN名はORA-50201の原因
var connStr = "User Id=SCHEMA_A;Password=your_password;Data Source=PROD_DSN";
Solution: tnspingでEZ Connect形式を取得する。
// ✅ 正解 — EZ Connect形式
var connStr = "User Id=SCHEMA_A;Password=your_password;Data Source=192.0.2.10:1521/prod_service";
Problem: 実際のテーブルがSCHEMA_Bにあるのにowner = 'SCHEMA_A'でall_tab_columnsをクエリ。
Solution: まずall_objectsを確認し、次にall_synonymsで実際のテーブル所有者を取得。
Problem: Oracle SQLをC#にコピー&ペーストする際に引用符を二重にしない。
Solution: C# @""文字列内のすべての"を二重にする: s."ship_date" → s.""ship_date""
What: Data Source=PROD_DSNがData Source=someserver:1521/PROD_DSNを意味すると仮定する。
Why It's Wrong: TNS名は予測可能なパターンに従わない。ホスト名はIP、DNS名、エイリアスの場合がある。
Better Approach: 常にtnspingを実行して正確なHOST/PORT/SERVICE_NAMEを取得する。
tnsping → EZ Connect形式SCHEMA."table_name"形式all_objects(VIEW/SYNONYM/TABLE)all_tab_columns(実際の所有者で)""エスケープ付き)| Access | Oracle | C# @"" 文字列 |
|---|---|---|
SCHEMA_A_production_info | SCHEMA_A."production_info" | SCHEMA_A.""production_info"" |
ship_date | "ship_date" | ""ship_date"" |
"202601" | '202601' | '202601' |
モダン C#(12+)で record、パターンマッチング、合成、Result 型エラーハンドリングを使った 慣用的で高性能なコードを書く。こんなときに使う: 新規 C# コードの作成、API 設計、 または C# 12+ イディオムへのリファクタリング。
こんなときに使う: WPFアプリケーションに社員番号入力ダイアログを追加し、 DPAPIで暗号化された設定として社員IDを安全に保存したいとき。
こんなときに使う: 繰り返し発生する業務問い合わせ(監査、アンケート、コンプライアンス調査)に対して、 過去の回答実績とエビデンスを活用して回答するためのテンプレートスキル。 再利用可能な7ステップワークフローとスキャフォールディングファイルを提供する。
こんなときに使う: PDFテキスト抽出、Optical Character Recognition (OCR)、結合/分割、フォーム処理をuvベースの再現可能コマンドで実行したいときに使う。
こんなときに使う: .NETドメイン層で汎用的な重み付きフィールドマッチングとスコアリングを実装。
こんなときに使う: dotnet-tools.json によるローカル .NET ツールの管理。開発環境と CI/CD パイプライン全体で バージョン固定された一貫したツール環境を構築。リポジトリ単位の CLI ツール管理時に使用。