Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Oracle ORA-01489:字符串连接的结果太长_String_Oracle_Concatenation_Parameterized Query - Fatal编程技术网

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个,则返回大多数字符的完整描述。