pythia-package について
pythia-packageは、Oracle PL/SQLのパッケージ、プロシージャ、関数、トリガーを設計するワークフロースキルです。契約と依存関係の確認から実装、lint、デプロイ、検証までを導きます。
主な機能
- 01実装前にパッケージ契約を設計
- 02呼び出し元、依存関係、テーブルを確認
- 03パッケージ仕様部と本体を分けて作成
- 04パラメーター、エラー、トランザクションを設計
- 05トリガーを派生処理と監査に限定
- 06lint、デプロイ、コンパイルを確認
活用シーン
- 01新しいPL/SQLパッケージAPIの設計
- 02公開範囲を制御したプロシージャや関数の追加
- 03業務プロセスを含まないテーブルトリガーの実装
- 04PL/SQLユニットのデプロイと検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ thaildhe172591/ pythia --skill pythia-packageインストール後、Claude Code で/pythia-packageを入力して読み込まれたか確認します。
同梱ファイルreference/plsql-standards.md
詳細
パッケージ、プロシージャ、関数、トリガーの設計
開始時に宣言:「pythia-package を使用して、本文を書く前に仕様を設計します。」
フェーズ: 学習 → 質問 → 実行 — まず関連するコードと呼び出し元を確認し、契約を合意してから、仕様と本文を2つのファイルに分けて作成します。
pythia-write を使うと、新しいコードをコードベースの既存コードと見分けがつかないほどなじませられます。このスキルで補うのは、コードベースに現れていないかもしれない点、つまり呼び出し元が信頼できるようにユニットをどのような形にすべきかです。プロジェクトの慣習が異なる場合は、プロジェクトの慣習を優先します。まず .pythia/conventions.md を確認し、そこで決まっていないことはすべて reference/plsql-standards.md を参照してください。
鉄則
THE SPEC IS A CONTRACT: DESIGN IT FIRST, AND NEVER BREAK IT SILENTLY
パッケージ仕様の変更は依存先すべてを一度に無効化しますが、本文の変更は何も無効化しません。この非対称性が、設計上の判断の大半を左右します。
ワークフロー
- 学習する — 上位2、3件を対象に
pythia similar <NAME>とpythia srcを実行し、呼び出すすべてのユニットについてpythia argsを実行します。パッケージが存在する場合はpythia impact <PKG>を実行します(仕様の変更はパッケージ全体に影響します)。対象となるすべてのテーブルについてpythia colsを実行します。 - 契約の形を決める(動作に検討の余地がある場合は、まず
pythia-specを使用します):- プロジェクトでスタンドアロンユニットを作成する慣習がある場合を除き、スタンドアロンではなく パッケージにします。カプセル化、プライベートヘルパー、依存先を無効化しない本文変更が可能になります。
- 公開するのは呼び出し元に必要なものだけです。それ以外はすべて本文内だけに置くプライベートなものにします。新しい公開項目は仕様の 末尾に追加します。細粒度の依存関係追跡(11g以降)があれば、既存の依存先は VALID のまま維持されます。
- パラメーターには
%TYPEを使い、デフォルトはINにします。OUTはプロシージャでのみ使用し、大きなIN OUTコレクションや LOB にはNOCOPYを使用します。デフォルト値を設定するのは、入力が真に任意の場合だけです。 - 関数は1つの値を返し、
OUTパラメーターを持たず、SQL から呼び出される可能性がある場合は DML を実行しません。 - エラー契約:仕様で名前付き例外を定義するか、パッケージごとに
-20xxxの範囲を1つ定めて文書化します。呼び出し元が「見つからない」と「壊れている」を区別できるようにします。 - トランザクション契約:コミットするのは最外部の呼び出し元です。ユニットがコミットする場合は、そのことを名前または仕様のコメントで明記します。そのユニットは、より大きなトランザクションの一部として組み合わせられません。
- ロギング/計測にはプロジェクトのロガーを使用します。長時間実行するエントリーポイントでは
DBMS_APPLICATION_INFO.SET_MODULE/SET_ACTIONを設定し、DBA が実行内容を確認できるようにします。 - セキュリティ:仕様で呼び出し元権限が必要な場合を除き、
AUTHID DEFINERを使用します。内部ヘルパーにはACCESSIBLE BY(12c)を使用し、動的 SQL に渡す識別子にはすべてDBMS_ASSERTを使用します。コード内に認証情報を記述しません。
- 2つのファイルを作成する — まず仕様、次に本文を作成します(1ファイルにつき1オブジェクト、末尾に
/を記述し、ベトナム語のメッセージにはpythia unistrを使用します)。テンプレートはreference/plsql-standards.mdを参照し、コメントにはpythia-commentを使用します。 - トリガーは薄く保つ:導出処理と監査のみとし、業務プロセス、
COMMIT、リモートシステムへの呼び出しは含めません。同じテーブルで複数のタイミングポイントが必要な場合は、複合トリガーを1つ使用します(ORA-04091 の原因となるテーブル変更中の参照への対策にもなります)。トリガーに隠れてしまいがちな業務ルールは API パッケージに実装します。 - 確認する —
pythia lint spec.sql body.sqlを実行し、続けてpythia-reviewを実行します。 - 反映する — まず仕様、次に本文の順で反映します。
pythia deploy spec.sql body.sql(承認は1回、順序どおり)を使うか、pythia applyを2回実行します。終了コード3は失敗を意味し、完了ではありません。 - 検証する —
pythia errors <PKG>を実行し、ベースラインと照らしてpythia invalidを実行します。また、未使用または一度も値が代入されていない識別子についてpythia plscope <PKG>を実行します。
危険信号 — 次のように考えていることに気づいたら、作業を止めてください
| 考え | 実際のところ |
|---|---|
| 「既存のプロシージャにパラメーターを追加するだけ」 | 呼び出し元がすべて壊れるか、再コンパイルが必要になります。オーバーロードを追加するか、仕様の末尾に新しいユニットを追加してください。 |
| 「WHEN OTHERS THEN log; で十分」 | RAISE がなければ、呼び出し元は処理が成功したと思い込みます。ログを記録してから、例外を再送出してください。 |
| 「安全のために最後に COMMIT する」 | これでは誰も自分のトランザクション内で呼び出せなくなります。コミットは呼び出し元が行います。 |
| 「このルールを実装するなら、トリガーが一番簡単」 | その分、データ修正の際に見つけるのも、テストするのも、回避するのも最も困難です。API パッケージを使ってください。 |
| 「PRAGMA AUTONOMOUS_TRANSACTION を使えば変異テーブルの問題を解決できる」 | エラーを隠し、古いデータを読み取ります。コンパウンドトリガーを使ってください。 |
| 「テーブル名を連結しても問題ない。内部処理だから」 | 今日は内部処理でも、将来は変わるかもしれません。DBMS_ASSERT.SQL_OBJECT_NAME の呼び出しは一度だけです。 |
| 「標準では X とされているが、コードベースでは Y になっている」 | コードベースを優先してください。X は別途提案してください。 |
このスキルを使わない場合
- 既存のユニット内での小さな編集 →
pythia-writeで十分です。 - テーブル設計 →
pythia-table。パフォーマンス調整 →pythia-tune。 - 他の人が作成したユニットのレビュー →
pythia-review。
コメント
Markdown 対応