小毛驴(xml)试乘记(二):pl/sql方法

Oracle支持xml。可以用pl/sql加工xml数据。

下面的例子对xml加工后将其用dbms_output输出。

同理,也可将结果Insert到表里去。

declare
x xmltype := xmltype('<?xml version="1.0"?>
<config> <!--在config和rules之间有许多数据,这里简化-->
 <devices>
  <entry>
    <vsys>
	 <entry>
	  <rulebase>
       <security>
        <rules> <!--rules之下的entry有上百条,这里简化,只留1条数据-->
	      <entry name="GlobalProtect">
		   <from>
			<member>untrust-1</member>
			<member>untrust-2</member>
		   </from>
		   <to>
			<member>dmz1</member>
			<member>dmz2</member>
		   </to>
		   <source>
			<member>any</member>
		   </source>
		   <destination>
			<member>DC01_FW01_eth11</member>
		   </destination>
		   <source-user>
			<member>any</member>
		   </source-user>
		   <category>
			<member>any</member>
		   </category>
		   <application>
			<member>any</member>
		   </application>
		   <service>
			<member>service_https</member>
			<member>TCP_80</member>
		   </service>
		   <hip-profiles>
			<member>any</member>
		   </hip-profiles>
		   <action>test</action>
		   <log-setting>traffic_log</log-setting>
	    </entry>
       </rules>
      </security>
	 </rulebase>
	</entry>
   </vsys>
  </entry>
 </devices>
</config>
');

begin
for r in
(SELECT X.*
 FROM XMLTABLE (
  -- 取得entry之下的from/to等Node的值,因为member可能有一个以上,要用for
  'for $e in $d/config/devices/entry/vsys/entry/rulebase/security/rules/entry
   return <e>
              --取得entry的Attribute,name
              <entry>{fn:string($e/@name)}</entry>
               --用函数(fn:string-join)把多个值连接起来,分隔符用;
               <from>{fn:string-join($e/from/member,";")}</from>
                 <to>{fn:string-join($e/to/member,";")}</to>
             <source>{fn:string-join($e/source/member,";")}</source>
        <destination>{fn:string-join($e/destination/member,";")}</destination>
        <source-user>{fn:string-join($e/source-user/member,";")}</source-user>
           <category>{fn:string-join($e/category/member,";")}</category>
        <application>{fn:string-join($e/application/member,";")}</application>
            <service>{fn:string-join($e/service/member,";")}</service>
       <hip-profiles>{fn:string-join($e/hip-profiles/member,";")}</hip-profiles>
                     {$e/action}  -- action只有一个值,不用函数
                     {$e/log-setting}
  </e>'
passing x as "d"
COLUMNS        s_entry PATH 'entry',
                s_from PATH 'from',
                  s_to PATH 'to',
              s_source PATH 'source',
         s_destination PATH 'destination',
         s_source_user PATH 'source-user',
            s_category PATH 'category',
         s_application PATH 'application',
             s_service PATH 'service',
        s_hip_profiles PATH 'hip-profiles',
              s_action PATH 'action',
         s_log_setting PATH 'log-setting'
) AS X ) loop

dbms_output.put_line(
	       r.s_entry
	||','||r.s_from
	||','||r.s_to
	||','||r.s_source
	||','||r.s_destination
	||','||r.s_source_user
	||','||r.s_category
	||','||r.s_application
	||','||r.s_service
	||','||r.s_hip_profiles
	||','||r.s_action
	||','||r.s_log_setting

);

end loop;
end;

输出结果

GlobalProtect,untrust-1;untrust-2,dmz1;dmz2,any,DC01_FW01_eth11,any,any,any,service_https;TCP_80,any,test,traffic_log

注意: 红字部分,“;”是有多个值的Node内部的分隔符,而“,”是各Node之间的分隔符。

时间: 2024-12-07 18:13:40

小毛驴(xml)试乘记(二):pl/sql方法的相关文章

PL/SQL教程(转)

课程 一 PL/SQL 基本查询与排序 本课重点:   1.写SELECT语句进行数据库查询   2.进行数学运算   3.处理空值   4.使用别名ALIASES   5.连接列   6.在SQL PLUS中编辑缓冲,修改SQL SCRIPTS   7.ORDER BY进行排序输出.   8.使用WHERE 字段. 一.写SQL 命令:     不区分大小写.     SQL 语句用数字分行,在SQL PLUS中被称为缓冲区.     最后以:或 / 结束语句.     也可以用RUN来执行语

[Oracle系列整理01]PL/SQL 基本查询与排序

本课重点:    1.写SELECT语句进行数据库查询    2.进行数学运算    3.处理空值    4.使用别名ALIASES    5.连接列    6.在SQL PLUS中编辑缓冲,修改SQL SCRIPTS    7.ORDER BY进行排序输出.    8.使用WHERE 字段. 一.写SQL 命令:      不区分大小写.      SQL 语句用数字分行,在SQL PLUS中被称为缓冲区.      最后以:或 / 结束语句.      也可以用RUN来执行语句 二.例1:

如何设置PL/SQL语句的快捷键

笑谈:自己在刚接触运维的工作的时候,有时候看见一些大神对于sql是信手拈来,敲打一个完整sql的速度让人懵懂.后来自己弱弱的请教了一下,原来是可以充分运用PLSQL工具的快捷键,来提高效率.以下内容是我自己的一点小总结. 描述:在使用PL/SQL的时候,经常用的sql语句是: SELECT * FROM .......       SELECT COUNT(*) FROM ......       可以通过设置快捷键来很快的输出这两个语句,以下是我自己的设置快捷键, 你可以设置成自己喜欢的"快捷

Oracle中PL/SQL简介、基本语法以及数据类型

Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型,拥有自身的变量申明,赋值语句,而且还有条件,循环等流程控制语句.过程控制结构与SQL数据处理能力无缝的结合形成了强大的编程语言,可以创建过程和函数以及程序包. PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性的发送给服务器,由服

2015/8/17笔记整理 第12章 PL/SQL编程简介1 块 过程 函数

Oracle数据库中包含一种过程化编程语言PL/SQL,PL/SQL是ORACLE对标准数据库语言的扩展. 一.PL/SQL的优点 PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块.当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句. PL/SQL语句—

PL/SQL程序设计基础语法详解(一)

一.什么是PL/SQL(Procedure Language/SQL) 概念:PLSQL是Oracle对sql语言的过程化扩展 指在SQL命令语言中增加了过程处理语句(如分支.循环等),使SQL语言具有过程处理能力. PL/SQL的结构: declare 说明部分 (变量说明,光标申明,例外说明 ] begin 语句序列 (DML语句]- exception 例外处理语句 End; 简单的PL/SQL程序 如果是在命令行中需要使用 set serveroutput on先打开显示 declare

公司PL/SQL考核及小结

一.数据库初始化脚本 1 -- Create table 学生信息 2 drop table HAND_STUDENT; 3 create table HAND_STUDENT 4 ( 5 STUDENT_NO VARCHAR2(10) not null, 6 STUDENT_NAME VARCHAR2(20), 7 STUDENT_AGE NUMBER(2), 8 STUDENT_GENDER VARCHAR2(5) 9 ); 10 -- Add comments to the table 1

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]

ORACLE PL/SQL编程总结(二)

----------异常错误处理--------- 即使是写得最好的PL/SQL程序也会遇到错误或未预料到的事件.一个优秀的程序都应该能够正确处理各种出错情况,并尽可能从错误中恢复.任何ORACLE错误(报告为ORA-xxxxx形式的Oracle错误号).PL/SQL运行错误或用户定义条件(不一写是错误),都可以.当然了,PL/SQL编译错误不能通过PL/SQL异常处理来处理,因为这些错误发生在PL/SQL程序执行之前. ORACLE 提供异常情况(EXCEPTION)和异常处理(EXCEPTI