0

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

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)';这样使用,那么它会失败。什么原因。

提前致谢。

4

1 回答 1

0

我假设您传递的是逗号分隔的引用值列表,例如p_lastnamelistis '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')

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

于 2013-04-22T13:06:31.437 回答