【问题标题】:Remove a certain string (hint) from SQL code in oracle从 oracle 中的 SQL 代码中删除某个字符串(提示)
【发布时间】:2015-02-19 16:12:36
【问题描述】:

我有一个包含带有提示的 SQL 查询的字符串 (clob),我需要从 sql 代码中删除这些提示。

所以这个:

select 
/*+ ALL_ROWS */ 
/* 2014-12-08 08:26:40.533 -6e99e394:14a2a127782:-466(TXN_ID:-1) */ 
ID, ORIGIN_TICKET_ID, LIFECYCLE_STATUS ... 

应该看起来像:

select ID, ORIGIN_TICKET_ID, LIFECYCLE_STATUS ... 

我尝试使用 replace 和 REGEXP_REPLACE 但到目前为止没有运气。

【问题讨论】:

  • 请提供未能达到预期结果的陈述。
  • 您似乎也想删除普通的 cmets - 而不仅仅是提示。如果是这样:它们是否都在SELECT 之后立即出现?所有这些语句是否都存储为单行,或者它们可能有换行符?哪个版本的 Oracle?
  • 基本上 /* 和 */ 之间的所有内容都应该删除(提示),不需要处理 cmets,oracle 是 v11.2.0.2
  • 一个例子是:SELECT REPLACE(main.c,'/*%*/') FROM MAIN;但 % 并没有完成这项工作,我似乎找不到与之等效的东西。
  • 提示是紧跟在SELECT 之后的注释,在cmets 开头/* 之后有一个附加的加号。在您的示例中,包含日期信息的子字符串是普通注释,而不是提示。

标签: oracle replace regexp-replace


【解决方案1】:

已编辑以处理 CLOB……

有些东西

SELECT 'SELECT '
  || TRIM(SUBSTR(str, LENGTH(str) - INSTR(REVERSE(str), '/*') + 2)) cleanedStatement
FROM
  (SELECT DBMS_LOB.SUBSTR(main.c, 4000, 1) str FROM Main
  );

只要 cmets(提示与否)都放在语句的开头,就应该提供请求。

【讨论】:

  • main.c 列是一个 clob,反之则不起作用:
  • main.c 列是一个 clob,反向函数对它不起作用:ORA-00932:不一致的数据类型我将尝试按照您的示例的方式工作并尝试找到解决方法,但是如果您有任何其他好的想法,谢谢!
  • 注意到 CLOB 对我最初的建议来说为时已晚。开始进行相应的调整。您的陈述可能超过 4,000 个字符吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2014-10-19
  • 2019-02-06
  • 2015-11-23
  • 2017-04-25
  • 2013-08-30
  • 1970-01-01
相关资源
最近更新 更多