plsql tyring创建一个字符串算法

时间:2015-11-21 00:46:42

标签: oracle algorithm plsql

我正在尝试制作一个困难的(对我来说)字符串算法。

以下是算法必须如何显示的屏幕截图: enter image description here

所以这一切都以一个数字开头(长度可变,&&是varchar)。

步骤如下:

  1. 将组数分为4组(最后一组可以小于4)
  2. 撤消群组订单
  3. 删除空格
  4. 经过几个小时的挣扎,到目前为止我只能将这个数字分成几组。

    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。

    我甚至不需要一个确切的代码示例。一些指导性的帮助将是一个很大的帮助。

    此致

1 个答案:

答案 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;