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

步骤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 回答
1

您可以在包中创建查询。如果包的创建没有错误,那么查询必须是正确的。

基于角色的权限可能会导致任何语法检查出现问题。直到运行时才会检查基于角色的权限,因此查询可能在设计时是正确的(因为开发人员已被授予对表的直接权限)但在运行时失败(因为用户已被授予相同的权限)职务)。

于 2011-04-13T20:59:46.697 回答