4

私たちのC++プログラムは、OracleとOCIを使用してデータベース作業を行っています。場合によっては、ユーザーが制約違反をトリガーします。これを検出して、OCIErrorGetからのエラーメッセージを表示します。OCIErrorGetは、次のような文字列を返します。

ORA-02292: integrity constraint (MYSCHEMA.CC_MYCONSTRAINT) violated - child record found
ORA-06512: at line 5

Oracleエラーから「MYSCHEMA.CC_MYCONSTRAINT」を抽出する最もクリーンな方法を探しています。制約の名前がわかっているので、より適切なエラーメッセージを表示できます(制約名にアクセスできる場合、コードは非常に意味のあるエラーメッセージを検索できます)。

正規表現などを使用して、Oracleメッセージが変更されることはないと想定できますが、これは私には少し壊れやすいようです。または、特定のORAコードを探して、括弧の間にあるテキストを取得することもできます。しかし、制約が失敗した場合に、ハードコードされた文字列操作に頼ることなく、失敗した制約の実際の名前を把握するための、よりクリーンで堅牢な方法がOCIにあることを望んでいました。

何か案は?

4

1 に答える 1

3

Oracle Docsによると、文字列検索はまさにあなたがする必要があることです:

メッセージ内の可変テキストの認識

エラーの検出と修正を支援するために、Oracleは一部のメッセージにオブジェクト名、数字、および文字列を埋め込みます。これらの埋め込み変数は、必要に応じて、文字列、数値、または文字で表されます。例えば:

ORA-00020: maximum number of processes (number) exceeded

上記のメッセージは、実際には次のように表示される場合があります。

ORA-00020: maximum number of processes (50) exceeded

Oracleは、「メッセージの正確性」のセクションで文字列が最新の状態に保たれると述べているドキュメントで大きなポイントを示しています。彼らがあなたに文字列検索をするつもりであるということはかなり強い提案です。

また、このWebサイトによると、Oracleエラー構造は、データ構造に取得できるものが他にないため、文字列検索を実行することを意図していることを強く示唆しています。

array(4) {
   ["code"]=>int(942)
   ["message"]=>string(40) "ORA-00942: table or view does not  exist"
   ["offset"]=>int(14)
   ["sqltext"]=>string(32) "select * from non_existing_table" 
}

この出力により、次の情報が明らかになります。

  • 変数$errisは、4つの要素を持つ配列です。

  • 最初の要素にはキー「コード」でアクセスでき、その値は番号942です。

  • 2番目の値はキー「message」によってアクセス可能であり、値は文字列「ORA-00942:テーブルまたはビューが存在しません」です。

  • 3番目の値には、キー'offset'でアクセスでき、その値は数値14です。これは、
    存在しないテーブルの名前の前の文字です。

  • 4番目のメンバーは、最初にエラーの原因となる問題のあるSQLメッセージです。

仰るとおりです; 違反している制約名を取得するためのより良い方法があれば素晴らしいのですが、文字列照合が意図された方法のようです。

于 2011-12-05T23:42:43.540 に答える