我正在创建一个循环遍历表(具有数千行)的存储过程,并且对于每一行,都有一个CLOB列,我想从中获取正则表达式上的所有匹配项(sa"FNR").此后,我想在新表中插入每个不同的匹配.单个CLOB列可能包含数千个匹配,但通常它是在CLOB中重复的相同"FNR" - 即不同的正则表达式匹配少得多,并且这些是我唯一感兴趣的.但是,我制作的程序花了很长时间,我怀疑在所有比赛中循环是最耗时的部分.
我的程序看起来像这样:
CREATE OR REPLACE PROCEDURE SP_MTV_FINN_FNR AS
BEGIN
DECLARE
v_n NUMBER;
v_cnt NUMBER;
v_mtrid NUMBER;
v_regex_fnr VARCHAR2(54) := '(((0[1-9]|[12]\d|3[01])(0[1-9]|1[012])(\d{2}))(\d{5}))';
v_doc CLOB;
v_fnr VARCHAR2(11);
BEGIN
-- Get all rows from table --
SELECT COUNT(*) INTO v_n FROM TABLE;
IF v_n > 0 THEN
-- Loop over all rows --
FOR i IN 1..v_n LOOP
SELECT doc, mtrid
INTO v_doc, v_mtrid
FROM (SELECT DOC doc, ID mtrid, ROWNUM rnum
FROM TABLE
WHERE ROWNUM <=i)
WHERE rnum >= …Run Code Online (Sandbox Code Playgroud)