proc中的Oracle查询不返回结果

Posted

技术标签:

【中文标题】proc中的Oracle查询不返回结果【英文标题】:Oracle query in a proc not returning results 【发布时间】:2011-11-01 10:17:30 【问题描述】:

我在从 C# 程序调用的 Oracle[10g] 存储过程中有这个 Pl/sql 查询。:

SELECT a,b 
          FROM t1, t2 
         WHERE 
t1.Id=t2.Id
         AND NVL (TO_CHAR (t1.externalId), t2.product_name) = prm_product_name

prm_product_name 是 proc 的输入参数,声明为:

prm_product_name VARCHAR2

应用程序将“1000”或“2000”等作为输入参数值传递给 proc,并且能够在我的 C# 应用程序中成功获取查询结果。 但是当应用程序通过一个特定的数字比如 1500 时,查询不会返回任何记录。我也没有在应用程序中看到任何 oracle 异常。 当我像下面这样修改语句时,重新编译proc,然后查询proc返回结果。

AND NVL (TO_CHAR (t1.externalId), t2.product_name) = '1500'

另外,当我使用 sql 编辑器调用它时,我能够从 proc 中获取结果[没有硬编码 1500]。只有从应用程序调用它时,它才不会返回结果。 我无法理解这种行为及其根本原因。 你能告诉我如何让它工作吗?

谢谢。

【问题讨论】:

如果不查看存储过程中的所有代码,很难诊断出您描述的行为。 那个特定的数字是 1500?请张贴程序和那个号码 【参考方案1】:

我们希望您的程序在这种情况下抛出 NO_DATA_FOUND。

为什么不呢?如果没有看到整个存储过程的代码,很难说,但钱会花在执行不力的异常部分上。像这样的东西,它记录错误但不传播异常:

EXCEPTION
    WHEN no_data_found THEN
        write_error_log('no data for Product Name='||prm_product_name);
END;

甚至是恐惧

EXCEPTION
    WHEN others THEN
        null;
END;

它吞噬了事件,就好像错误从未发生过一样。

【讨论】:

感谢 APC 提供您的输入。但是我只是想知道,当从 sql 编辑器运行产品名称“1500”时,proc 怎么会给出结果?只有当它从应用程序调用时,它才会返回0 个结果。这让我感到困惑。 那也会让我感到困惑。很简单,你必须做一些你没有告诉我们的事情。例如,您的 C# 应用程序是否与您的 SQL 编辑器指向同一个数据库。

以上是关于proc中的Oracle查询不返回结果的主要内容,如果未能解决你的问题,请参考以下文章

oracle子查询

如何能实现将oracle的查询结果排序后,只返回第一条记录

sql server和oracle中查询结果返回指定行数的语句

oracle 存储过程,数据处理并返回结果集问题

oracle 如何返回多条记录

oracle中的存储过程如何返回查询到的多个值?