为什么这个程序不能正常工作? INSTR和SUBSTR问题

时间:2018-02-04 16:22:21

标签: sql oracle plsql

我做了这个程序:

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相同数量的字符。为什么呢?

2 个答案:

答案 0 :(得分:0)

您可以在单个选择中使用REGEXP_SUBSTRREGEXP_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, '[^-@]+');  

DEMO

答案 1 :(得分:0)

我认为

lat := SUBSTR(vertices,pos1,pos2-(posDash+1));

错了,应该是

lat := SUBSTR(vertices,pos1,posDash -pos1);

想一想,在破折号之前,@的位置对于字符串的长度是什么。