2015-11-21 25 views
2

我想讓一個困難的(對我來說)字符串算法。plsql tyring創建一個字符串算法

下面是從算法如何必須是一個屏幕截圖: enter image description here

因此,一切都與多個(其可以是可變長度& &爲varchar)開始。

的步驟是:

  1. Devide數爲4的組(最後一組可以是小於4)
  2. 逆向上述羣階數
  3. 刪除空格

掙扎後我到目前爲止只花了幾個小時才把這個數字分成幾組。

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 

笏我在過去的幾個小時嘗試過;我首先認爲最簡單的方法應該是將長文本拆分成一個組並將它們添加到數組中,然後簡單地顛倒數組。老實說,這根本不適合我(甚至不是)。所以我想出了這個。

你能幫我嗎?對不起,今天開始在plsqy開始新生活。 如果我可以提供一些額外的信息,我很高興喲發佈此以及。

P.S.

我甚至不需要有一個確切的代碼示例。一些指導性的幫助將是一個很大的幫助。

問候

+0

爲什麼downvote ?如果有人對我的帖子有反饋,我可以改進我的未來帖子 –

回答

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; 
+0

嘿Husqvik,謝謝你的迴應。問題是,我需要這個函數作爲必須生成整個算法的函數的一部分。您給我的代碼示例是通過僅從表(?)獲取數據。我需要一些函數在plsql中輸入數字... –

+0

已更新。您始終可以簡單地將SQL查詢包裝到PL/SQL過程/函數中。 – Husqvik