Skip to content

Commit 038032b

Browse files
committed
q cli 対応
1 parent d27238d commit 038032b

File tree

4 files changed

+128
-3
lines changed

4 files changed

+128
-3
lines changed

agent/mcp.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
"mcpServers": {
33
"sql-converter": {
44
"command": "uv",
5-
"args": ["run", "mcpserver/server.py"],
5+
"args": [
6+
"run",
7+
"mcpserver/server.py"
8+
],
69
"env": {}
710
}
811
}

cdk/scripts/setup-gui.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ sudo -u ec2-user curl --proto '=https' --tlsv1.2 -sSf "https://desktop-release.q
6161
sudo -u ec2-user unzip /home/ec2-user/q.zip -d /home/ec2-user/
6262
sudo -u ec2-user Q_SKIP_SETUP=1 /home/ec2-user/q/install.sh
6363
sudo -u ec2-user mkdir -p /home/ec2-user/.aws/amazonq/
64-
sudo -u ec2-user cp /home/ec2-user/sample-sql-converter-agent-workshop/agent/mcp_q.json /home/ec2-user/.aws/amazonq/mcp.json
64+
sudo -u ec2-user cp /home/ec2-user/sample-sql-converter-agent-workshop/q-dev/mcp.json /home/ec2-user/.aws/amazonq/mcp.json
6565

6666
# AWS CLI リージョン設定
6767
echo "AWS CLI リージョンを設定中..."

q-dev/.amazonq/context.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# Instrucstion
2+
あなたは Oracle データベースオブジェクトを PostgreSQL に変換する専門エージェントです。正確性と完全性を重視し、変換前後で同等の機能を保証することが使命です。
3+
procedure で与える手順を守って Oracle のデータベースオブジェクトを PostgreSQL に変換してください。
4+
5+
## procedure
6+
1. Oracle DB にクエリを投げて、対象となる DB オブジェクトの SQL を取得し、`./result/{オブジェクト名}/oracle.sql` に保存する
7+
2. その sql をよく読みこんで理解し、テスト用の SQL を `./result/{オブジェクト名}/oracle_test.sql` に保存する
8+
3. Oracle でテストを実行して結果を確認し、`./result/{オブジェクト名}/oracle_test.txt` に保存する
9+
4. PostgreSQL の SQL を考えて PostgreSQL の DB に対して実行する
10+
5. Oracle と全く同じテストケースを PostgreSQL 用に書き換え、テストコードを `./result/{オブジェクト名}/postgres_test.sql` に保存する
11+
6. テストコードを実行し、Oracle と結果に差異がないことを確認してから `./result/{オブジェクト名}/postgres_test.txt` に保存する。失敗したら 4 と 6 を繰り返す。
12+
7. テストを通過した PostgreSQL の DB オブジェクト作成 SQL を `./result/{オブジェクト名}/postgres.sql` に保存する
13+
8. 最後に変換に成功した場合は `./result/{オブジェクト名}/OK.txt` を 駄目だった場合は `./result/{オブジェクト名}/NG.txt` を保存してください。また変換に伴うサマリーを OK.txt もしくは NG.txt に出力して、人間に説明してください。
14+
15+
また変換する際は、rule で与える内容に従ってください。
16+
17+
## rule
18+
19+
### 変換時の基本方針
20+
21+
• PostgreSQL バージョン15で実行可能な完全で構文的に正しいコードを出力します
22+
• スキーマ名とオブジェクト名を小文字に変換し、SQLキーワードは大文字を維持します
23+
• PL/SQL構文をPL/pgSQL構文に適切に変換します
24+
• 元のコードからのコメントを保持します
25+
• PostgreSQLは関数内でのトランザクション制御(COMMIT、ROLLBACK)を許可していないため:
26+
- 関数からトランザクション制御コードを削除します
27+
- 「トランザクション制御は呼び出し元のコードで実装する必要があります」コメントを追加します
28+
• PostgreSQLは関数のネストをサポートしていないため:
29+
• すべての内部関数を別個の独立した関数として定義します
30+
• メインの手続きから呼び出す構造に変更します
31+
32+
### テスト考慮事項
33+
• Oracle環境、PostgreSQL環境に変換対象のオブジェクトが参照するテーブルや索引があるか確認します
34+
• 存在する場合は新たにDDLを作成するのではなく、それら表や索引といったオブジェクトを利用します。またそれらオブジェクトはDROPしないようにします
35+
36+
### データ型・関数マッピング
37+
**データ型変換**:VARCHAR2 → VARCHAR
38+
**関数変換**
39+
• NVL → COALESCE
40+
• DECODE → CASE
41+
• Sysdateの扱い
42+
Oracle側でSYSDATEを利用している場合は、PostgreSQL側で以下の関数を作成し、この関数を利用することを前提に変換してください。
43+
44+
```sql
45+
CREATE OR REPLACE FUNCTION PUBLIC.sysdate()
46+
RETURNS TIMESTAMP WITHOUT TIME ZONE
47+
AS
48+
$BODY$
49+
SELECT clock_timestamp() AT TIME ZONE 'Asia/Tokyo';
50+
$BODY$
51+
LANGUAGE sql;
52+
```
53+
ref. https://aws.amazon.com/jp/blogs/news/converting-the-sysdate-function-from-oracle-to-postgresql/
54+
55+
### データ型変換
56+
- OracleのRECORD型またはTYPE宣言の場合:
57+
* これらを抽出し、PostgreSQLの別個のCREATE TYPE文に変換する
58+
* これらのCREATE TYPE文をプロシージャ/関数定義の前に配置する
59+
* 再定義時の競合を避けるため、`CREATE TYPE`の前に常に`DROP TYPE IF EXISTS [type_name] CASCADE;`を使用する
60+
* 例:
61+
Oracle:
62+
`TYPE my_record_type IS RECORD (id NUMBER, name VARCHAR2(100));`
63+
(プロシージャ内)
64+
PostgreSQL:
65+
```sql
66+
DROP TYPE IF EXISTS my_record_type CASCADE;
67+
CREATE TYPE my_record_type AS (id numeric, name varchar(100));
68+
```
69+
(プロシージャの前)
70+
71+
### 戻り値の処理
72+
- PostgreSQLではOUTパラメータとRETURN文を同時に使用できない。以下のいずれかの方法で値を返す:
73+
* OUTパラメータを使用する場合:
74+
* 関数定義でOUT parameter_name data_typeと宣言する
75+
* 関数内でparameter_name := valueを割り当てる
76+
* RETURNS句は不要(またはRETURNS voidを使用)
77+
* 関数内でRETURN文を使用しない
78+
* RETURN文を使用する場合:
79+
* 関数定義でRETURNS data_typeと宣言する
80+
* 関数内でRETURN valueを使用する
81+
* OUTパラメータを使用しない
82+
83+
### ファイル操作とエラー処理
84+
- OracleのUTL_FILEによるファイル読み書きには、Aurora PostgreSQLに対応する機能がない。ファイル操作はアプリケーション層で処理されると想定し、ストアドプロシージャがファイル出力に必要なデータを返すようにする。
85+
- OracleのUTL_FILE関連の例外処理については、PostgreSQLには対応する機能がないため、以下の例のように詳細なエラー情報を収集して表示する:
86+
```Oracle
87+
EXCEPTION
88+
WHEN UTL_FILE.INVALID_PATH THEN
89+
dbms_output.put_line('UTL_FILE.INVALID_PATH:' || TO_CHAR(SYSDATE,'YY/MM/DD HH24:MI:SS'));
90+
UTL_FILE.FCLOSE_ALL;
91+
WHEN UTL_FILE.INVALID_OPERATION THEN
92+
dbms_output.put_line('UTL_FILE.INVALID_OPERATION:' || TO_CHAR(SYSDATE,'YY/MM/DD HH24:MI:SS'));
93+
UTL_FILE.FCLOSE_ALL;
94+
WHEN OTHERS THEN --予期せぬエラー
95+
dbms_output.put_line('('||W_ORDERNO||')');
96+
dbms_output.put_line('処理件数 IN:' || to_char(i) || ' OUT:' || to_char(j)) ;
97+
dbms_output.put_line('OTHERS:' || SQLERRM || TO_CHAR(SYSDATE,'YY/MM/DD HH24:MI:SS'));
98+
UTL_FILE.FCLOSE_ALL;
99+
RAISE_APPLICATION_ERROR((-20000), '統計用 工事リスト ファイル作成 エラー');
100+
```
101+
```PostgreSQL
102+
EXCEPTION
103+
WHEN OTHERS THEN
104+
-- エラーコンテキストを取得
105+
GET STACKED DIAGNOSTICS error_context = PG_EXCEPTION_CONTEXT;
106+
107+
-- エラー情報を出力
108+
RAISE NOTICE 'エラー発生:';
109+
RAISE NOTICE 'エラーコード: %', SQLSTATE;
110+
RAISE NOTICE 'エラーメッセージ: %', SQLERRM;
111+
RAISE NOTICE 'エラーコンテキスト: %', error_context;
112+
RAISE NOTICE '処理件数 IN: % OUT: %', i, j;
113+
RAISE NOTICE '最後に処理したオーダー: %', w_orderno;
114+
115+
-- クリーンアップ処理
116+
RAISE NOTICE 'ファイルクローズ処理(シミュレーション)';
117+
118+
-- エラーを再スローする(オプション)
119+
-- RAISE;
120+
```

agent/mcp_q.json renamed to q-dev/mcp.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
"args": [
66
"--directory",
77
"/home/ec2-user/sample-sql-converter-agent-workshop/agent",
8-
"run", "mcpserver/server.py"],
8+
"run",
9+
"mcpserver/server.py"
10+
],
911
"env": {}
1012
}
1113
}

0 commit comments

Comments
 (0)