【问题标题】:Oracle SQL Merge Query Works in GUI, Fails in PHP ScriptOracle SQL 合并查询在 GUI 中工作,在 PHP 脚本中失败
【发布时间】:2012-04-16 23:51:31
【问题描述】:

我的应用程序代码中有一个无法运行的 Oracle 合并查询。但是,当我回显查询并在 sqldeveloper 中运行它时,它运行良好。奇怪的是,我只有合并查询的这个问题;使用直接插入查询,一切正常。

代码示例:

$sql = "merge into table1 c using (select '$value' as value from table1  where ROWNUM=1) cd
    on (c.value = cd.value)
    when matched then
       update set c.col1 = '$col1val', c.col2= '$col2val'
    when not matched then
        insert (c.col2, c.col2, c.col3)
    values ('$col1val', '$col2val', '$col3val')";

$stid = oci_parse($conn, $sql); 
$result = oci_execute($stid);

//Checking to see if it ran properly
if(!$result)
{
  echo "query failed:  $sql";
}

echo $sql;  //If I copy what gets echoed onto the screen into my db gui and run it, I get '1 row merged' with no warnings or errors

在上面的代码 sn-p 中,我总是得到“查询失败”的语句。另外,当我检查数据库时,我注意到没有执行任何更新或插入。相反,如果我要将合并查询更改为直接插入查询,例如:

$sql = "insert into table1 (col1, col2, col3) 
        values ('$col1val', '$col2val', '$col3val')";
$stid = oci_parse($conn, $sql); 
$result = oci_execute($stid);

//Checking to see if it ran properly
if(!$result)
{
  echo "query failed:  $sql";
}

那么它根本不会失败。我没有收到“查询失败”,我在数据库表中看到了新行。

我不知道为什么这只发生在合并查询中。作为参考,我使用的是 Oracle 10g 和 PHP 5。任何帮助将不胜感激。谢谢。

*******找到答案 *******

正如 Roger 所指出的,需要绑定查询。这就是我解决问题的方法:

//REMOVE  single quoted variable ('$var') and used binding instead (:val)
$sql = "merge into table1 c using (select :value as value from table1  where ROWNUM=1) cd
    on (c.value = cd.value)
    when matched then
       update set c.col1 = :col1val, c.col2= :col2val
    when not matched then
        insert (c.col2, c.col2, c.col3)
    values (:col1val, :col2val, :col3val)";

$stid = oci_parse($conn, $sql); 

//BIND VALUES
oci_bind_by_name($stid, ":col1val", $col1val);
oci_bind_by_name($stid, ":col2val", $col2val);    
oci_bind_by_name($stid, ":col3val", $col3val);

$result = oci_execute($stid);

【问题讨论】:

  • 当你说它不运行时,会发生什么?请给我们一些东西。描述行为,包括任何输出,例如错误消息。
  • 如果在 PHP 中执行语句“select '$value' as value from dual”,结果集中的 VALUE 列有什么?
  • @APC:我更新了问题以包含更多详细信息。我添加了错误检查以查看查询是否已执行。当它是一个合并语句时它不会,但是当它是一个插入语句时它工作正常。

标签: php oracle


【解决方案1】:

在某些操作系统中,您需要以某种方式转义“$”等特殊字符 要检查的另一件事是,如果操作系统在多行上存在 sql 问题,那么您可能需要构建一个包含 SQL 的字符串。

【讨论】:

  • 谢谢!我检查了 PHP 手册的绑定并找到了 oci_bind_by_name 的示例。我在 sql 语句中使用 :val 而不是 '$val',然后在 oci_parse 之后使用 oci_bind_by_name() 来替换值,现在它可以工作了。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多