2012-01-17 89 views
1
SELECT 
    tbl1.PYU_EMAIL, 
    COUNT(tbl1.PYU_EMAIL) as TOTAL, 
    (SELECT ROWCONCAT('SELECT pyu_id FROM p_survey_invite WHERE pyu_email=' || tbl1.pyu_email) FROM dual) 
FROM p_survey_invite tbl1 
GROUP BY tbl1.pyu_id, tbl1.pyu_email 
ORDER BY total DESC; 

大家好,甲骨文级联问题

我不断收到 ORA-04054:数据库链接DIGITALVIDEOSYSTEMS.NET不存在错误

我怀疑,当我在Concat的内rowconcat的tbl1.pyu_email函数,tbl1.pyu_email上有@字符,这反映在oracle上的DB-LINK上。

如何告诉oracle不要以为@是db链接?

+0

ROWCONCAT不是标准的SQL(也不是PL/SQL)。我建议你看看这篇文章中描述的方法(http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php),它会更好地工作。 – 2012-01-17 13:47:37

+0

@gumpi:你可以在你的问题中包含p_survey_invite的定义吗? – 2012-01-17 14:15:34

+0

而不是这个ROWCONCAT,也许尝试LISTAGG(请参阅http://docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm) – tbone 2012-01-17 20:19:06

回答

4

你应该把你周围的e-mail地址报价:

SELECT 
    tbl1.PYU_EMAIL, 
    COUNT(tbl1.PYU_EMAIL) as TOTAL, 
    (SELECT ROWCONCAT('SELECT pyu_id FROM p_survey_invite WHERE pyu_email=''' || tbl1.pyu_email ||'''') FROM dual) 
FROM p_survey_invite tbl1 
GROUP BY tbl1.pyu_id, tbl1.pyu_email 
ORDER BY total DESC; 

你传入一个字符串,动态执行该字符串的ROWCONCAT()函数。您的代码将一个varchar2列连接到DML字符串。除非你在字符串中包含转义引号你通过什么(函数试图执行)是这样的:

SELECT pyu_id FROM p_survey_invite WHERE [email protected] 

这就是为什么它失败。

+1

虽然它会工作,但这个实现有很多问题:性能会不是最理想的,你可以开放SQL注入(因为你没有使用绑定变量)。 – 2012-01-17 14:08:54

+1

@VincentMalgrat - 动态SQL执行一个字符串,该字符串由硬编码的样板文本和列中的值组成。不知道你在哪里看到SQL注入的范围。如果有人能够访问P_SURVEY_INVITE,那么可能会有更多更简单的漏洞被利用起来。 – APC 2012-01-17 14:21:46

+0

@APC:SQL注入漏洞还意味着您可能会从非恶意合法条目(可能包括引号作为文本的一部分)中收到错误。我没有意识到P_SURVEY_INVITE是样板/硬编码表格。尽管如此,我的评论仍然存在于一般的语境中:您最好使用防止SQL注入并且性能更高的解决方案(存在多个字符串聚合方法)。 – 2012-01-17 14:31:05