【问题标题】:No results from PL/SQL query, but there should be.PL/SQL 查询没有结果,但应该有。
【发布时间】:2015-11-21 15:13:09
【问题描述】:

我知道有几个关于这个错误的问题,也适用于 php。
我已经尝试了大多数答案,但似乎没有任何效果。

这是我的查询:

"select
    id,
    employeenr,
    name,
    section,
    description,
    duration,
    to_date(substr(startdate,0,12)||' '||starttime, 'DD-MM-YYYY HH24:MI:SS') starttime,
    to_date(substr(enddate,0,12)||' '||endtime, 'DD-MM-YYYY HH24:MI:SS') endtime,
    worktime,
    statement,
    remark
    from
    data
    where   1=1
    ".$vw."
    AND startdate between to_date(':df 00:00:00', 'DD-MM-YYYY HH24:MI:SS') and to_date(':dt 23:59:59', 'DD-MM-YYYY HH24:MI:SS')
    ".$vw1."
    order by nvl(employeenr,0), startdate";
$parameters = array(':df' => $date_from, ':dt' => $date_to);

Echo var vw:

AND ( employeenr between '100000' and '199999'OR employeenr between '400000' and '499999'OR employeenr between '700000' and '799999'OR (employeenr is not null AND employeenr between '100000' and '199999'OR employeenr between '400000' and '499999'OR employeenr between '700000' and '799999'))

$date_from 和 $date_to:

$date_from = $_POST["date_from"]; // jQuery datepicker value
$date_to = $_POST["date_to"]; // jQuery datepicker value

我做错了什么?

【问题讨论】:

  • employeenr 介于 '100000' 和 '199999'OR 之间 - 在 OR 和 '199999' 之间留一个空格
  • 那个?代表一个参数。如果您查看查询,您将在底部看到 $parameters = array($date_from);在此之下,我发布了该变量的回声。
  • @AbdullaChozhimadathil 可惜没用
  • $vw1 中有什么内容?
  • 什么是“?”在查询中?

标签: php sql oracle plsql


【解决方案1】:

$Parameters 后面怎么用?看起来好像您想将其用作 bind varibale 数组,以便稍后传递给 Oracle。如果是这样,那么您使用它不正确,因为字符串包含 SQL 而不是保存变量的值。这不是绑定变量在 Oracle 中的工作方式。

你必须给Oracle一个完整的查询来解析,只有查询中的可以是未知的(日期、数字或字符串)。这些你可以稍后通过。您无法解析半个查询并稍后在变量中添加更多 SQL。

所以AND ? 无法解析,因为这里没有任何意义。另一方面,可以解析 AND X = ? 之类的内容,因为 Oracle 期望在执行查询时获得将 X 列与稍后进行比较的值。

【讨论】:

  • 我知道,我意识到了。我已经改了,会更新的
【解决方案2】:

新问题,新答案。

您仍然没有将绑定变量用于变量(日期、数字或字符串),而是尝试用它替换字符串的 part。这不起作用。

':df 00:00:00' 是一个包含冒号后跟“d”、“f”等的字符串。

对完整的字符串使用绑定变量,即:

AND startdate >= to_date(:date_from, 'DD-MM-YYYY')
AND startdate < to_date(:date_to, 'DD-MM-YYYY') + 1

AND TRUNC(startdate) BETWEEN to_date(:date_from, 'DD-MM-YYYY') 
                         AND to_date(:date_to, 'DD-MM-YYYY')

AND startdate between to_date(:date_from || ' 00:00:00', 'DD-MM-YYYY HH24:MI:SS') 
                  and to_date(:date_to || ' 23:59:59', 'DD-MM-YYYY HH24:MI:SS')

【讨论】:

  • 已将您的代码添加到查询中,现在得到文字与格式字符串不匹配的错误。
  • 您的变量必须包含格式为“DD-MM-YYYY”的字符串,例如'27-08-2015' 没有任何前导或尾随空格,用减号作为分隔符,并且日期和月份实际上分别是两位数,而年份有四位数字。
  • string(10) "01-06-2015" string(10) "15-06-2015" 以上值是两个 post 变量的 var_dump
  • 那可能是因为我将绑定变量从 df/dt 重命名为 date_from/date_to?我这样做是为了可读性,但当然名称必须在绑定发生时匹配。
  • 奇怪。我不知道为什么会这样。正如您所展示的字符串与格式匹配,一定是 Oracle 没有正确获取它们,而是可能是空字符串。我不知道为什么。我还没有将 Oracle 与 PHP 一起使用,所以我不知道如何传递绑定变量以及可能出现的典型错误。对不起。
【解决方案3】:

解决方案

我已经能够通过删除查询的 SELECT 区域中的 substr 来解决我的问题。

$sql_report = "
        select
        id,
        employeenr,
        name,
        section,
        description,
        duration,
        startdate,
        starttime,
        enddate,
        endtime,
        worktime,
        statement,
        remark
        from
        data
        where   1=1
        ".$vw."
        AND startdate BETWEEN to_date('$date_from', 'DD-MM-YYYY') AND to_date('$date_to', 'DD-MM-YYYY')
            ".$vw1."
        order by nvl(employeenr,0), startdate";
$parameters = array();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多