为什么Oracle REPLACE函数不能用于此字符串?

时间:2016-12-07 20:20:58

标签: sql oracle oracle12c

我们有一个我们一直使用的模式,这通常非常简单。

sortOrder IN VARCHAR2 := 'Title'

query VARCHAR2(32767) := q'[
    SELECT
    Columns
    FROM tables
    ORDER BY {sortOrder}
]';

query := REPLACE(query, '{sortOrder}', sortOrder);

但是对于这个字符串它不起作用:

WITH appl_List
 AS
 (
   SELECT DISTINCT   
     appls.admin_phs_ORG_code || TO_CHAR(appls.serial_num, 'FM000000') AS core_proj_number, 
     appls.Appl_ID
   FROM TABLE(:portfolioTable) appls
  ),
  g1SupportingProjCount AS 
  (
     SELECT
        gen1grants.silverchair_id,
        COUNT(DISTINCT al.Appl_ID) AS ApplCount 
     FROM 
       appl_List al
     JOIN cg_cited_reference_gen1_grant gen1grants 
      ON al.core_proj_number = gen1grants.ic_serial_num
     JOIN cg_cited_reference_gen1 gen1refs
       ON gen1grants.silverchair_id = gen1refs.silverchair_id
     GROUP BY gen1grants.Silverchair_id 
   ),
   g1SupportedPubCount AS 
  (
     SELECT
        gen1grants.silverchair_id,
        COUNT(DISTINCT gen1refs.gen1_wos_uid) AS PubCount 
     FROM 
       appl_List al
     JOIN cg_cited_reference_gen1_grant gen1grants 
      ON al.core_proj_number = gen1grants.ic_serial_num
     JOIN cg_cited_reference_gen1 gen1refs
       ON gen1grants.silverchair_id = gen1refs.silverchair_id
     GROUP BY gen1grants.Silverchair_id 
   ),
   g2SupportingProjCount AS 
  (
     SELECT
        gen2grants.silverchair_id,
        COUNT(DISTINCT al.Appl_ID) AS ApplCount 
     FROM 
       appl_List al
     JOIN cg_cited_reference_gen2_grant gen2grants 
      ON al.core_proj_number = gen2grants.ic_serial_num
     JOIN cg_cited_reference_gen2 gen2refs
       ON gen2grants.silverchair_id = gen2refs.silverchair_id
     GROUP BY gen2grants.Silverchair_id 
   ),
  g2SupportedPubCount AS 
  (
     SELECT
        gen2grants.silverchair_id,
        COUNT(DISTINCT gen2refs.gen2_wos_uid) AS PubCount 
     FROM 
       appl_List al
     JOIN cg_cited_reference_gen2_grant gen2grants 
      ON al.core_proj_number = gen2grants.ic_serial_num
     JOIN cg_cited_reference_gen2 gen2refs
       ON gen2grants.silverchair_id = gen2refs.silverchair_id
     GROUP BY gen2grants.Silverchair_id 
   ),
   portfolio_cg_ids AS
   (
      SELECT DISTINCT md.silverchair_id
      FROM
      (
        SELECT silverchair_id
        FROM cg_cited_reference_gen1_grant gen1Grants
        JOIN Appl_List appls
        ON appls.core_proj_number = gen1Grants.ic_serial_num
        UNION
        SELECT silverchair_id
        FROM cg_cited_reference_gen2_grant gen2Grants
        JOIN Appl_List appls
        ON appls.core_proj_number = gen2Grants.ic_serial_num
      ) grant_sc_ids
      JOIN cg_metadata md
      ON grant_sc_ids.silverchair_id = md.silverchair_id
   )

SELECT 
   silverchairId,
   TITLE,
   PMID,
   PMCID,
   publication_year  as year,
   referenceCount1Gen,
   supportingProjectCount1Gen,
   supportedPublicationCount1Gen,
   referenceCount2Gen,
   supportingProjectCount2Gen,
   supportedPublicationCount2Gen,
   COUNT(1) OVER() as TotalCount
   FROM
   (
      SELECT 
         md.SILVERCHAIR_ID silverchairId,
         md.TITLE,
         md.PMID,
         md.PMCID ,
         md.publication_year  as year,
         g1RefCounts.referenceCount1Gen as referenceCount1Gen,
         g1SupportingProjCount.ApplCount as supportingProjectCount1Gen,
         g1SupportedPubCount.PubCount as supportedPublicationCount1Gen,
         g2RefCounts.referenceCount2Gen as referenceCount2Gen,
         g2SupportingProjCount.ApplCount as supportingProjectCount2Gen,
         g2SupportedPubCount.PubCount as supportedPublicationCount2Gen,
         --COUNT(1) OVER() as TotalCount
      FROM cg_metadata md
      -- BEGIN datascope to current portfolio
      JOIN portfolio_cg_ids
      ON portfolio_cg_ids.silverchair_id = md.silverchair_id
      -- END datascope to current portfolio
      LEFT JOIN g1SupportingProjCount
        ON g1SupportingProjCount.Silverchair_id = md.silverchair_id
      LEFT JOIN g2SupportingProjCount
        ON g2SupportingProjCount.Silverchair_id = md.silverchair_id 
      LEFT JOIN g1SupportedPubCount
        ON g1SupportedPubCount.Silverchair_id = md.silverchair_id
      LEFT JOIN g2SupportedPubCount
        ON g2SupportedPubCount.Silverchair_id = md.silverchair_id 
      OUTER APPLY
      (
        Select Count(*) as referenceCount1Gen
        FROM cg_cited_reference_gen1 g1Refs 
        WHERE g1Refs.silverchair_id = md.silverchair_id
      ) g1RefCounts
      OUTER APPLY
      (
        Select Count(*) as referenceCount2Gen
        FROM cg_cited_reference_gen2 g2Refs 
        WHERE g2Refs.silverchair_id = md.silverchair_id
      ) g2RefCounts
   ) results
   ORDER BY {sortOrder}

是否存在字符串中某种特殊字符可以阻止其工作的情况? 我有点困惑。我已经使用这种模式3年了,我从来没有这样做不起作用。 有什么可以打破这个?

1 个答案:

答案 0 :(得分:0)

查询有4000多个字符 该文本可能正在某处被截断。