我有一个集合A(VARCAHR2的表),如果要从A开始的某行以某个值开头,我想将内容移到另外两个B和C(VARCHAR2的表)中。
为此,我有这部分代码:
...
for k in 1 .. v_message.count loop
if substr(v_message(k), 1, 3) = 'AAA'
then
l_poz := k;
dbms_output.put_line('the position there AAA start is at line (' || l_poz || ')');
exit;
end if;
end loop;
for k in 1 .. v_message.count loop
if k < l_poz
then
h := h + 1;
v_header.extend(1);
v_header(h) := v_message(k);
dbms_output.put_line('v_header(' || h || ') = ' || v_header(h));
else
l := l + 1;
v_lines.extend(1);
v_lines(l) := v_message(k);
dbms_output.put_line('v_lines(' || l || ') = ' || v_lines(l));
end if;
end loop;
...
v_message是集合A。
v_header是集合B。
v_lines是集合C。
测试消息应类似于:
ABX * xxx#dddd
ADF * xxx#dddd
SFM * xxx#ffff
AAA * xxx#mmmm
ABX * yyy#rrrr
MMM * jjj#llll
ATM * jjj#rrrr
SFM * xxx#tttt
我想将此消息拆分为:
ABX * xxx#dddd
ADF * xxx#dddd
SFM * xxx#ffff
和
AAA * xxx#mmmm
ABX * yyy#rrrr
MMM * jjj#llll
ATM * jjj#rrrr
SFM * xxx#tttt
我的代码工作正常,但是我想知道是否可以在集合A的单个解析中完成此拆分。
请问有可能吗?
答案 0 :(得分:1)
是的,您可以在一个循环中完成它,声明一些变量(v_coll
),然后执行以下操作:
v_coll := 'B';
for k in 1 .. v_message.count loop
if v_coll = 'B' and substr(v_message(k), 1, 3) = 'AAA' then
v_coll := 'C';
end;
if v_coll = 'B'
then
-- insert into headers
else
-- insert into lines
end if;
end loop;