3

我正在尝试获取数组中的元素列表,如下所示:

['GRADE', 'GRATE', 'GRAPE', /*About 1000 other entries here ...*/ ]

并将它们与它们在 Oracle 数据库中的列中出现的情况相匹配,该数据库中充满了如下条目:

1|'ANTERIOR'
2|'ANTEROGRADE'
3|'INGRATE'
4|'RETROGRADE'
5|'REIGN'
...|...
/*About 1,000,000 other entries here*/

对于该 G 单词数组中的每个条目,我想遍历 Oracle 数据库的 word 列,并尝试为数组中的每个条目找到右侧匹配项。在此示例中,数据库中的条目 2、3 和 4 都将匹配。

在任何其他编程语言中,它看起来像这样:

for entry in array:
  for each in column:
    if entry.right_match(each):
      print entry

我如何在 PL/SQL 中做到这一点?

4

1 回答 1

5

在 PL/SQL 中可以这样完成:

declare
   SUBTYPE my_varchar2_t IS varchar2( 100 );
   TYPE Roster IS TABLE OF my_varchar2_t;  
   names Roster := Roster( 'GRADE', 'GRATE', 'GRAPE');
begin
  FOR c IN ( SELECT id, name FROM my_table )
  LOOP
      FOR i IN names.FIRST .. names.LAST LOOP 
         IF regexp_like( c.name,   names( i )  ) THEN
              DBMS_OUTPUT.PUT_LINE( c.id || '  ' || c.name );
         END IF;
      END LOOP;
  END LOOP;
end;
/

但这是逐行处理,对于大表来说会很慢。

我认为以如下所示的方式执行此操作可能会更好:

create table test123 as
select 1 id ,'ANTERIOR' name from dual union all
select 2,'ANTEROGRADE' from dual union all
select 3,'INGRATE' from dual union all
select 4,'RETROGRADE' from dual union all
select 5,'REIGN' from dual ;

create type my_table_typ is table of varchar2( 100 );
/

select *
from table( my_table_typ( 'GRADE', 'GRATE', 'GRAPE' )) x
join test123 y on regexp_like( y.name, x.column_value ) 
;

COLUMN_VALUE  ID         NAME      
------------- ---------- -----------
GRADE                  2 ANTEROGRADE 
GRATE                  3 INGRATE     
GRADE                  4 RETROGRADE
于 2013-07-23T03:20:40.530 回答