Oracle C++ Call Interface (OCCI) を使用して、Oracle 用の汎用データベース処理レイヤーを作成しています。アプリケーションの他の部分から提供された SQL 文字列を受け入れる必要があり (それがどのようなステートメントであるかは示されません)、そのステートメントのタイプがアプリケーションの呼び出し側で許可されていることを確認し、許可されている場合は、代わりにそれを実行する必要があります。発信者の。
ただし、提供された SQL 文字列に基づいて作成した OCCI ステートメントから SQL ステートメントの種類 (select、update、delete など) を取得する効率的な方法が見つかりません。
OCIAttrGet()
OCI では、OCI ステートメント ハンドルを呼び出しOCI_ATTR_STMT_TYPE
てパラメーターに渡すことでこの情報を取得attrtype
できますが、OCCI で同等の関数を見つけることができません。
を呼び出して OCCI ステートメントから OCI ステートメント ハンドルを取得できgetOCIStatement()
ますが、これまでのところ、この OCI ステートメント ハンドルからステートメント タイプ属性を取得する試みは失敗しています。
OCIStmt *ociStmt = sqlstmt->getOCIStatement();
ub2 statementType = OCI_STMT_UNKNOWN;
OCIError *errhp = 0;
sword result = OCIAttrGet(ociStmt, OCI_HTYPE_STMT, &statementType, 0, OCI_ATTR_STMT_TYPE, errhp);
上記を実行するresult = -2
と、変更はありませんstatementType
いずれにせよ、このアプローチはかなり後進的であり、むしろ OCCI でクリーンに動作すると思います。
準備されたOCCIステートメントのSQLステートメントタイプを判断する方法を知っている人はいますか(効率的でも安全でもない生のSQL文字列を解析する以外に)?