2017-07-14 64 views
-3

輸入字符串字符串PL/SQL程序:「a4b4c2d9d9c2e6e6b4s2o1o1s2a4w2r8r8k3g5g5k3w2」 我想這個代碼第一步:如何編寫打印出這看起來像XML格式

declare 
    word varchar2(50) := 'a4b4c2d9d9c2e6e6b4s2o1o1s2a4w2r8r8k2g5g5k2w2'; 
    num number  := length(word)/2; 
    name_array dbms_sql.varchar2_table; 
begin 
    dbms_output.put_line(word); 
    FOR i IN 1..num LOOP 
     name_array(i) := substr(word, -2*i, 2); 
    END LOOP; 
    FOR i IN name_array.FIRST .. name_array.LAST LOOP 
     dbms_output.put_line(name_array(i)); 
    END LOOP; 
end; 

此代碼創建唯一的字符串數組。不是xml格式。我需要這樣的輸出:

ı need this output:

哪個SQL函數,條件子句...我需要使用?

+3

我在所需的輸出中看不到XML標記。 – Serg

+0

哪些是標籤?什麼是價值?它是從任何表格中挑選出來的嗎? – Dawn

+0

@Serg我只需要一個輸出看起來像xml format.this是約 字母的排列和確定必要的空間。 – ecenurozturk

回答

0

甲骨文設置

CREATE OR REPLACE TYPE CHARS_TABLE IS TABLE OF CHAR(2); 
/
CREATE OR REPLACE TYPE INTEGERS_TABLE IS TABLE OF INTEGER; 
/

PL/SQL

這假定合式設定的字符對,只是縮進每對到合適的水平:

DECLARE 
    word VARCHAR2(50) := 'a4b4c2d9d9c2e6e6b4s2o1o1s2a4w2r8r8k2g5g5k2w2'; 
    num PLS_INTEGER := LENGTH(word)/2; 
    name_array CHARS_TABLE := CHARS_TABLE(); 
    depth_array INTEGERS_TABLE := INTEGERS_TABLE(); 
    open_array INTEGERS_TABLE := INTEGERS_TABLE(); 
BEGIN 
    name_array.EXTEND(num); 
    depth_array.EXTEND(num); 
    open_array.EXTEND(num); 

    name_array(1) := SUBSTR(word, 1, 2); 
    depth_array(1) := 1; 
    open_array(1) := 1; 

    FOR i IN 2 .. num LOOP 
    name_array(i) := SUBSTR(word, 2*i - 1, 2); 
    open_array(i) := 1; 
    FOR j IN 1 .. i-1 LOOP 
     IF name_array(j) = name_array(i) THEN 
     open_array(i) := -open_array(i); 
     END IF; 
    END LOOP; 
    depth_array(i) := depth_array(i-1) + open_array(i); 
    END LOOP; 

    FOR i IN 1 .. num LOOP 
    FOR j IN 2 .. depth_array(i) + CASE open_array(i) WHEN 1 THEN 0 ELSE 1 END LOOP 
     DBMS_OUTPUT.PUT(' '); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE(name_array(i)); 
    END LOOP; 
END; 
/

輸出

a4 
    b4 
    c2 
     d9 
     d9 
    c2 
    e6 
    e6 
    b4 
    s2 
    o1 
    o1 
    s2 
a4 
w2 
    r8 
    r8 
    k2 
    g5 
    g5 
    k2 
w2 

更新 - 基於堆棧的簡化版本

DECLARE 
    word  CONSTANT VARCHAR2(50) := 'a4b4c2d9d9c2e6e6b4s2o1o1s2a4w2r8r8k2g5g5k2w2'; 
    num   CONSTANT PLS_INTEGER := LENGTH(word)/2; 
    name_array CHARS_TABLE := CHARS_TABLE(); 
    depth  PLS_INTEGER := 0; 
    name  CHAR(2); 

    PROCEDURE indent(depth PLS_INTEGER, name CHAR) 
    IS 
    BEGIN 
    FOR j IN 2 .. depth LOOP 
     DBMS_OUTPUT.PUT(' '); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE(name); 
    END; 
BEGIN 
    name_array.EXTEND(num); 

    FOR i IN 1 .. num LOOP 
    name := SUBSTR(word, 2*i - 1, 2); 
    IF depth > 0 AND name = name_array(depth) THEN 
     indent(depth,name); 
     depth := depth - 1; 
    ELSE 
     depth := depth - 1; 
     name_array(depth) := name; 
     indent(depth,name); 
    END IF; 
    END LOOP; 
END; 
/
+0

非常感謝:)我需要多一點幫助。我怎樣才能扭轉輸出?我的意思是你的輸出開始於a4 b4 c2 d9 ....但是我的輸出w2 k3 g5 [email protected] MT0 – ecenurozturk

+0

@ecenurozturk看看你的問題和我的答案中的'SUBSTR()'調用之間的區別。 – MT0

0
DECLARE 
    vs_CurrentChar VARCHAR2(1); 
    vs_NextChar VARCHAR2(1); 
    vs_TempText VARCHAR2(100); 
    vs_InputText VARCHAR2(100) := 'abcdffdcba'; 

    vn_LengthOfText NUMBER := 1; 
    vn_WhileIndex NUMBER := 1; 

    vs_Spaces VARCHAR(100); 
BEGIN 
    vs_TempText := NULL; 
    vs_CurrentChar := substr(vs_InputText, vn_WhileIndex, vn_LengthOfText); 
    dbms_output.put_line(vs_CurrentChar); 

    WHILE vn_WhileIndex < length(vs_InputText) - 1 LOOP 

    vs_NextChar := substr(vs_InputText, vn_WhileIndex + 1, vn_LengthOfText); 
    EXIT WHEN vs_CurrentChar = vs_NextChar; 

    vs_TempText := vs_TempText || vs_CurrentChar; 
    vs_CurrentChar := vs_NextChar; 
    vs_Spaces  := NULL; 
    FOR i IN 1 .. vn_WhileIndex LOOP 
     vs_Spaces := vs_Spaces || chr(9); --'*'; 
    END LOOP; 

    dbms_output.put_line(vs_Spaces || vs_CurrentChar); 
    vn_WhileIndex := vn_WhileIndex + 1; 
    END LOOP; 

    dbms_output.put_line(vs_Spaces || vs_CurrentChar); 

    FOR i IN 1 .. length(vs_TempText) LOOP 
    vs_Spaces  := substr(vs_Spaces, vn_LengthOfText, length(vs_Spaces) - 1); 
    vs_CurrentChar := substr(vs_TempText, -i, vn_LengthOfText); 
    dbms_output.put_line(vs_Spaces || vs_CurrentChar); 
    END LOOP; 
END; 
/

輸出:

a 
    b 
     c 
      d 
       f 
       f 
      d 
     c 
    b 
a 

甚至,如果你把'*'; (9);而不是chr(9);然後輸出將如下所示:

a 
*b 
**c 
***d 
****f 
****f 
***d 
**c 
*b 
a