String Oracle ORA-01489:字符串连接的结果太长
我有一个很长的查询,我将把它全部转储,因为我不知道是哪个部分导致了问题String Oracle ORA-01489:字符串连接的结果太长,string,oracle,concatenation,parameterized-query,String,Oracle,Concatenation,Parameterized Query,我有一个很长的查询,我将把它全部转储,因为我不知道是哪个部分导致了问题 SELECT DISTINCT vip.srname, vip.frname, vip.indv_id AS empid, prf.usrpf_formal_lastname, prf.usrpf_formal_givnames, job.job_desc as job_name, dep.dept_desc AS dept, p.rtype, p.rdesc, p.rcode, prf.usrpf_accept
SELECT DISTINCT
vip.srname, vip.frname, vip.indv_id AS empid, prf.usrpf_formal_lastname, prf.usrpf_formal_givnames,
job.job_desc as job_name, dep.dept_desc AS dept, p.rtype, p.rdesc, p.rcode,
prf.usrpf_accept_grad as accept_grad, prf.usrpf_open_tt as open_tt
FROM acad_active vip
LEFT JOIN map_dept dep ON dep.dept_src = vip.work_unit_name
LEFT JOIN map_job job ON job.job_code = vip.job_no
LEFT JOIN usr_preference prf ON prf.usrpf_emplno = vip.indv_id
INNER JOIN (
SELECT k.pikw_emplno AS empl_no, (
CASE
WHEN UPPER(kw_desc) LIKE UPPER('%' || :keyword || '%') THEN 'directkw'
WHEN UPPER(akw_keyword) = UPPER(:keyword) THEN 'assockw'
ELSE 'relkw'
END
) AS rtype, w.kw_desc AS rdesc, w.kw_code AS rcode
FROM clb_pikeyword k
INNER JOIN iera_clb_keyword w ON w.kw_code = k.pikw_kwcode
LEFT JOIN assoc_keyword a ON a.akw_formal_kwcode = k.pikw_kwcode AND k.pikw_external = 'Y'
INNER JOIN (
SELECT pikw_emplno
FROM clb_pikeyword a1
INNER JOIN assoc_keyword a2 ON a2.akw_formal_kwcode = a1.pikw_kwcode
WHERE pikw_external = 'Y'
AND UPPER(akw_keyword) = UPPER(:keyword)
UNION
SELECT pikw_emplno
FROM clb_pikeyword d1
INNER JOIN iera_clb_keyword d2 ON d2.kw_code = d1.pikw_kwcode
WHERE pikw_external = 'Y'
AND UPPER(kw_desc) LIKE UPPER('%' || :keyword || '%')
) e ON e.pikw_emplno = k.pikw_emplno
WHERE k.pikw_external = 'Y'
UNION
SELECT t.txt_emplno AS empl_no, 'Text' as rtype, t.txt_text AS rdesc, t.txt_type AS rcode
FROM (
SELECT *
FROM clb_txt txt
WHERE txt.txt_type IN ('research', 'teaching', 'publicmedia')
) t
WHERE t.txt_public = 'Y'
AND (UPPER(t.txt_text) LIKE UPPER('%' || :keyword || '%'))
UNION
SELECT l.lang_emplno AS empl_no, 'Language' AS rtype, (
CASE
WHEN l.lang_country IS NOT NULL THEN l.lang_name || '(' || l.lang_country || ')'
ELSE l.lang_name
END
) AS rdesc, TO_CHAR(l.ra_pi_lang_id) AS rcode
FROM pi_lang l
WHERE l.lang_public = 'Y'
AND (UPPER(l.lang_name) LIKE UPPER('%' || :keyword || '%'))
UNION
SELECT i.intl_emplno AS empl_no, 'Intl' AS rtype, (
CASE
WHEN i.intl_title IS NOT NULL AND i.intl_desc IS NOT NULL THEN i.intl_title || '& ' || i.intl_desc
WHEN i.intl_title IS NOT NULL THEN i.intl_title
ELSE i.intl_desc
END
) AS rdesc, TO_CHAR(i.intl_sort_order) AS rcode
FROM pi_intl i
WHERE i.intl_public = 'Y'
AND (UPPER(i.intl_desc) LIKE UPPER('%' || :keyword || '%') OR UPPER(i.intl_title) LIKE UPPER('%' || :keyword || '%'))
) p ON p.empl_no = vip.indv_id
WHERE vip.researcher = 'Y'
ORDER BY vip.srname, vip.frname, dep.dept_desc, job.job_desc, p.rtype, UPPER(p.rdesc)
因此,对于该查询,如果我将以下任何一项
或w
或其他一些单字母单词(一些单字母单词有效)x
或tw
或其他两个字母的单词(一些两个字母的单词有效)as
:keyword
参数的值,我得到错误ORA-01489:字符串连接的结果太长
。这有点误导,因为当我把twitter
或ask
作为参数的值时,它就起作用了。我错过什么了吗
到目前为止,我还没有看到查询在3个或更多字母单词上失败,但我一直在1个或2个字母单词上遇到问题。嗯,我想关键字越短匹配的就越多。然而,我看不到聚合或递归,所以我不知道在哪里可能会构建太长的字符串。最长的
lang_name
,lang_country
,intl_title
,和intl_desc
?好吧,从表中选择max(length(lang_name))
等等,只是为了确保不存在任何超长值。我的想法和Thorsten一样。您可能有一个非常长的lang_name
或lang_country
或任何其他要连接的名称,其值可能类似于一行4000个字母的“x”-这就是为什么在输入“x”时会被捕获,而在输入三个字母的键时不会被捕获的原因。这也解释了为什么查询对某些单字母键有效,而对其他键无效。在任何情况下,检查max(length(lang_name))
和lang_country
以及您要连接的任何其他内容都需要花费很少的时间,因此这是第一件要尝试的事情。这不是修复当前查询的解决方案,而是直接针对数据运行的其他方法。类似于从pi_lang
中选择max(长度(lang_名称))(假设这些是正确的表名和列名)。或者甚至从pi_lang中选择lang_name,其中length(lang_name)>1000
——这应该显示所有长度超过1000个字符的语言名称(因此几乎肯定是垃圾)。因此,无论何时连接intl_desc
,都应该连接类似substr(intl_desc,1,3000)
的内容。这将返回前3000个字符,如果大多数字符不超过3000个,则返回大多数字符的完整描述。