我做了这个程序:
create or replace procedure calculate_vertices(vertices VARCHAR2) AS
pos2 INTEGER;
pos1 INTEGER := 1;
posDash INTEGER;
lat VARCHAR2(20);
lon VARCHAR2(20);
BEGIN
loop
pos2:=INSTR(vertices,'@',pos1);
exit when pos2 = 0;
posDash := INSTR (vertices,'-',pos1);
lat := SUBSTR(vertices,pos1,pos2-(posDash+1));
dbms_output.put_line(lat);
lon := SUBSTR(vertices,posDash+1,pos2-(posDash+1));
dbms_output.put_line(lon);
pos1 := pos2+1;
end loop;
END;
然后我称之为:
exec calculate_vertices('122.23-243.345@222.22-323@');
预期结果是:
122.23
243.345
222.22
323
但真正的输出是:
122.23-
243.345
222
323
怎么可能?
编辑:我注意到它在变量LAT中输入了与变量LON相同数量的字符。为什么呢?答案 0 :(得分:0)
您可以在单个选择中使用REGEXP_SUBSTR
,REGEXP_COUNT
而不是PL / SQL块。
WITH t (str)
AS (SELECT '122.23-243.345@222.22-323@'
FROM dual)
SELECT TRIM(REGEXP_SUBSTR(str, '[^-@]+', 1, LEVEL)) str
FROM t
CONNECT BY LEVEL <= REGEXP_COUNT (str, '[^-@]+');
答案 1 :(得分:0)
我认为
lat := SUBSTR(vertices,pos1,pos2-(posDash+1));
错了,应该是
lat := SUBSTR(vertices,pos1,posDash -pos1);
想一想,在破折号之前,@的位置对于字符串的长度是什么。