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 中使用正则表达式

原文地址:https://www.cnblogs.com/iupoint/p/11103168.html