• oracle 函数


    以下三种方法均可实现周岁年龄的计算:

    --算法一:
    SELECT TRUNC(months_between(sysdate, csrq)/12) AS "Age" FROM wrxxb;
    
    --算法二:
    SELECT trunc(to_number(to_char(sysdate,'yyyymmdd'))/10000 - to_number(to_char(to_date('1982-8-28','yyyy-mm-dd'),'yyyymmdd'))/10000) FROM dual;
    
    --算法三:
    SELECT to_char(sysdate,'yyyy')-to_char(csrq,'yyyy')+ decode(sign(to_char(sysdate,'mmdd')-to_char(csrq,'mmdd')),-1,-1,0,0,1,0) FROM wrxxb
    

      计算日期年月日周季度等

    select 
           to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyyww') as week2, --oracle求当年的第几周, yyyyiw 显示201152
           to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyy') as year, --oracle求第几年
           to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyymm') as month, --oracle求当年的第几月
           to_char(TO_DATE('20110101', 'YYYYMMDD'), 'yyyyddd') as day, --oracle求当年的第几天
           to_char(TO_DATE('20110401', 'YYYYMMDD'), 'yyyyq') as quarter -- oracle求当年的第几季度
      from dual
    

      

    实现字符串乘法,如传入:str='2,3,1', times=2, 输出:‘4,6,2’

    自定义函数

    create or replace function str_mul(str in varchar2,
                                       times in number)
      return varchar2 authid current_user is
      cursor str_split is
      select regexp_substr(str,'[^,]+',1, level) num
      from dual
      connect by level <= length(str) - length(REGEXP_REPLACE(str, ',', ''))+1;
        res varchar2(2000);
    	--num_str str_split%rowtype;
    begin
      for num_str in str_split loop
        if num_str.num is not null then
    	  res := res || num_str.num*times || ',';
    	  --insert into SalesList select v_kh.keHu, v_sp.shangPin, floor(dbms_random.value(10,50)) from dual;
    	  --stmt := 'select count(*) from ' || owner || '.' || table_name || ' where ' || col_name || ' is null';
    	  --execute immediate stmt into counts;
        end if;
      end loop;
      --commit;
      return substr(res, 1, length(res)-1);
    end;
    	
    --select str_mul('3,,2,1', 3) from dual
    

      json解析  12c以上版本,如果11g版本可使用apex_json包(5.0以上)xml_table/to_xmltype()方法,但是效率会低很多;还可尝试pl/json(用PL / SQL编写的通用JSON对象)  

    --从JSONArray中取数据
    SELECT jt.*
    FROM JSON_TABLE('[
    		{
    			"device_type_id": 1,
    			"amount": 120,
    			"remarks": ""
    		},
    		{
    			"device_type_id": 2,
    			"amount": 122,
    			"remarks": ""
    		},
    		{
    			"device_type_id": 3,
    			"amount": 123,
    			"remarks": "11111111111"
    		}
    	]',
    	'$'COLUMNS(
    		NESTED PATH '$[*]' COLUMNS (
    			device_type_id VARCHAR2(32) PATH '$.device_type_id',
    			amount VARCHAR2(32) PATH '$.amount',
    			remarks VARCHAR2(32) PATH '$.remarks')
    	)
    ) AS jt;
     
    --从JSONObject对象中取数据
    SELECT jt.*
    FROM JSON_TABLE('{
    		"detailed": [
    			{
    				"device_type_id": 1,
    				"amount": 120,
    				"remarks": ""
    			},
    			{
    				"device_type_id": 2,
    				"amount": 122,
    				"remarks": ""
    			}
    		]
    	}',
    	'$'COLUMNS(
    		NESTED PATH '$.detailed[*]' COLUMNS (
    			device_type_id VARCHAR2(32) PATH '$.device_type_id',
    			amount VARCHAR2(32) PATH '$.amount',
    			remarks VARCHAR2(32) PATH '$.remarks')
    	)
    )
    AS jt;
     
     
    --从三层嵌套的JSONObject对象中取数据
    SELECT jt.*
    FROM JSON_TABLE('{
        "certificate": "14531209693428a799591c0248bb95c3",
        "rows": [
            {
                "odo_id": "0",
                "odo_no": "ZC-FY-20170217001",
                "stamp": "2017-02-24",
                "order_no": "ZC-DD-20170210001",
                "partners_id": "213",
                "shipping_address": "深圳市福田区科技园南区T2-B栋601",
                "contacts": "李魁",
                "tel": "13510141822",
                "self_mention": "0",
                "detailed": [
                    {
                        "device_type_id": "1",
                        "amount": "121",
                        "remarks": ""
                    },{
                        "device_type_id": "2",
                        "amount": "122",
                        "remarks": ""
                    }
                ]
            },{
                "odo_id": "0",
                "odo_no": "ZC-FY-20170217002",
                "stamp": "2017-02-24",
                "order_no": "ZC-DD-20170210001",
                "partners_id": "213",
                "shipping_address": "深圳市福田区科技园南区T2-B栋601",
                "contacts": "李魁",
                "tel": "13510141822",
                "self_mention": "0",
                "detailed": [
                    {
                        "device_type_id": "3",
                        "amount": "123",
                        "remarks": ""
                    },{
                        "device_type_id": "4",
                        "amount": "124",
                        "remarks": ""
                    }
                ]
            }
        ]}', 
    	'$'COLUMNS(
    		requestor VARCHAR2(32) PATH '$.certificate',
    		NESTED PATH '$.rows[*]' COLUMNS (
    			odo_no VARCHAR2(32) PATH '$.odo_no',
    			NESTED PATH '$.detailed[*]' COLUMNS (
    				phone_type VARCHAR2(32) PATH '$.device_type_id',
    				phone_num VARCHAR2(20) PATH '$.amount'
    			)
    		)
    	)
    ) AS jt;
    

      json_table xml_table 对比,示例中json_table用时1.5秒,而xmltable用时27秒

    -- json_table
    with eqdata as (
        select e.id,
               e.title,
               e.mag
        from earthquake_json j, json_table(
            document,
            '$.features[*]'
            columns(
                id    varchar2(20)  path '$.id',
                mag   number        path '$.properties.mag',
                title varchar2(200) path '$.properties.title' ) ) e
    ), minmax as (
        select min(e.mag) minmag, max(e.mag) maxmag 
          from eqdata e
    )
    select e.id,
           e.title,
           e.mag
      from eqdata e, minmax m
     where e.mag in ( m.minmag, m.maxmag )
    
    
    -- xmltable
    with eqdata as (
        select e.id,
               e.title,
               e.mag
        from earthquake_json j, xmltable(
            '/json/features/row'
            passing apex_json.to_xmltype( j.document )
            columns
                id    varchar2(20)  path 'id/text()',
                mag   number        path 'properties/mag/text()',
                title varchar2(200) path 'properties/title/text()' ) e
    ), minmax as (
        select min(e.mag) minmag, max(e.mag) maxmag 
          from eqdata e
    )
    select e.id,
           e.title,
           e.mag
      from eqdata e, minmax m
     where e.mag in ( m.minmag, m.maxmag )
    

      xmltable示例

    SELECT * FROM XMLTABLE(
        '$B/DEAL_BASIC/USER_DEAL_INFO' 
        PASSING
            XMLTYPE('<?xml version="1.0" encoding="gb2312" ?>
                  <DEAL_BASIC>
                     <USER_DEAL_INFO>
                         <USER_DEAL_ID>1000100001</USER_DEAL_ID>
                         <DEAL_INURE_TIME>20081130</DEAL_INURE_TIME>
                         <DEAL_EXPIRE_TIME>30000101</DEAL_EXPIRE_TIME>
                         <DEAL_CREATE_TIME>20081130</DEAL_CREATE_TIME>
                     </USER_DEAL_INFO>
                     <USER_DEAL_INFO>
                         <USER_DEAL_ID>1000100002</USER_DEAL_ID>
                         <DEAL_INURE_TIME>20081131</DEAL_INURE_TIME>
                         <DEAL_EXPIRE_TIME>30000102</DEAL_EXPIRE_TIME>
                         <DEAL_CREATE_TIME>20081131</DEAL_CREATE_TIME>
                     </USER_DEAL_INFO>
                  </DEAL_BASIC>') AS B
        COLUMNS 
        USER_DEAL_ID VARCHAR2(50) PATH
        '/USER_DEAL_INFO/USER_DEAL_ID/text()',
        DEAL_INURE_TIME VARCHAR2(50) PATH
        '/USER_DEAL_INFO/DEAL_INURE_TIME',
        DEAL_EXPIRE_TIME VARCHAR2(50) PATH
        '/USER_DEAL_INFO/DEAL_EXPIRE_TIME',
        DEAL_CREATE_TIME VARCHAR2(50) PATH
        '/USER_DEAL_INFO/DEAL_CREATE_TIME')
    

      apex启用Apex在oracle 11g Release 2版本中是默认安装的。但安装后没有启用。可以使用下面方法启用它。

    --显示用户
    show user
    spool apex
    --查看安装的Apex详情。
    select * from dba_registry where comp_id = 'APEX';
    --
    @%oracle_home%RDBMSADMINepgstat.sql
    --查看HTTP所使用的port,其中0表示没有开启。
    select dbms_xdb.getHTTPPort from dual;
    --设置port。
    begin
      dbms_xdb.setHTTPPort(8080);
      commit;
    end;
    /
    --启用匿名帐号。
    ALTER USER ANONYMOUS ACCOUNT UNLOCK;
    --修改密码:admin/admin
    @%Oracle_home%apexapxchpwd.sql
    --修改访问权限:
    begin
      DBMS_XDB.SETLISTENERLOCALACCESS (FALSE);
    end;
    /
    --查看apex版本
    SELECT VERSION_NO FROM APEX_RELEASE;
    --通过下面链接访问Apex.
    https://localhost:8080/apex/apex_admin
    

      

    oracle自带函数

    Oracle 中使用正则表达式

  • 相关阅读:
    关于16位的OS尝试(2)
    关于16位的OS尝试(2)
    键盘幽灵程序源代码
    socks5协议转http协议源码
    溢出专题(二) widechar的字符串缓冲溢出攻击技术
    超强:bat写的exploit
    键盘幽灵程序源代码
    超强:bat写的exploit
    socks5协议转http协议源码
    高质量C /C编程指南第3章 命名法例
  • 原文地址:https://www.cnblogs.com/iupoint/p/11103168.html
Copyright © 2020-2023  润新知