|
12#

楼主 |
发表于 2023-2-23 09:49
来自手机
|
只看该作者
newkid 发表于 2023-2-22 15:12
先简单批改一下,回答你帖子中提出的问题:DECLARE CURSOR C_SEGMENTS IS SELECT SEG, SEG_LENGTH FROM ...
修改了一下,但是只读第一条记录,结果也是对的,
DECLARE
CURSOR C_STR IS SELECT STR FROM STR_TABLE;
TYPE SEG_ARRAY IS TABLE OF REF_TABLE%ROWTYPE;
L_SEG_ARRY SEG_ARRAY;
V_INPUT_STR STR_TABLE.STR%TYPE;
V_SEG REF_TABLE.SEG%TYPE;
V_SEG_LENGTH REF_TABLE.SEG_LENGTH%TYPE;
V_SUB_STR VARCHAR2 (100);
L_COUNTER NUMBER := 1;
BEGIN
OPEN C_STR;
SELECT *
BULK COLLECT INTO L_SEG_ARRY
FROM REF_TABLE;
LOOP
FETCH C_STR INTO V_INPUT_STR;
EXIT WHEN C_STR%NOTFOUND;
WHILE V_INPUT_STR IS NOT NULl
LOOP
V_SEG := L_SEG_ARRY (L_COUNTER).SEG;
WHILE L_COUNTER <= L_SEG_ARRY.COUNT
AND SUBSTR (V_INPUT_STR, 1, 2) != V_SEG
LOOP
V_SEG := L_SEG_ARRY (L_COUNTER).SEG;
END LOOP;
V_SEG_LENGTH := L_SEG_ARRY (L_COUNTER).SEG_LENGTH;
V_SUB_STR := SUBSTR (V_INPUT_STR, 1, V_SEG_LENGTH);
DBMS_OUTPUT.PUT_LINE (V_SUB_STR);
V_INPUT_STR := SUBSTR (V_INPUT_STR, 1 + V_SEG_LENGTH);
L_COUNTER := L_COUNTER + 1;
L_SEG_ARRY.EXTEND;
END LOOP;
END LOOP;
CLOSE C_STR;
END;
CREATE TABLE STR_TABLE
(
STR VARCHAR2 (200 CHAR)
);
INSERT INTO STR_TABLE (STR)
VALUES ('AC12345BC456ACDF1234567');
INSERT INTO STR_TABLE (STR)
VALUES ('DFXYZXYZ8BC12345');
COMMIT;
CREATE TABLE REF_TABLE
(
SEG VARCHAR2 (20 CHAR),
SEG_LENGTH NUMBER
);
INSERT INTO REF_TABLE (SEG, SEG_LENGTH)
VALUES ('AC', 7);
INSERT INTO REF_TABLE (SEG, SEG_LENGTH)
VALUES ('BC', 7);
INSERT INTO REF_TABLE (SEG, SEG_LENGTH)
VALUES ('DF', 9);
COMMIT;
EXPECTED RESULT
AC12345
BC456AC
DF1234567
DFXYZXYZ8
BC12345
|
|