Oracle ORA-01489:字符串连接的结果太长

时间:2017-02-02 16:05:28

标签: 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_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)

所以使用该查询,如果我输入以下任何内容:

  • wx或其他一个1个字母的单词(有些单字母单词)
  • twas或其他一些2个字母的单词(一些2个字母的单词)

对于:keyword参数的值,我得到错误ORA-01489: result of string concatenation is too long。这有点误导,因为当我将twitterask作为其工作的参数的值时。我错过了什么吗?

到目前为止,我还没有看到查询在3个或更多字母单词上失败,但我仍然遇到1个或2个字母单词的问题。

0 个答案:

没有答案