【997755.com澳门葡京】Python中将字典转换为XML以及相关的命名空间解析,PHP5常用函数列表

原文地址:http://www.maomao365.com/?p=7307

多行转字符串

以此比较不难,用||或concat函数可以兑现

 SQL
Code 

1
2

  

select concat(id,username) str from app_user
select id||username str from app_user

Python上校字典转换为XML以及相关的命名空间解析,pythonxml

就算 xml.etree.ElementTree
库平常用来做分析工作,其实它也得以创建XML文档。 例如,考虑如下那一个函数:

from xml.etree.ElementTree import Element

def dict_to_xml(tag, d):
'''
Turn a simple dict of key/value pairs into XML
'''
elem = Element(tag)
for key, val in d.items():
  child = Element(key)
  child.text = str(val)
  elem.append(child)
return elem

上面是一个运用例子:

>>> s = { 'name': 'GOOG', 'shares': 100, 'price':490.1 }
>>> e = dict_to_xml('stock', s)
>>> e
<Element 'stock' at 0x1004b64c8>
>>>

更换结果是一个 Element 实例。对于I/O操作,使用 xml.etree.ElementTree
中的 tostring() 函数很不难就能将它转换成一个字节字符串。例如:

>>> from xml.etree.ElementTree import tostring
>>> tostring(e)
b'<stock><price>490.1</price><shares>100</shares><name>GOOG</name></stock>'
>>>

要是你想给某个元素添加属性值,可以接纳 set() 方法:

>>> e.set('_id','1234')
>>> tostring(e)
b'<stock _id="1234"><price>490.1</price><shares>100</shares><name>GOOG</name>
</stock>'
>>>

若是您还想维持元素的相继,可以设想构造一个 OrderedDict
来替代一个常备的字典。当创立XML的时候,你被限制只好构造字符串类型的值。例如:

def dict_to_xml_str(tag, d):
  '''
  Turn a simple dict of key/value pairs into XML
  '''
  parts = ['<{}>'.format(tag)]
  for key, val in d.items():
    parts.append('<{0}>{1}</{0}>'.format(key,val))
  parts.append('</{}>'.format(tag))
  return ''.join(parts)

标题是只要您手动的去构造的时候恐怕会碰到一些劳神。例如,当字典的值中隐含部分特殊字符的时候会怎么呢?

>>> d = { 'name' : '<spam>' }

>>> # String creation
>>> dict_to_xml_str('item',d)
'<item><name><spam></name></item>'

>>> # Proper XML creation
>>> e = dict_to_xml('item',d)
>>> tostring(e)
b'<item><name><spam></name></item>'
>>>

注意到程序的后边这些例子中,字符 ‘<‘ 和 ‘>’ 被替换成了 < 和
>

上面仅供参考,假诺您需求手动去转换那一个字符, 能够使用 xml.sax.saxutils
中的 escape() 和 unescape() 函数。例如:

>>> from xml.sax.saxutils import escape, unescape
>>> escape('<spam>')
'<spam>'
>>> unescape(_)
'<spam>'
>>>

除去能创制正确的输出外,还有别的一个缘由推荐您创建 Element
实例而不是字符串,
那就是运用字符串组合结构一个更大的文档并不是那么简单。 而 Element
实例能够不要考虑解析XML文本的状态下通过多样办法被处理。
也就是说,你可以在一个高档数据结构上成功你有着的操作,并在终极以字符串的花样将其出口。

选择命名空间解析XML文档
只要你分析那些文档并实施平常的询问,你会发觉这么些并不是那么不难,因为所有手续都变得格外的繁琐。

>>> # Some queries that work
>>> doc.findtext('author')
'David Beazley'
>>> doc.find('content')
<Element 'content' at 0x100776ec0>
>>> # A query involving a namespace (doesn't work)
>>> doc.find('content/html')
>>> # Works if fully qualified
>>> doc.find('content/{http://www.w3.org/1999/xhtml}html')
<Element '{http://www.w3.org/1999/xhtml}html' at 0x1007767e0>
>>> # Doesn't work
>>> doc.findtext('content/{http://www.w3.org/1999/xhtml}html/head/title')
>>> # Fully qualified
>>> doc.findtext('content/{http://www.w3.org/1999/xhtml}html/'
... '{http://www.w3.org/1999/xhtml}head/{http://www.w3.org/1999/xhtml}title')
'Hello World'
>>>

您可以经过将命名空间处理逻辑包装为一个工具类来简化那个进度:

class XMLNamespaces:
  def __init__(self, **kwargs):
    self.namespaces = {}
    for name, uri in kwargs.items():
      self.register(name, uri)
  def register(self, name, uri):
    self.namespaces[name] = '{'+uri+'}'
  def __call__(self, path):
    return path.format_map(self.namespaces)

经过上面的不二法门利用那么些类:

>>> ns = XMLNamespaces(html='http://www.w3.org/1999/xhtml')
>>> doc.find(ns('content/{html}html'))
<Element '{http://www.w3.org/1999/xhtml}html' at 0x1007767e0>
>>> doc.findtext(ns('content/{html}html/{html}head/{html}title'))
'Hello World'
>>>

讨论
分析含有命名空间的XML文档会相比较繁琐。 下边的 XMLNamespaces
仅仅是允许你选取缩略名代替完整的URI将其变得稍微简洁一点。

很不幸的是,在中央的 ElementTree 解析中并未其余途径取得命名空间的音信。
然而,假若您利用 iterparse()
函数的话就可以拿走越来越多关于命名空间处理范围的新闻。例如:

>>> from xml.etree.ElementTree import iterparse
>>> for evt, elem in iterparse('ns2.xml', ('end', 'start-ns', 'end-ns')):
... print(evt, elem)
...
end <Element 'author' at 0x10110de10>
start-ns ('', 'http://www.w3.org/1999/xhtml')
end <Element '{http://www.w3.org/1999/xhtml}title' at 0x1011131b0>
end <Element '{http://www.w3.org/1999/xhtml}head' at 0x1011130a8>
end <Element '{http://www.w3.org/1999/xhtml}h1' at 0x101113310>
end <Element '{http://www.w3.org/1999/xhtml}body' at 0x101113260>
end <Element '{http://www.w3.org/1999/xhtml}html' at 0x10110df70>
end-ns None
end <Element 'content' at 0x10110de68>
end <Element 'top' at 0x10110dd60>
>>> elem # This is the topmost element
<Element 'top' at 0x10110dd60>
>>>

说到底一点,如果你要拍卖的XML文本除了要利用到任何高档XML特性外,还要采用到命名空间,
提出你无与伦比是利用 lxml 函数库来取代 ElementTree 。 例如,lxml
对使用DTD验证文档、更好的XPath扶助和有些任何高档XML特性等都提供了更好的协助。
这一小节其实只是教你哪些让XML解析稍微不难一点。

即便 xml.etree.ElementTree
库寻常用来做分析工作,其实它也可以成立XML文档。 例如,…

如下所示:

摘要:

字符串转多列

实则就是拆分字符串的难题,可以利用
substr、instr、regexp_substr函数格局

复制代码 代码如下:

 
 在此从前分割字符串时,都选用类似split函数的办法处理,下文分享一种对有规律的字符串的相间格局,

【997755.com澳门葡京】Python中将字典转换为XML以及相关的命名空间解析,PHP5常用函数列表。字符串转多行

动用union
all函数等艺术

  usleep() 函数延迟代码执行多少阿秒。
  unpack() 函数从二进制字符串对数据开展解包。
  uniqid() 函数基于以飞秒计的方今时间,生成一个唯一的 ID。
  time_sleep_until() 函数延迟代码执行直到指定的岁月。
  PHP5常用函数之time_nanosleep() 函数延迟代码执行多少秒和毫秒。
  sleep() 函数延迟代码执行多少秒。
  show_source() 函数对文本举办语法高亮显示。
  strip_whitespace() 函数再次回到已删除 PHP
注释以及空白字符的源代码文件。
  pack() 函数把多少装入一个二进制字符串。
  ignore_user_abort() 函数设置与客户机断开是还是不是会告一段落脚本的实施。
  highlight_string() 函数对字符串举办语法高亮展现。
  highlight_file() 函数对文件举行语法高亮展现。
  PHP5常用函数之get_browser() 函数重返用户浏览器的习性。
  exit() 函数输出一条消息,并退出当前剧本。
  eval() 函数把字符串根据 PHP 代码来总括。
  die() 函数输出一条信息,并脱离当前剧本。
  defined() 函数检查某常量是还是不是留存。
  define() 函数定义一个常量。
  constant() 函数再次回到常量的值。
  PHP5常用函数之connection_status() 函数重临当前的连天情形。
  connection_aborted() 函数检查是还是不是断开客户机。
  zip_read() 函数读取打开的 zip 档案中的下一个文件。
  zip_open() 函数打开 ZIP 文件以供读取。
  zip_entry_read() 函数从打开的 zip 档案项目中拿走内容。
  zip_entry_open() 函数打开一个 ZIP 档案项目以供读取。
  PHP5常用函数之zip_entry_name() 函数重返 zip 档案项目标称号。
  zip_entry_filesize() 函数重临 zip
档案项目的原本大小(在削减此前)。
  zip_entry_compressionmethod() 函数重临 zip 档案项目的削减方法。
  zip_entry_compressedsize() 函数重返 zip 档案项目标压缩文件尺寸。
  zip_entry_close() 函数关闭由 zip_entry_open() 函数打开的 zip
档案文件。
  zip_close() 函数关闭由 zip_open() 函数打开的 zip 档案文件。
  xml_set_unparsed_entity_decl_handler()
函数规定在蒙受无法解析的实体名称(NDATA)申明时被调用的函数。
  xml_set_processing_instruction_handler() 函数规定当解析器在 XML
文档中找随地理指令时所调用的函数。
  xml_set_object() 函数允许在目的中应用 XML 解析器。
  PHP5常用函数之xml_set_notation_decl_handler() 函数规定当解析器在
XML 文档中找到符号申明时被调用的函数。
  xml_set_external_entity_ref_handler() 函数规定当解析器在 XML
文档中找到外部实体时被调用的函数。
  xml_set_element_handler() 函数建立起头和终止元素处理器。
  xml_set_default_handler() 函数为 XML
解析器建立默许的多少处理器。
  xml_set_character_data_handler() 函数建立字符数据处理器。
  xml_parser_set_option() 函数为 XML 解析器进行分选设置。
  xml_parser_get_option() 函数从 XML 解析器获取选项设置音讯。
  xml_parser_free() 函数释放 XML 解析器。
  PHP5常用函数之xml_parser_create() 函数创制 XML 解析器。
  xml_parser_create_ns() 函数创制带有命名空间支撑的 XML 解析器。
  xml_parse_into_struct() 函数把 XML 数据解析到数组中。
  xml_parse() 函数解析 XML 文档。
  xml_get_error_code() 函数获取 XML 解析器错误代码。
  xml_get_current_line_number() 函数获取 XML 解析器的此时此刻行号。
997755.com澳门葡京,  xml_get_current_column_number() 函数获取 XML
解析器的当前列号。
  PHP5常用函数之xml_get_current_byte_index() 函数获取 XML
解析器的此时此刻字节索引。
  xml_error_string() 函数获取 XML 解析器的错误描述。
  utf8_encode() 函数把 ISO-8859-1 字符串编码为 UTF-8。
  utf8_decode() 函数把 UTF-8 字符串解码为 ISO-8859-1。
  wordwrap() 函数按照指定长度对字符串举办折行处理。
  vsprintf() 函数把格式化字符串写入变量中。
  vprintf() 函数输出格式化的字符串。
  vfprintf() 函数把格式化的字符串写到指定的输出流。
  PHP5常用函数之ucwords() 函数把字符串中每个单词的首字符转换为大写。
  ucfirst() 函数把字符串中的首字符转换为大写。
  trim() 函数从字符串的双面删除空白字符和其余预订义字符。
  substr_replace() 函数把字符串的一有的替换为另一个字符串。
  substr_count() 函数总计子串在字符串中冒出的次数。
  substr_compare() 函数从指定的起首长度比较多少个字符串。
  substr() 函数再次回到字符串的一有些。
  strtr() 函数转换字符串中一定的字符。
  strtoupper() 函数把字符串转换为大写。
  strtolower() 函数把字符串转换为小写。
  PHP5常用函数之strtok() 函数把字符串分割为更小的字符串。
  strstr() 函数搜索一个字符串在另一个字符串中的第二回面世。
  strspn() 函数再次回到在字符串中蕴涵的特定字符的数码。
  strrpos() 函数查找字符串在另一个字符串中最后一遍出现的职位。
  strripos() 函数查找字符串在另一个字符串中最后两回出现的职位。
  strrev() 函数反转字符串。
  strrchr()
函数查找字符串在另一个字符串中最后几遍出现的岗位,并再次来到从该岗位到字符串结尾的持有字符。
  strpos() 函数重回字符串在另一个字符串中率先次面世的义务。
  PHP5常用函数之strpbrk() 函数在字符串中搜索指定字符中的任意一个。
  strncmp() 函数相比多少个字符串。
  strncasecmp() 函数比较八个字符串。
  strnatcmp() 函数使用一种“自然”算法来比较三个字符串。
  strnatcasecmp() 函数使用一种“自然”算法来相比较八个字符串。
  strlen() 函数重临字符串的长度。
  stristr() 函数查找字符串在另一个字符串中首先次出现的岗位。
  stripos() 函数再次来到字符串在另一个字符串中首先次出现的岗位。
  stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
  stripcslashes() 函数删除由 addcslashes() 函数添加的反斜杠。
  strip_tags() 函数剥去 HTML、XML 以及 PHP 的标签。
  strcspn() 函数重回在找到任何指定的字符往日,在字符串查找的字符数。
  PHP5常用函数之strcoll() 函数相比多少个字符串。
  strcmp() 函数相比较多个字符串。
  strchr() 函数搜索一个字符串在另一个字符串中的第三回面世。
  strcasecmp() 函数比较五个字符串。
  str_word_count() 函数总计字符串中的单词数。
  str_split() 函数把字符串分割到数组中。
  str_shuffle() 函数随机地打乱字符串中的所有字符。
  str_rot13() 函数对字符串执行 ROT13 编码。
  str_replace() 函数使用一个字符串替换字符串中的另一部分字符。
  str_repeat() 函数把字符串重复指定的次数。
  str_pad() 函数把字符串填充为指定的长短。
  str_ireplace() 函数使用一个字符串替换字符串中的另一对字符。
  PHP5常用函数之sscanf()
函数依据指定的格式解析来自一个字符串的输入。
  sprintf() 函数把格式化的字符串写写入一个变量中。
  soundex() 函数总结字符串的 soundex 键。
  similar_text() 函数总计四个字符串的合营字符的数额。
  sha1_file() 函数总计文件的 SHA-1 散列。
  sha1() 函数总结字符串的 SHA-1 散列。
  setlocale() 函数设置地区音讯(地域新闻)。
  PHP5常用函数之rtrim() P rtrim() 函数

 
 即:1.使用replace函数,将字符串变成合规的xml格式串

wm_concat函数

第一让大家来看看这一个神奇的函数wm_concat(列名),该函数可以把列值以”,”号分隔起来,并浮现成一行,接下去上例子,看看那一个神奇的函数如何使用准备测试数据

 SQL
Code 

1
2
3
4
5
6

  

create table test(id number,name varchar2(20));
insert into test values(1,’a’);
insert into test values(1,’b’);
insert into test values(1,’c’);
insert into test values(2,’d’);
insert into test values(2,’e’);

您可能感兴趣的稿子:

  • PHP执行linux命令常用函数汇总
  • PHP中的一些常用函数收集
  • 更加实用的PHP常用函数汇总
  • PHP 正则表达式常用函数
  • ThinkPHP字符串函数及常用函数汇总
  • PHP常用函数和大规模疑难难题解答
  • 据悉PHP中的常用函数回看
  • 按照php常用函数计算(数组,字符串,时间,文件操作)
  • 根据PHP常用函数的用法详解
  • PHP 查找字符串常用函数介绍
  • PHP中的MYSQL常用函数(php下操作数据库必备)
  • 储藏的PHP常用函数
    推荐收藏保存
  • PHP开发进度中常用函数收藏
  • PHP
    正则表明式常用函数使用小结
  • PHP
    常用函数库和有些实用小技巧
  • PHP常用函数小技巧
  • 此起彼伏收藏一些PHP常用函数
  • PHP常用函数计算(180多少个)

     
 2.采纳xml.value的法子取得指定的字符串信息

功能1 : 行转列 ,默许逗号隔开

 SQL
Code 

1

  

select wm_concat(name) name from test;

   

997755.com澳门葡京 1

    如下所示:

功能2: 把结果里的逗号替换成”|”

 SQL
Code 

1

  

select replace(wm_concat(name),’,’,’|’) from test;

   

997755.com澳门葡京 2

    实验环境:sqlserver 2008 R2  

功效3: 按ID分组合并name

 SQL
Code 

1

  

select id,wm_concat(name) name from test group by id;

   

997755.com澳门葡京 3

sql语句等同于上面的sql语句:

  SQL
Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

  

——– 适用范围:8i,9i,10g及以后版本  ( MAX + DECODE )
select id,
       max(decode(rn, 1, name, null)) ||
       max(decode(rn, 2, ‘,’ || name, null)) ||
       max(decode(rn, 3, ‘,’ || name, null)) str
  from (select id,
               name,
               row_number() over(partition by id order by name) as rn
          from test) t
 group by id
 order by 1;
——– 适用范围:8i,9i,10g及以后版本 ( ROW_NUMBER + LEAD )
select id, str
  from (select id,
               row_number() over(partition by id order by name) as rn,
               name || lead(‘,’ || name, 1) over(partition by id order by name) ||
               lead(‘,’ || name, 2) over(partition by id order by name) || 
               lead(‘,’ || name, 3) over(partition by id order by name) as str
          from test)
 where rn = 1
 order by 1;
——– 适用范围:10g及以后版本 ( MODEL )
select id, substr(str, 2) str
  from test model return updated rows partition by(id) dimension by(row_number() 
  over(partition by id order by name) as rn) measures(cast(name as varchar2(20)) as str) 
  rules upsert iterate(3) until(presentv(str [ iteration_number + 2 ], 1, 0) = 0)
  (str [ 0 ] = str [ 0 ] || ‘,’ || str [ iteration_number + 1 ])
 order by 1;
——– 适用范围:8i,9i,10g及以后版本 ( MAX + DECODE )
select t.id id, max(substr(sys_connect_by_path(t.name, ‘,’), 2)) str
  from (select id, name, row_number() over(partition by id order by name) rn
          from test) t
 start with rn = 1
connect by rn = prior rn + 1
       and id = prior id
 group by t.id;

   

--例:
-----获取下面字符串中中括号中的内容
-----我们可以将下列规则的字符串采用replace替换为XML格式的字符串,然后采用xml select获取相关信息
DECLARE @stringInfo   VARCHAR(MAX) ='1:[猫猫小屋],2:[字符串分割],3:[sql教程博客]'
      , @q VARCHAR(3)   =3;  ---获取第三个分割符中的信息

declare @xmlInfo xml ;

set @stringInfo = '<xmlInfo keyId ="'+@stringInfo;
set @stringInfo = REPLACE(@stringInfo, '[', '" value="');
set @stringInfo = REPLACE(@stringInfo, '],', '" /><xmlInfo keyId ="');
set @stringInfo = REPLACE(@stringInfo, ']', '" />');
set @stringInfo = REPLACE(@stringInfo, ':', '');

set @xmlInfo = CONVERT(xml,@stringInfo); 


SELECT @xmlInfo as [xmlInfo],
@xmlInfo.value('(/xmlInfo[@keyId=sql:variable("@q")]/@value)[1]',
 'varchar(60)');

懒人伸张用法:

案例: 本身要写一个视图,类似”create
or replace view as select 字段1,…字段50 from tablename”
,基表有50几个字段,若是靠手工写太难为了,有没有怎么着简便的方法?
当然有了,看本身一旦运用wm_concat来让那些须要变简单,要是自己的APP_USER表中有(id,username,password,age)4个字段。查询结果如下

 SQL
Code 

1
2
3
4
5

  

/** 这里的表名默认区分大小写 */
select ‘create or replace view as select ‘ || wm_concat(column_name) ||
       ‘ from APP_USER’ sqlStr
  from user_tab_columns
 where table_name = ‘APP_USER’;

   

997755.com澳门葡京 4

动用种类表格局查询

 SQL
Code 

1

  

select * from user_tab_columns

 

Oracle 11g 行列调换 pivot 和 unpivot 表明

在Oracle
11g中,Oracle 又追加了2个查询:pivot(行转列)
unpivot(列转行)

参考:)

google
一下,网上有一篇比较详细的文档:

 

pivot 列转行

测试数据
(id,类型名称,销售数目),案例:根据水果的连串查询出一条数据突显出每种档次的行销数据。

 SQL
Code 

1
2
3
4
5
6
7
8
9

  

create table demo(id int,name varchar(20),nums int);  —- 创建表
insert into demo values(1, ‘苹果’, 1000);
insert into demo values(2, ‘苹果’, 2000);
insert into demo values(3, ‘苹果’, 4000);
insert into demo values(4, ‘橘子’, 5000);
insert into demo values(5, ‘橘子’, 3000);
insert into demo values(6, ‘葡萄’, 3500);
insert into demo values(7, ‘芒果’, 4200);
insert into demo values(8, ‘芒果’, 5500);

   

997755.com澳门葡京 5

分组查询
本来那是不相符查询一条数据的渴求的)

 SQL
Code 

1

  

select name, sum(nums) nums from demo group by name

997755.com澳门葡京 6

行转列查询

 SQL
Code 

1

  

select * from (select name, nums from demo) pivot (sum(nums) for name in (‘苹果’ 苹果, ‘橘子’, ‘葡萄’, ‘芒果’));

997755.com澳门葡京 7

注意
pivot(聚合函数 for 列名 in(类型)) ,其中 in(”)
中可以指定别名,in中还足以指定子查询,比如 select distinct code from
customers

当然也足以不利用pivot函数,等同于下列语句,只是代码比较长,不难精晓

 SQL
Code 

1
2
3
4
5

  

select *
  from (select sum(nums) 苹果 from demo where name = ‘苹果’),
       (select sum(nums) 橘子 from demo where name = ‘橘子’),
       (select sum(nums) 葡萄 from demo where name = ‘葡萄’),
       (select sum(nums) 芒果 from demo where name = ‘芒果’);

 

unpivot 行转列

顾名思义就是将多列转换成1列中去
案例:当今有一个水果表,记录了4个季度的行销数量,现在要将每种水果的种种季度的行销场所用多行数据显示。

创制表和数目

 SQL
Code 

1
2
3
4
5
6

  

create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);
insert into Fruit values(1,’苹果’,1000,2000,3300,5000);
insert into Fruit values(2,’橘子’,3000,3000,3200,1500);
insert into Fruit values(3,’香蕉’,2500,3500,2200,2500);
insert into Fruit values(4,’葡萄’,1500,2500,1200,3500);
select * from Fruit

997755.com澳门葡京 8

列转行查询

 SQL
Code 

1

  

select id , name, jidu, xiaoshou from Fruit unpivot (xiaoshou for jidu in (q1, q2, q3, q4) )

专注:
unpivot没有聚合函数,xiaoshou、jidu字段也是暂时的变量

997755.com澳门葡京 9

一如既往不利用unpivot也足以已毕平等的功效,只是sql语句会很长,而且举行进程作用也未尝前者高

 SQL
Code 

1
2
3
4
5
6
7

  

select id, name ,’Q1′ jidu, (select q1 from fruit where id=f.id) xiaoshou from Fruit f
union
select id, name ,’Q2′ jidu, (select q2 from fruit where id=f.id) xiaoshou from Fruit f
union
select id, name ,’Q3′ jidu, (select q3 from fruit where id=f.id) xiaoshou from Fruit f
union
select id, name ,’Q4′ jidu, (select q4 from fruit where id=f.id) xiaoshou from Fruit f

XML类型

上述pivot列转行示例中,你已经掌握了亟需查询的类型有怎么着,用in()的章程包含,即使假使你不知情都有何值,您怎么营造查询呢?

pivot 操作中的另一个子句 XML
可用于解决此题材。该子句允许你以 XML 格式成立执行了 pivot
操作的出口,在此输出中,您可以指定一个相当的子句 ANY 而非文字值

演示如下:

 SQL
Code 

1
2
3
4
5
6
7

  

select * from (
   select name, nums as "Purchase Frequency"
   from demo t
)                              
pivot xml (
   sum(nums) for name in (any)
)

997755.com澳门葡京 10

如你所见,列
NAME_XML 是 XMLTYPE,其中根元素是
<PivotSet>。每个值以名称-值元素对的花样表示。您可以采取任何 XML
分析器中的输出生成更有效的输出。

997755.com澳门葡京 11

对于该xml文件的解析,贴代码如下:

  SQL
Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

 

create or replace procedure ljz_pivot_xml_sp(pi_table_name   varchar2,
                                             pi_column_name  varchar2,
                                             pi_create_table varchar2) as
  v_column      nvarchar2(50);
  v_count       number := 0;
  v_i           number;
  v_parent_node nvarchar2(4000);
  v_child_node  nvarchar2(4000);
  v_over        boolean := false;
  v_tmp         nvarchar2(50);
  v_existsnode  number;
  v_sql         clob;
  v_name        varchar2(30);
  v_name_xml    xmltype;
begin
  v_sql         := ‘select x.* from ‘ || pi_table_name ||
                   ‘ a, xmltable(”/PivotSet” passing a.’ ||
                   pi_column_name || ‘ columns ‘;
  v_parent_node := ‘/PivotSet’;
  v_child_node  := ‘item[1]/column[2]’;
  v_i           := 1;
  execute immediate ‘select ‘ || pi_column_name || ‘ from ‘ ||
                    pi_table_name || ‘ where rownum=1’
    into v_name_xml;
  select existsnode(v_name_xml,
                    ‘/PivotSet/item[‘ || to_char(v_i) || ‘]/column[1]’)
    into v_existsnode
    from dual;
  while v_existsnode = 1 loop
    execute immediate ‘select substr(extractvalue(‘ || pi_column_name ||
                      ‘, ”/PivotSet/item[‘ || to_char(v_i) || ‘]/column[1]”),1,30)
    from ‘ || pi_table_name || ‘ x’
      into v_name;
    v_sql := v_sql || ‘"’ || v_name || ‘" varchar2(30) path ”item[‘ ||
             to_char(v_i) || ‘]/column[2]”,’;
    v_i   := v_i + 1;
    select existsnode(v_name_xml,
                      ‘/PivotSet/item[‘ || to_char(v_i) || ‘]/column[1]’)
      into v_existsnode
      from dual;
  end loop;
  v_sql := trim(‘,’ from v_sql) || ‘) x’;
  commit;
  select count(1)
    into v_count
    from user_tab_columns
   where table_name = upper(pi_create_table);
  if v_count = 0 then
    execute immediate ‘create table ‘ || pi_create_table || ‘ as ‘ || v_sql;
  end if;
end;

 

率先个参数为要解析xml文件所属数据表,第三个参数为要解析xml所存字段,第多个参数存放解析后的数目集。

测试:

begin

ljz_pivot_xml_sp(‘(select * from (select deptno,sal from emp) pivot
xml(sum(sal) for deptno in(any)))’,

‘deptno_xml’,

‘ljz_pivot_tmp’);

end;

997755.com澳门葡京 12

初学oracle
xml解析,那种情势相比愚钝,一个一个循环列,原型如下:

select extractvalue(name_xml, ‘/PivotSet/item[1]/column[1]’)

from (select * from (select name,nums from demo) pivot xml(sum(nums) for name in(any))) x

where existsnode(name_xml, ‘/PivotSet/item[1]/column[1]’) = 1;

997755.com澳门葡京 13

select x.*

from (select *

from (select name, nums from demo)

pivot xml(sum(nums)

for name in(any))) a,

xmltable(‘/PivotSet’ passing a.name_xml columns

芒果 varchar2(30) path ‘item[1]/column[2]’,

苹果 varchar2(30) path ‘item[2]/column[2]’)
x

997755.com澳门葡京 14

不知是或不是留存直接进行剖析的法门,那种艺术还不如直接行列转变,不经过xml转来转去。

select ”” || listagg(substr(name, 1, 30), q'{‘,’}’) within group(order by name) || ””

from (select distinct name from demo);

997755.com澳门葡京 15

select *

from (select name, nums from demo)

pivot(sum(nums)

for name in(‘苹果’, ‘橘子’, ‘葡萄’, ‘芒果’));

997755.com澳门葡京 16

如此那般拼接字符串反而越来越惠及。

结论

Pivot 为 SQL
语言增加了一个要命紧要且实用的职能。您可以行使 pivot
函数针对任何关系表创建一个交叉表报表,而毋庸编写包括多量 decode
函数的令人费解的、不直观的代码。同样,您可以拔取 unpivot 操作转换任何交叉表报表,以常规关系表的款式对其进展仓储。Pivot 可以扭转常规文本或
XML 格式的输出。假诺是 XML 格式的出口,您不要指定 pivot
操作须求摸索的值域。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website