2

OracleのSQLクエリが実際に実行せずに正常に実行されるかどうか(クエリが構文的に正しいか、すべてのテーブル/列名が存在するか、ユーザーが適切な権限を持っているかなど)を確認する方法はありますか?クエリはSELECTではない可能性がありますが、データが変更される場合に実際に変更が行われることは望ましくありません。

私は次のようなことを考えました:

$valid = false;
$stmt = oci_parse($db, $query);
if(!empty($stmt)) {
  $res = oci_execute($stmt, OCI_DESCRIBE_ONLY|OCI_NO_AUTO_COMMIT);
  if(!empty($res)) {
     $name = oci_field_name($res, 1);
     if(!empty($name)) {
       $valid = true;
     }
  }
  oci_rollback($db);
}

しかし、$ queryにDDLが含まれている場合、Oracleがすぐにそれをコミットすることを理解しています。では、変更を加えずにクエリをチェックする方法はありますか?

4

2 に答える 2

1

パッケージでクエリを作成できます。パッケージがエラーなしで作成された場合、クエリは正しいはずです。

構文チェックで問題を引き起こす可能性のある役割ベースの権利。ロール ベースの権限は runtil までチェックされないため、クエリが設計時には正しくても (開発者にテーブルへの直接権限が付与されているため)、実行時に失敗する可能性があります (ユーザーに同じ権限が付与されているため)。役割)。

于 2011-04-13T20:59:46.697 に答える
1

ステップ1:

PHP コードで、次のテキストを含む文字列を作成します。

Dim myValidationString as string 

myValidationString = " create or replace procedure PROC_TEST_QUERY is " &
                     "       begin                                    " &
                     "         for i in (                             " &
                     "                   {MY_QUERY}                   " &
                     "                  ) loop                        " &
                     "             null;                              " &
                     "         end loop;                              " &
                     "       end;                                     "

ステップ2:

検証する SQL クエリを含む変数を作成します。

Dim mySQLstring as string 

mySQLstring =  " SELECT *                               " &
               "   from all_objects                     " &
               "  where owner <> 'SYS'                  " &
               "    and created > sysdate -30           " &
               " UNION ALL                              " &
               " Select *                               " &
               "   from all_objects                     " &
               "  where owner = 'SYS'                   " &
               "    and object_name like 'T%'           " &
               "    and object_type in ('TABLE','VIEW') " 

ステップ 3:

文字列の内容「{MY_QUERY}」を、検証する SQL ステートメントの内容に置き換えます。

Dim myValidationStringToExecute as string

myValidationStringToExecute = replace(myValidationString, "{MY_QUERY}" , mySQLstring)

ステップ 4:

検証クエリを実行します。

DB.EXECUTE(myValidationStringToExecute)

ステップ 5:

最後の呼び出し (DB.EXECUTE.....) でエラーが発生するかどうかを確認します。はいの場合、クエリは無効です。いいえの場合、クエリは有効です

于 2012-10-10T22:41:05.117 に答える