Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 如何编写一个PL/SQL程序来输出类似xml格式的字符串_Oracle_Plsql - Fatal编程技术网

Oracle 如何编写一个PL/SQL程序来输出类似xml格式的字符串

Oracle 如何编写一个PL/SQL程序来输出类似xml格式的字符串,oracle,plsql,Oracle,Plsql,输入字符串:“A4B4C2D9D9C2E6E6B4S2O1O1S2A4 W2R8R8K3G5G3W2” 我尝试将此代码作为第一步: declare word varchar2(50) := 'a4b4c2d9d9c2e6e6b4s2o1o1s2a4w2r8r8k2g5g5k2w2'; num number := length(word)/2; name_array dbms_sql.varchar2_table; begin dbms_output.pu

输入字符串:“A4B4C2D9D9C2E6E6B4S2O1O1S2A4 W2R8R8K3G5G3W2” 我尝试将此代码作为第一步:

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格式。我需要这个输出:


哪些SQL函数、条件子句。。。我需要使用Oracle安装程序吗?

CREATE OR REPLACE TYPE CHARS_TABLE IS TABLE OF CHAR(2);
/
CREATE OR REPLACE TYPE INTEGERS_TABLE IS TABLE OF INTEGER;
/
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;
/
PL/SQL

CREATE OR REPLACE TYPE CHARS_TABLE IS TABLE OF CHAR(2);
/
CREATE OR REPLACE TYPE INTEGERS_TABLE IS TABLE OF INTEGER;
/
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;
/
这假定一组格式良好的字符对,并将每对字符缩进到适当的级别:

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;
/
输出

CREATE OR REPLACE TYPE CHARS_TABLE IS TABLE OF CHAR(2);
/
CREATE OR REPLACE TYPE INTEGERS_TABLE IS TABLE OF INTEGER;
/
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;
/
更新-更简单的基于堆栈的版本

CREATE OR REPLACE TYPE CHARS_TABLE IS TABLE OF CHAR(2);
/
CREATE OR REPLACE TYPE INTEGERS_TABLE IS TABLE OF INTEGER;
/
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;
/
即使,如果你把“*”而不是chr(9)然后输出将如下所示:

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

我在所需的输出中没有看到XML标记。哪些是标记?价值观是什么?它是从任何表中选取的吗?@Sergı只需要一个类似xml格式的输出。这是关于字母对齐和必要空格的确定。@Dawnıt不是从任何表中选取的,只需要输入字符串值。这些都是我找到解决方案的信息。我知道它不是很小,很可能是一个堆栈大小。您需要一个开放节点集合,在解析下一项时对其进行扩展/修剪。非常感谢:)我需要更多的帮助。我如何反转输出?我的意思是你的输出从a4 b4 c2 d9开始。。。。但是我的输出W2K3G5@MT0@ecenurozturk看看你的问题和我的答案中的
SUBSTR()
调用之间的区别。