【问题标题】:Function returning varchar2 gives wrong result [duplicate]返回varchar2的函数给出错误的结果[重复]
【发布时间】:2013-04-22 12:14:25
【问题描述】:

我想根据从 gui 中选择的标准动态构建查询。这是我的 oracle 包,

CREATE OR REPLACE PACKAGE TestPkg 
AS
    g_lastnamelist VARCHAR2(50);

    FUNCTION getLastName return VARCHAR2;
    FUNCTION buildQuery(p_lastnamelist VARCHAR2);
END;

CREATE OR REPLACE PACKAGE BODY TestPkg 
AS

   FUNCTION getLastName return VARCHAR2
   IS
   BEGIN
       RETURN replace(g_lastnamelist, '''', '');
   END;

   FUNCTION buildQuery(p_lastnamelist VARCHAR2);
   IS
       m_query varchar2(1000);
   BEGIN
       g_lastnamelist := p_lastnamelist;
       m_query := 'SELECT * FROM emp WHERE last_name IN(TestPkg.getLastName)';
   END;
END;

如果我在这里使用'SELECT * FROM emp WHERE last_name IN('||p_lastnamelist||')';,那么它会返回正确的记录,但如果我像这样使用'SELECT * FROM emp WHERE last_name IN(TestPkg.getLastName)';,那么它会失败。什么原因。

提前致谢。

【问题讨论】:

  • @EgorSkriptunoff 谢谢。 :)

标签: oracle where-clause dynamic-sql


【解决方案1】:

我假设您传递的是逗号分隔的引用值列表,例如 p_lastnamelist'Smith','Jones',因为这是您的第一个查询起作用的唯一方式,并解释了 replace 调用。 (如果您显示输入、输出和您得到的任何错误,这会有所帮助,因此我们不必猜测和假设)。当在查询中使用它时,它们最终看起来有很大不同。第一个:

'SELECT * FROM emp WHERE last_name IN('||p_lastnamelist||')'

变成:

SELECT * FROM emp WHERE last_name IN('Smith','Jones')

... 这将匹配具有这些姓氏中的任何一个的任何记录。但是第二个:

'SELECT * FROM emp WHERE last_name IN(TestPkg.getLastName)'

在您从 value 中删除引号后变为:

SELECT * FROM emp WHERE last_name IN('Smith,Jones')

... 它正在寻找单个值,并且仅当您有姓氏 Smith,Jones 的记录时才会匹配,这不太可能。 TestPkg.getLastName 返回的任何内容都将被视为单个字符串值。必须是因为该函数返回varchar2。但是,如果您按照 Egor 的建议使用绑定变量,情况也是如此。

【讨论】:

  • 是的,我明白了问题所在,现在我从 getLastName 函数返回 StringList 并使用查询 SELECT COLUMN_VALUE FROM TABLE(TestPkg.getLastName)。
  • @eatSleepCode - 太好了,我将停止寻找如何做到这一点的示例 *8-)
  • 感谢它现在工作正常。 :)
猜你喜欢
  • 2015-02-04
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多