我正在尝试制作一个困难的(对我来说)字符串算法。
所以这一切都以一个数字开头(长度可变,&&是varchar)。
步骤如下:
经过几个小时的挣扎,到目前为止我只能将这个数字分成几组。
DECLARE
text VARCHAR2(50);
newText VARCHAR2(50);
BEGIN
text := '3536 2029 2712 3456 789';
FOR i IN 0..LENGTH(text) LOOP
IF MOD(i, 4) = 0 THEN
newText := newText || ' ' || SUBSTR(text, i, 1);
ELSE
newText := newText || SUBSTR(text, i, 1);
END IF;
END LOOP;
dbms_output.put_line(newText);
END;
/
Output: 3353 6202 9271 2345 6789
我在最后几个小时试过的Wat是;我首先想到的最简单的方法应该是将长文本拆分成一个组并将其添加到一个数组中,然后简单地反转数组。老实说,这根本不适合我(甚至不是很接近)。所以我想出了这个。
你能帮帮我吗?抱歉是新手,今天开始在plsqy。
如果我能提供一些额外的信息,我很高兴你发布这个。
P.S。
我甚至不需要一个确切的代码示例。一些指导性的帮助将是一个很大的帮助。
此致
答案 0 :(得分:3)
如果不需要程序代码,请不要使用简单的SQL查询进行相同的转换:
SELECT
LISTAGG(GRP) WITHIN GROUP (ORDER BY RN DESC) RESULT
FROM (
SELECT
SUBSTR(VALUE, (LEVEL - 1) * 4 + 1, 4) GRP,
ROWNUM RN
FROM
(SELECT '3536202927123456789' VALUE FROM DUAL)
CONNECT BY
SUBSTR(VALUE, (LEVEL - 1) * 4 + 1) IS NOT NULL
)
PL / SQL:
DECLARE
text VARCHAR2(50);
newText VARCHAR2(50);
BEGIN
text := '3536202927123456789';
FOR i IN 0..TRUNC(LENGTH(text) / 4) LOOP
newText := SUBSTR(text, i * 4 + 1, 4) || newText;
END LOOP;
dbms_output.put_line(newText);
END;
或
DECLARE
text VARCHAR2(50) := 3536202927123456789;
newText VARCHAR2(50);
BEGIN
SELECT
LISTAGG(GRP) WITHIN GROUP (ORDER BY RN DESC) INTO newText
FROM (
SELECT
SUBSTR(VALUE, (LEVEL - 1) * 4 + 1, 4) GRP,
ROWNUM RN
FROM
(SELECT text VALUE FROM DUAL)
CONNECT BY
SUBSTR(VALUE, (LEVEL - 1) * 4 + 1) IS NOT NULL
);
dbms_output.put_line(newText);
END;