String 在两个不同表的两列中查找匹配字符串

String 在两个不同表的两列中查找匹配字符串,string,oracle,plsql,plsqldeveloper,String,Oracle,Plsql,Plsqldeveloper,从所有表中选择*获取数据库中的所有表 Table A Name Shortform Generate GNRT Support SPRT and so onn.. 大约有100个表名和50个英文名以及缩写形式 每个表名都是使用缩写形式创建的,例如从GNRT_SPRT选择* 如果一个新人尝试创建表,但没有遵循缩写形式,那么这些表名应该在名为results的新表中提取 FOR example: select * from gnrte_

从所有表中选择*获取数据库中的所有表

   Table A
    Name     Shortform
    Generate GNRT
    Support  SPRT  
    and so onn..
大约有100个表名和50个英文名以及缩写形式 每个表名都是使用缩写形式创建的,例如从GNRT_SPRT选择* 如果一个新人尝试创建表,但没有遵循缩写形式,那么这些表名应该在名为results的新表中提取

FOR example:      
select * from gnrte_sche
上面的示例与短格式不匹配,因此应将表名插入名为results的新表中。我需要使用select*from all_表格检查所有表格

-output-
Table Results
Diff_tables--column name
gnrte_sche

编辑以包括保存不匹配项。
这是没有调整,可能还有其他更简单的解决方案,但下面可能会做什么,你正在寻找

此块将打印出所有表名,这些表名并非仅由
缩写词和下划线组成,并找到第一个(唯一的)非缩写词。它还将所有匹配项保存到一个名为
非\u SHORTFORM
的示例表中。它允许前缀和后缀下划线,并允许“$”字符,只要它是缩写形式

这将从
表A
中读取
缩写
s,并评估所有表中的所有内容,以检查每个表是否由
缩写
s组成。当遇到格式错误的
表\u名称
时,它将通过
DBMS\u输出
将其与不匹配的字一起打印出来,并保存不匹配的记录

首先,创建一个示例

CREATE TABLE A(
  NAME VARCHAR2(200) NOT NULL PRIMARY KEY,
  SHORTFORM VARCHAR2(30) UNIQUE NOT NULL
);

INSERT INTO A VALUES('Generate','GNRT');
INSERT INTO A VALUES('Support','SPRT');
INSERT INTO A VALUES('Hobbit','HOBT');
INSERT INTO A VALUES('Wookie','WOKI');
INSERT INTO A VALUES('Adventure','AVNTR');
然后创建一些示例
s进行检查

CREATE TABLE GNRT_SPRT(X NUMBER);
CREATE TABLE WOKI_SPRT(X NUMBER);
CREATE TABLE HOBT_WOKI_AVNTR(X NUMBER);
CREATE TABLE ROBOTS(X NUMBER);
CREATE TABLE GNRTE_SCHE(X NUMBER);
然后创建一个
以保存不匹配项(请注意,这只允许每个表保存一个不匹配项。如果您的用例不同,可以根据需要进行调整):

然后创建一个执行评估的
(如果愿意,可以是
函数
,等等)。请注意,这允许使用“$”和数字。如果要排除这些,也可以修改以下内容:

DECLARE
  TYPE V_STRING_LIST IS TABLE OF VARCHAR2(128);
  V_SHORT_FORM_SET V_STRING_LIST;
  V_SHORT_FORM_MATCHED NUMBER(1,0) := 0;
  V_TABLE_NAME VARCHAR2(128);
  V_TABLE_NAME_WORK_SPACE VARCHAR2(128);
  V_TABLE_TOKEN VARCHAR2(128);
BEGIN
  SELECT SHORTFORM BULK COLLECT INTO V_SHORT_FORM_SET FROM A;
  DBMS_OUTPUT.PUT_LINE('MALFORMED TABLE-NAMES:');
<<TABLE_NAME_LOOP>>
FOR TABLE_POINTER IN (  SELECT ALL_TABLES.OWNER, ALL_TABLES.TABLE_NAME FROM ALL_TABLES   WHERE ALL_TABLES.TABLE_NAME <> 'A')
  LOOP
    V_TABLE_NAME_WORK_SPACE := REGEXP_REPLACE(TABLE_POINTER.TABLE_NAME,'((^[_]{1,})|([_]{1,}$))',NULL);
  <<SHORT_FORM_LOOP>>
    LOOP
      V_TABLE_NAME_WORK_SPACE := REGEXP_REPLACE(V_TABLE_NAME_WORK_SPACE,'((^[_]{1,})|([_]{1,}$))',NULL);
      EXIT WHEN NOT (REGEXP_LIKE(COALESCE(V_TABLE_NAME_WORK_SPACE,'!'),'^[_A-Z0-9$]{1,}$'));
      V_TABLE_TOKEN := REGEXP_SUBSTR(V_TABLE_NAME_WORK_SPACE,'^[A-Z0-9$]{1,}');
      V_TABLE_NAME_WORK_SPACE := REGEXP_REPLACE(V_TABLE_NAME_WORK_SPACE,'^[A-Z0-9$]{1,}',NULL);
      SELECT COUNT(*) INTO V_SHORT_FORM_MATCHED FROM A
      WHERE A.SHORTFORM = V_TABLE_TOKEN;

      IF NOT V_SHORT_FORM_MATCHED = 1
      THEN DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('Table-Name:%s,Mismatched-Shortform:%s',TABLE_POINTER.TABLE_NAME,V_TABLE_TOKEN));
MERGE INTO NON_SHORTFORM USING (
    SELECT TABLE_POINTER.OWNER AS OWNER,
    TABLE_POINTER.TABLE_NAME AS TABLE_NAME,
    V_TABLE_TOKEN AS MISMATCHED_WORD
    FROM DUAL) CANDIDATE_MISMATCH
  ON (NON_SHORTFORM.OWNER = CANDIDATE_MISMATCH.OWNER
  AND NON_SHORTFORM.TABLE_NAME = CANDIDATE_MISMATCH.TABLE_NAME)
  WHEN MATCHED THEN UPDATE SET NON_SHORTFORM.MISMATCHED_WORD = CANDIDATE_MISMATCH.MISMATCHED_WORD
  WHEN NOT MATCHED THEN INSERT (OWNER, TABLE_NAME, MISMATCHED_WORD)
  VALUES (CANDIDATE_MISMATCH.OWNER, CANDIDATE_MISMATCH.TABLE_NAME, CANDIDATE_MISMATCH.MISMATCHED_WORD);
        EXIT;
      END IF;
    END LOOP SHORT_FORM_LOOP;
  END LOOP TABLE_NAME_LOOP;
END;
/
并检查保存的不匹配项(注意,在本例中,仅保存找到的第一个不匹配项。如果要保存每个不匹配项,则需要相应地更新上面的块):


我是否正确理解您有一个名为“a”的表格,该表格定义了所考虑的所有英语单词以及每个单词的简短形式?Thanks@alexgibbs是的,非常好,谢谢。确认一下,你想在所有表中找到所有不是由缩写形式组成的表名吗?@alexgibbs是的。。我的意思是,所有不是由短表单组成的或者与表A中的短表单列不匹配的表单都应该在不同的表中获取。我不太清楚“在另一个表中获取”是什么意思,但我会发布一些东西,让您在所有非缩写形式的表中找到所有的表。您能告诉我您所说的“在不同的表中获取”是什么意思吗?第一个循环将拆分表名,第二个循环将它与缩写形式进行比较??您创建的所有表!!内置元数据select*from all_tables会告诉我所有的表为什么要再次创建?谢谢@Techie,第一个循环会遍历每个表名。第二个循环检查它是否仅由缩写形式和下划线组成。我创建了额外的表来测试代码并显示实际的过程——以确保跳过由短格式组成的表,但标记那些没有由短格式组成的表。dbms_output.put_行中的输出是否可以保存在一个有两列的表中?@Techie sure it it Can。我将用一个例子来更新。
DECLARE
  TYPE V_STRING_LIST IS TABLE OF VARCHAR2(128);
  V_SHORT_FORM_SET V_STRING_LIST;
  V_SHORT_FORM_MATCHED NUMBER(1,0) := 0;
  V_TABLE_NAME VARCHAR2(128);
  V_TABLE_NAME_WORK_SPACE VARCHAR2(128);
  V_TABLE_TOKEN VARCHAR2(128);
BEGIN
  SELECT SHORTFORM BULK COLLECT INTO V_SHORT_FORM_SET FROM A;
  DBMS_OUTPUT.PUT_LINE('MALFORMED TABLE-NAMES:');
<<TABLE_NAME_LOOP>>
FOR TABLE_POINTER IN (  SELECT ALL_TABLES.OWNER, ALL_TABLES.TABLE_NAME FROM ALL_TABLES   WHERE ALL_TABLES.TABLE_NAME <> 'A')
  LOOP
    V_TABLE_NAME_WORK_SPACE := REGEXP_REPLACE(TABLE_POINTER.TABLE_NAME,'((^[_]{1,})|([_]{1,}$))',NULL);
  <<SHORT_FORM_LOOP>>
    LOOP
      V_TABLE_NAME_WORK_SPACE := REGEXP_REPLACE(V_TABLE_NAME_WORK_SPACE,'((^[_]{1,})|([_]{1,}$))',NULL);
      EXIT WHEN NOT (REGEXP_LIKE(COALESCE(V_TABLE_NAME_WORK_SPACE,'!'),'^[_A-Z0-9$]{1,}$'));
      V_TABLE_TOKEN := REGEXP_SUBSTR(V_TABLE_NAME_WORK_SPACE,'^[A-Z0-9$]{1,}');
      V_TABLE_NAME_WORK_SPACE := REGEXP_REPLACE(V_TABLE_NAME_WORK_SPACE,'^[A-Z0-9$]{1,}',NULL);
      SELECT COUNT(*) INTO V_SHORT_FORM_MATCHED FROM A
      WHERE A.SHORTFORM = V_TABLE_TOKEN;

      IF NOT V_SHORT_FORM_MATCHED = 1
      THEN DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('Table-Name:%s,Mismatched-Shortform:%s',TABLE_POINTER.TABLE_NAME,V_TABLE_TOKEN));
MERGE INTO NON_SHORTFORM USING (
    SELECT TABLE_POINTER.OWNER AS OWNER,
    TABLE_POINTER.TABLE_NAME AS TABLE_NAME,
    V_TABLE_TOKEN AS MISMATCHED_WORD
    FROM DUAL) CANDIDATE_MISMATCH
  ON (NON_SHORTFORM.OWNER = CANDIDATE_MISMATCH.OWNER
  AND NON_SHORTFORM.TABLE_NAME = CANDIDATE_MISMATCH.TABLE_NAME)
  WHEN MATCHED THEN UPDATE SET NON_SHORTFORM.MISMATCHED_WORD = CANDIDATE_MISMATCH.MISMATCHED_WORD
  WHEN NOT MATCHED THEN INSERT (OWNER, TABLE_NAME, MISMATCHED_WORD)
  VALUES (CANDIDATE_MISMATCH.OWNER, CANDIDATE_MISMATCH.TABLE_NAME, CANDIDATE_MISMATCH.MISMATCHED_WORD);
        EXIT;
      END IF;
    END LOOP SHORT_FORM_LOOP;
  END LOOP TABLE_NAME_LOOP;
END;
/
SET SERVEROUTPUT ON;
-- CODE BLOCK FROM GOES HERE
MALFORMED TABLE-NAMES:
... other TABLEs omitted ...
Table-Name:ROBOTS,Mismatched-Shortform:ROBOTS
Table-Name:GNRTE_SCHE,Mismatched-Shortform:GNRTE
SELECT * FROM NON_SHORTFORM;
OWNER  TABLE_NAME  MISMATCHED_WORD
-- Other records omitted
LIMS   ROBOTS      ROBOTS
LIMS   GNRTE_SCHE  GNRTE