【问题标题】:RegEx for removing single and multi lines of comments & spaces except for hints用于删除单行和多行注释和空格的正则表达式,提示除外
【发布时间】:2019-09-29 15:06:54
【问题描述】:

如何通过删除单行和多行 cmets 和前导/尾随空格但不删除 Oracle 提示来提取 Plsql 代码?

实际上我想提取视图的 DDL 并将新列添加到视图中 并动态重建视图。但是有些视图非常复杂(大尺寸)并且有很多空格,单行 cmets,多行 cmets 和提示..

select text 
from All_views
where owner = 'Schema_name'
  and view_name = 'View1';

我最初想应用 Oracle 正则表达式,但它也删除了提示。

谁能指导我如何实现这一目标?

用户希望保留此评论行帖子,将新字段添加到视图中。 因为这对他们来说是非常重要的审计目的。

我的视图语法:

Select /*+LEADING  ACL VS TXN  ACT TTY SEC SECID SHR_UDF*/ 
                        TXN_ID,
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP1 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP2 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP3 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP4 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP5 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP6 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP7 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP8 TABLENAME****/
                        /****SELECT * FROM  ALL_TAB_COLUMN****/
                        /****  wHERE COLUMN_NAME=COL2****/
                        /****  gROUP BY TABLE_NAME***/
                        /****  oRDER BY1****/
                        /* CHANGE  JIRA1234 STARTS*/
                        ACL.aCCOUNT_NUMBER,
                        /* CHANGE  JIRA1234 ENDS*/
                        TXN.  TXN_SALE_dATE,
                        TXN.TXN_iNVOICE_DATE,
                        TXN.  TXN_pUBLISH_DATE,
                        ACL.TXN_EXCH_DATE,
                        ACL.SALES_DATE,
                        ACL.pRICE_DATE,
                        --ACL.LAST_UPDATED,
                        TTY.TTY_TTY_TYPE_ID,
                        /* CHANGE  JIRA7890 STARTS*/
                        TXN.ACL_OPEM_ENTRY_NO,
                        /* CHANGE  JIRA7890 eNDS*/
                        FROM  SCHEMA.aCCOUNT_MASTER  ACL
                        JOIN  SCHEMA.TXN_MASTER TXN
                        ON ACL.BRANCH_CD=TXN.BRANCH_CD
                        AND ACL.aCCOUNT_NO=TXN.aCCOUNT_NO
                        JOIN SCHEMA.TXN_TYPE_MASTER  TTY
                        ON  TXN.TTY_TYPE_ID=TTY.TTY_TYPE_ID
                        AND  TTY.SCE_ID=TXN_SEC_ID';

提前致谢

【问题讨论】:

  • 尊敬的专家,请在此问题上显示一些要点...非常感谢提前!我的数据库版本是 Oracle 11G R2..
  • 嗨,Emma,请看一下 Proc,我想动态地在视图中添加字段

标签: regex oracle plsql oracle11g regex-group


【解决方案1】:

您的问题不是很清楚,但我将尝试回答第一个问题“如何通过删除单行和多行 cmets 和前导/尾随空格但不删除 Oracle 提示来提取 Plsql 代码?”

我认为您使用正则表达式的方法是正确的,下面将删除所有 cmets 而不会删除提示。

select  regexp_replace('Create Or Replace Force view Schema_name.View1 as
                        Select /*+LEADING  ACL VS TXN  ACT TTY SEC SECID SHR_UDF*/ 
                        TXN_ID,
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP1 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP2 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP3 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP4 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP5 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP6 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP7 TABLE NAME****/
                        /****  IF  YOU ADD COL CHECK OUT THE TEMP8 TABLENAME****/
                        /****SELECT * FROM  ALL_TAB_COLUMN****/
                        /****  wHERE COLUMN_NAME=COL2****/
                        /****  gROUP BY TABLE_NAME***/
                        /****  oRDER BY1****/
                        /* CHANGE  JIRA1234 STARTS*/
                        ACL.aCCOUNT_NUMBER,
                        /* CHANGE  JIRA1234 ENDS*/
                        TXN.  TXN_SALE_dATE,
                        TXN.TXN_iNVOICE_DATE,
                        TXN.  TXN_pUBLISH_DATE,
                        ACL.TXN_EXCH_DATE,
                        ACL.SALES_DATE,
                        ACL.pRICE_DATE,
                        --ACL.LAST_UPDATED,
                        TTY.TTY_TTY_TYPE_ID,
                        /* CHANGE  JIRA7890 STARTS*/
                        TXN.ACL_OPEM_ENTRY_NO,
                        /* CHANGE  JIRA7890 eNDS*/
                        FROM  SCHEMA.aCCOUNT_MASTER  ACL
                        JOIN  SCHEMA.TXN_MASTER TXN
                        ON ACL.BRANCH_CD=TXN.BRANCH_CD
                        AND ACL.aCCOUNT_NO=TXN.aCCOUNT_NO
                        JOIN SCHEMA.TXN_TYPE_MASTER  TTY
                        ON  TXN.TTY_TYPE_ID=TTY.TTY_TYPE_ID
                        AND  TTY.SCE_ID=TXN_SEC_ID', '/\*\*.+\*\*/\s+|/\*\s.+\*/\s+|--.+\s+', '', 1, 0) from dual;

输出是

Create Or Replace Force view Schema_name.View1 
as 
Select /*+LEADING  ACL VS TXN  ACT TTY SEC SECID SHR_UDF*/ TXN_ID, 
ACL.aCCOUNT_NUMBER, 
TXN.  TXN_SALE_dATE, 
TXN.TXN_iNVOICE_DATE, 
TXN.  TXN_pUBLISH_DATE, 
ACL.TXN_EXCH_DATE, 
ACL.SALES_DATE, 
ACL.pRICE_DATE, 
TTY.TTY_TTY_TYPE_ID, 
TXN.ACL_OPEM_ENTRY_NO, 
FROM  SCHEMA.aCCOUNT_MASTER  ACL 
JOIN  SCHEMA.TXN_MASTER TXN 
ON ACL.BRANCH_CD=TXN.BRANCH_CD 
AND ACL.aCCOUNT_NO=TXN.aCCOUNT_NO 
JOIN SCHEMA.TXN_TYPE_MASTER  TTY 
ON  TXN.TTY_TYPE_ID=TTY.TTY_TYPE_ID 
AND  TTY.SCE_ID=TXN_SEC_ID

【讨论】:

  • 非常感谢 Shaun 的帮助。我尝试像这样暗示它,它工作正常...但 Cleints 不会接受它,因为所有用于审计目的的评论行现在都被删除了。 ..有没有办法再次添加那些评论行..
  • 要求是这样的。 ========================= 我想动态修改View的DDL。假设我的Views有10列。用户在基表中添加了另外 5 个字段以及数据类型,因为之前基于旧列创建了视图。现在用户也想在视图中动态添加相同的 5 个字段,我面临这个评论行问题。
  • 正如你所提到的,我创建了一个存储过程并尝试像这样实现它,它似乎很好..但我的客户不会接受它,因为所有用于的注释行现在删除了审计目的...有没有办法拆分视图定义,添加所需的列,然后再次添加那些注释行,最后重建视图以及新列。谢谢你..
  • 请查看我新添加的 proc 并建议如何按照上述方式实施。
  • 我可以看到删除 cmets 的唯一原因是解决 cmets 中的 FROM 问题.....您最好将 cmets 留在那里并更改您的 INSTR 以找到FROM 的最后一个实例而不是第一个实例(使用 -1 作为 instr 中的起始位置)。这样您就不需要删除并重新添加 cmets。
猜你喜欢
  • 2010-10-13
  • 2011-01-28
  • 2021-04-10
  • 2012-04-08
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多