​[转载]---asynch descriptor resize排在TOP5事件解决一例

admin 发表了文章 • 0 个评论 • 72 次浏览 • 2018-05-05 10:18 • 来自相关话题

[转载]---asynch descriptor resize排在TOP5事件解决一例
一、本文说明:
   今天在看luocs的博客中看到一篇关于asynch descriptor resize事件的解决方案,虽然这个事件很少出现,但是对于学习Oracle的还是需要了解一下的。在这里属于转载,如果你想看原文可以点击友情链接中的Luocs。
二、转载内容:
   今天在帮开发同事解决问题的时候,从AWR报告里看出奇怪的地方,TOP 5事件里看到了较难看到的asynch descriptor resize事件。
   这是一台开发测试数据库,CentOS 5.5上跑着Oracle 11g 11.2.0.1。

   查了一下,系统参数设置和数据库参数:

复制代码
 1 [root@orcl ~]# more /etc/sysctl.conf | grep aio-max-nr
 2 fs.aio-max-nr = 1048576
 3 [root@orcl ~]# more /proc/sys/fs/aio-max-nr
 4 1048576
 5  
 6 SQL> show parameter async
 7  
 8 NAME_COL_PLUS_SHOW_PARAM       TYPE                   VALUE_COL_PLUS_SHOW_PARAM
 9 —————————— ———————- ——————————
10 disk_asynch_io                 boolean                TRUE
11 tape_asynch_io                 boolean                TRUE
复制代码
   猜想是不是BUG导致的?MOS搜索了一下,很快找到了Bug 9829397,Excessive CPU and many "asynch descriptor resize" waits for SQL using Async IO,此BUG发生于11.2.0.1和11.2.0.2上,11.2.0.3修复了此问题。 

   

     解决办法是:只要将disk_asynch_io设置为false来禁用异步I/O即可。

1 SQL> alter system set disk_asynch_io=false scope=spfile;
2  
3 System altered.
    以下为问题解决后的TOP事件: 查看全部

[转载]---asynch descriptor resize排在TOP5事件解决一例
一、本文说明:
   今天在看luocs的博客中看到一篇关于asynch descriptor resize事件的解决方案,虽然这个事件很少出现,但是对于学习Oracle的还是需要了解一下的。在这里属于转载,如果你想看原文可以点击友情链接中的Luocs。
二、转载内容:
   今天在帮开发同事解决问题的时候,从AWR报告里看出奇怪的地方,TOP 5事件里看到了较难看到的asynch descriptor resize事件。
   这是一台开发测试数据库,CentOS 5.5上跑着Oracle 11g 11.2.0.1。

   查了一下,系统参数设置和数据库参数:

复制代码
 1 [root@orcl ~]# more /etc/sysctl.conf | grep aio-max-nr
 2 fs.aio-max-nr = 1048576
 3 [root@orcl ~]# more /proc/sys/fs/aio-max-nr
 4 1048576
 5  
 6 SQL> show parameter async
 7  
 8 NAME_COL_PLUS_SHOW_PARAM       TYPE                   VALUE_COL_PLUS_SHOW_PARAM
 9 —————————— ———————- ——————————
10 disk_asynch_io                 boolean                TRUE
11 tape_asynch_io                 boolean                TRUE
复制代码
   猜想是不是BUG导致的?MOS搜索了一下,很快找到了Bug 9829397,Excessive CPU and many "asynch descriptor resize" waits for SQL using Async IO,此BUG发生于11.2.0.1和11.2.0.2上,11.2.0.3修复了此问题。 

   

     解决办法是:只要将disk_asynch_io设置为false来禁用异步I/O即可。

1 SQL> alter system set disk_asynch_io=false scope=spfile;
2  
3 System altered.
    以下为问题解决后的TOP事件:

Oracle日期格式转换

admin 发表了文章 • 0 个评论 • 67 次浏览 • 2018-05-01 10:34 • 来自相关话题

本文主要介绍Oracle中的日期转换。

 

1. 日期转化为字符串 (以2016年10月20日为例)

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')  strDateTime from dual;    --获取年-月-日 时:分:秒   
--显示结果为:2016-10-20 12:35:21

select to_char(sysdate,'yyyymmdd hh24:mi:ss')  strDateTime from dual;    --获取年月日 时:分:秒  
--显示结果为:20161020 13:39:25

select to_char(sysdate,'yyyymmdd')  strDateTime from dual;     --获取年月日 
--显示结果为:20161020

select to_char(sysdate,'yyyy')  strYear from dual;    --获取年  
 --显示结果为:2016

select to_char(sysdate,'mm')   strMonth  from dual;    --获取月  
--显示结果为:10

select to_char(sysdate,'dd')    strDay    from dual;     --获取日  
--显示结果为:20

select to_char(sysdate,'hh24')   strHour   from dual;     --获取时 
--显示结果为:13

select to_char(sysdate,'mi')  strMinute from dual;   --获取分  
--显示结果为:46

select to_char(sysdate,'ss')  strSecond from dual;   --获取秒
--显示结果为:43

 

2. 字符串和时间互转

select to_date('2010-10-20 13:23:44','yyyy-mm-dd hh24:mi:ss') dateTime from dual;
显示结果:2010/10/20 13:23:44

select to_date('2010-10-20 13:23:44','yyyy/mm/dd hh24:mi:ss') dateTime from dual;

显示结果:2010/10/20 13:23:44

select to_char( to_date(222,'J'),'Jsp') from dual;

显示结果:Two Hundred Twenty-Two

 

如果按照下面的例子写,会报错:ORA-01849:小时值必须介于1和12之间。(因为其中的hh是12进制,没有13所以报错)

select to_date('2005-12-25,13:25:59','yyyy-mm-dd,hh:mi:ss') from dual;

 

3. 查询某天是星期几

select to_char(to_date('2012-10-20','yyyy-mm-dd'),'day') strDay from dual; 
显示结果:星期六
     
select to_char(to_date('2012-10-20','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = English') strDay from dual;   
显示结果:saturday

 

4. 两个日期间的天数

 select floor(sysdate - to_date('20161010','yyyymmdd')) strTime from dual; 

--其中sysdate=2016/10/20 17:10:51
--显示结果:10

 

5. 时间为null的用法

select to_date(null) from dual;

 

6.月份差

select  months_between(date'2014-04-23',date'2013-04-23') days from dual; 查看全部

本文主要介绍Oracle中的日期转换。

 

1. 日期转化为字符串 (以2016年10月20日为例)

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')  strDateTime from dual;    --获取年-月-日 时:分:秒   
--显示结果为:2016-10-20 12:35:21

select to_char(sysdate,'yyyymmdd hh24:mi:ss')  strDateTime from dual;    --获取年月日 时:分:秒  
--显示结果为:20161020 13:39:25

select to_char(sysdate,'yyyymmdd')  strDateTime from dual;     --获取年月日 
--显示结果为:20161020

select to_char(sysdate,'yyyy')  strYear from dual;    --获取年  
 --显示结果为:2016

select to_char(sysdate,'mm')   strMonth  from dual;    --获取月  
--显示结果为:10

select to_char(sysdate,'dd')    strDay    from dual;     --获取日  
--显示结果为:20

select to_char(sysdate,'hh24')   strHour   from dual;     --获取时 
--显示结果为:13

select to_char(sysdate,'mi')  strMinute from dual;   --获取分  
--显示结果为:46

select to_char(sysdate,'ss')  strSecond from dual;   --获取秒
--显示结果为:43

 

2. 字符串和时间互转

select to_date('2010-10-20 13:23:44','yyyy-mm-dd hh24:mi:ss') dateTime from dual;
显示结果:2010/10/20 13:23:44

select to_date('2010-10-20 13:23:44','yyyy/mm/dd hh24:mi:ss') dateTime from dual;

显示结果:2010/10/20 13:23:44

select to_char( to_date(222,'J'),'Jsp') from dual;

显示结果:Two Hundred Twenty-Two

 

如果按照下面的例子写,会报错:ORA-01849:小时值必须介于1和12之间。(因为其中的hh是12进制,没有13所以报错)

select to_date('2005-12-25,13:25:59','yyyy-mm-dd,hh:mi:ss') from dual;

 

3. 查询某天是星期几

select to_char(to_date('2012-10-20','yyyy-mm-dd'),'day') strDay from dual; 
显示结果:星期六
     
select to_char(to_date('2012-10-20','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = English') strDay from dual;   
显示结果:saturday

 

4. 两个日期间的天数

 select floor(sysdate - to_date('20161010','yyyymmdd')) strTime from dual; 

--其中sysdate=2016/10/20 17:10:51
--显示结果:10

 

5. 时间为null的用法

select to_date(null) from dual;

 

6.月份差

select  months_between(date'2014-04-23',date'2013-04-23') days from dual;

Oracle常用日期函数

admin 发表了文章 • 0 个评论 • 62 次浏览 • 2018-05-01 10:33 • 来自相关话题

常用的时间格式掩码如下:
掩码元素       含义
YYYY          四位数年份 (如:2005)     year
YY              二位数年份(如  05) 
Q                  季度(1-4) 
MM            月份(01-12)      month
WW            年的星期数(1-53),其中第一星期为年的第一天至第七天 
W             月的星期数(1-5),其中第一星期为月的第一天至第七天 
DDD          年的日(1-366) 
DD             月的日(1-31)    
D              周的日(1-7),其中周日为1,周六为7    day
HH24        24小时制(0-23)     hour
MI            分钟(0-59)     minute
SS             秒(0-59)     second
SSSSS      自午夜之后的秒(0-86399)


两个很不错的函数,可以操作日期,也可以操作数值:
round(日期,'指定的日期掩码')      返回日期时间的四舍五入结果
指定的掩码不同则结果结果也不同
    year           以 7月1日分界线
    month        以16号为分界线
    day            以中午12点为分界线
    hh              以30分钟为分界线
    mi              以30秒为分界线

trunc(日期,'指定的日期掩码')        返回截断时间
    year           本年度的1月1日
    month        本月的1号
    
例子:(注意: day    d    dd 三者的区别)
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'year') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-1-1
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'month') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-6-1
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'mm') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-6-1
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'day') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-5-20
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'d') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-5-20
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'dd') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-5-17

SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'year') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-1-1
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'month') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-1
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'mm') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-1
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'day') from dual; 
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-13
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'d') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-13
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'dd') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-16


日期时间函数:
           add_months(日期,number)    指定日期推迟number个月
           last_day(日期)   指定日期当月的最后一天
           new_time(日期,时区简写)   调整时区
           next_day(日期,number)  number表示周几,星期日是1,指定number的日期(一周内或一周后)
           months_between(日期1,日期2)   日期1和日期2之间有几个月
           sysdate   系统当期那日期和时间
练习时的代码:

select to_number(to_char(last_day(add_months(to_date('20040406','yyyymmdd'),-1))+1,'yyyymmdd')) from dual;
 
TO_NUMBER(TO_CHAR(LAST_DAY(ADD
------------------------------
                      20040401


select to_number(to_char(last_day(to_date('20040406','yyyymmdd')),'yyyymmdd')) from dual;

TO_NUMBER(TO_CHAR(LAST_DAY(ADD
------------------------------
                      20040430


create or replace procedure p_hkb_date_insert is
  /*
  过程功能描述:日期插入表中
  */

  v_days number(10);
  v_date date;
  i      number(10);

begin

  begin
    --取得当月天数
    select to_number(to_char(last_day(sysdate), 'dd'))
      into v_days
      from dual;
    --select sysdate from dual; 当前日期
    --select last_day(sysdate) from dual;  月底日期
    --select last_day(add_months(sysdate, -1)) from dual;   上月底日期
    -- SELECT   to_char(last_day(SYSDATE),'dd')   days   FROM   dual;    当前月的天数
    --select last_day(add_months(sysdate,-1))+1 from dual; 当前月第一天
    --select to_number(to_char(sysdate,'yyyymmdd')) from dual;系统当前日期转换成如20070910格式:
  
  end;
  i := 1;
  begin
    select last_day(add_months(sysdate, -1)) into v_date from dual;
    while i <= v_days
    
     loop
      insert into hkb_date
      values
        (v_date + i,
         to_char(v_date + i, 'yyyymmdd'),
         to_number(to_char(v_date + i, 'yyyymmdd')));
      --insert into hkb_date
      --(float_date)
      -- values
      --(to_char(v_date + i, 'yyyymmdd'));
      -- insert into hkb_date
      --(number_date)
      -- values
      --(to_number(to_char(v_date + i, 'yyyymmdd')));
      i := i + 1;
    end loop;
  end;
end p_hkb_date_insert;


create table hkb_date_construct as select * from hkb_date where 1=2;  继承表字段

create table hkb_date_data as select * from hkb_date;  继承表记录 查看全部

常用的时间格式掩码如下:
掩码元素       含义
YYYY          四位数年份 (如:2005)     year
YY              二位数年份(如  05) 
Q                  季度(1-4) 
MM            月份(01-12)      month
WW            年的星期数(1-53),其中第一星期为年的第一天至第七天 
W             月的星期数(1-5),其中第一星期为月的第一天至第七天 
DDD          年的日(1-366) 
DD             月的日(1-31)    
D              周的日(1-7),其中周日为1,周六为7    day
HH24        24小时制(0-23)     hour
MI            分钟(0-59)     minute
SS             秒(0-59)     second
SSSSS      自午夜之后的秒(0-86399)


两个很不错的函数,可以操作日期,也可以操作数值:
round(日期,'指定的日期掩码')      返回日期时间的四舍五入结果
指定的掩码不同则结果结果也不同
    year           以 7月1日分界线
    month        以16号为分界线
    day            以中午12点为分界线
    hh              以30分钟为分界线
    mi              以30秒为分界线

trunc(日期,'指定的日期掩码')        返回截断时间
    year           本年度的1月1日
    month        本月的1号
    
例子:(注意: day    d    dd 三者的区别)
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'year') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-1-1
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'month') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-6-1
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'mm') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-6-1
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'day') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-5-20
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'d') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-5-20
 
SQL> select round(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'dd') from dual;
ROUND(TO_DATE('2007051616:31:4
------------------------------
2007-5-17

SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'year') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-1-1
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'month') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-1
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'mm') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-1
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'day') from dual; 
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-13
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'d') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-13
 
SQL> select trunc(to_date('20070516 16:31:46','yyyymmdd hh24:mi:ss'),'dd') from dual;
TRUNC(TO_DATE('2007051616:31:4
------------------------------
2007-5-16


日期时间函数:
           add_months(日期,number)    指定日期推迟number个月
           last_day(日期)   指定日期当月的最后一天
           new_time(日期,时区简写)   调整时区
           next_day(日期,number)  number表示周几,星期日是1,指定number的日期(一周内或一周后)
           months_between(日期1,日期2)   日期1和日期2之间有几个月
           sysdate   系统当期那日期和时间
练习时的代码:

select to_number(to_char(last_day(add_months(to_date('20040406','yyyymmdd'),-1))+1,'yyyymmdd')) from dual;
 
TO_NUMBER(TO_CHAR(LAST_DAY(ADD
------------------------------
                      20040401


select to_number(to_char(last_day(to_date('20040406','yyyymmdd')),'yyyymmdd')) from dual;

TO_NUMBER(TO_CHAR(LAST_DAY(ADD
------------------------------
                      20040430


create or replace procedure p_hkb_date_insert is
  /*
  过程功能描述:日期插入表中
  */

  v_days number(10);
  v_date date;
  i      number(10);

begin

  begin
    --取得当月天数
    select to_number(to_char(last_day(sysdate), 'dd'))
      into v_days
      from dual;
    --select sysdate from dual; 当前日期
    --select last_day(sysdate) from dual;  月底日期
    --select last_day(add_months(sysdate, -1)) from dual;   上月底日期
    -- SELECT   to_char(last_day(SYSDATE),'dd')   days   FROM   dual;    当前月的天数
    --select last_day(add_months(sysdate,-1))+1 from dual; 当前月第一天
    --select to_number(to_char(sysdate,'yyyymmdd')) from dual;系统当前日期转换成如20070910格式:
  
  end;
  i := 1;
  begin
    select last_day(add_months(sysdate, -1)) into v_date from dual;
    while i <= v_days
    
     loop
      insert into hkb_date
      values
        (v_date + i,
         to_char(v_date + i, 'yyyymmdd'),
         to_number(to_char(v_date + i, 'yyyymmdd')));
      --insert into hkb_date
      --(float_date)
      -- values
      --(to_char(v_date + i, 'yyyymmdd'));
      -- insert into hkb_date
      --(number_date)
      -- values
      --(to_number(to_char(v_date + i, 'yyyymmdd')));
      i := i + 1;
    end loop;
  end;
end p_hkb_date_insert;


create table hkb_date_construct as select * from hkb_date where 1=2;  继承表字段

create table hkb_date_data as select * from hkb_date;  继承表记录

oracle操作字符串:拼接、替换、截取、查找

admin 发表了文章 • 0 个评论 • 57 次浏览 • 2018-05-01 09:28 • 来自相关话题

1、拼接字符串

1)可以使用“||”来拼接字符串

1 select '拼接'||'字符串' as str from dual 
2)通过concat()函数实现

1 select concat('拼接', '字符串') as str from dual 
注:oracle的concat函数只支持两个参数的方法,即只能拼接两个参数,如要拼接多个参数则嵌套使用concat可实现,如:

1 select concat(concat('拼接', '多个'), '字符串') from dual 
2、截取字符串

SUBSTR(string,start_position,[length])    求子字符串,返回字符串
解释:string 源字符串
       start_position   开始位置(从0开始)
       length 可选项,子字符串的个数

1 select substr(to_char(sysdate, 'yyyy-mm-dd HH:mi:ss'), 12, 5) as time from dual 
1 substr("ABCDEFG", 0); //返回:ABCDEFG,截取所有字符 
2 substr("ABCDEFG", 2); //返回:CDEFG,截取从C开始之后所有字符 
3 substr("ABCDEFG", 0, 3); //返回:ABC,截取从A开始3个字符 
4 substr("ABCDEFG", 0, 100); //返回:ABCDEFG,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最大数量返回。 
5 substr("ABCDEFG", -3); //返回:EFG,注意参数-3,为负值时表示从尾部开始算起,字符串排列位置不变。
3、查找字符串

INSTR(string,subString,position,ocurrence)查找字符串位置

解释:string:源字符串
        subString:要查找的子字符串
        position:查找的开始位置
        ocurrence:源字符串中第几次出现的子字符串

1 select INSTR('CORPORATE FLOOR','OR', 3, 2) as loc from dual 
4、替换字符串

replace(strSource, str1, str2) 将strSource中的str1替换成str2

解析:strSource:源字符串

   str1: 要替换的字符串

  str2: 替换后的字符串

1 select '替换字符串' as oldStr, replace('替换字符串', '替换', '修改') as newStr from dual 查看全部
1、拼接字符串

1)可以使用“||”来拼接字符串

1 select '拼接'||'字符串' as str from dual 
2)通过concat()函数实现

1 select concat('拼接', '字符串') as str from dual 
注:oracle的concat函数只支持两个参数的方法,即只能拼接两个参数,如要拼接多个参数则嵌套使用concat可实现,如:

1 select concat(concat('拼接', '多个'), '字符串') from dual 
2、截取字符串

SUBSTR(string,start_position,[length])    求子字符串,返回字符串
解释:string 源字符串
       start_position   开始位置(从0开始)
       length 可选项,子字符串的个数

1 select substr(to_char(sysdate, 'yyyy-mm-dd HH:mi:ss'), 12, 5) as time from dual 
1 substr("ABCDEFG", 0); //返回:ABCDEFG,截取所有字符 
2 substr("ABCDEFG", 2); //返回:CDEFG,截取从C开始之后所有字符 
3 substr("ABCDEFG", 0, 3); //返回:ABC,截取从A开始3个字符 
4 substr("ABCDEFG", 0, 100); //返回:ABCDEFG,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最大数量返回。 
5 substr("ABCDEFG", -3); //返回:EFG,注意参数-3,为负值时表示从尾部开始算起,字符串排列位置不变。
3、查找字符串

INSTR(string,subString,position,ocurrence)查找字符串位置

解释:string:源字符串
        subString:要查找的子字符串
        position:查找的开始位置
        ocurrence:源字符串中第几次出现的子字符串

1 select INSTR('CORPORATE FLOOR','OR', 3, 2) as loc from dual 
4、替换字符串

replace(strSource, str1, str2) 将strSource中的str1替换成str2

解析:strSource:源字符串

   str1: 要替换的字符串

  str2: 替换后的字符串

1 select '替换字符串' as oldStr, replace('替换字符串', '替换', '修改') as newStr from dual

oracle里存储函数将金额数字转换成大写

admin 发表了文章 • 0 个评论 • 74 次浏览 • 2018-04-30 16:47 • 来自相关话题

CREATE OR REPLACE FUNCTION NUMBER_TO_CHINESE(P_NUM IN NUMBER DEFAULT NULL)  
  RETURN NVARCHAR2 IS  
  /*Ver:1.0 Created By xsb on 2003-8-18 For:  
  将金额数字(单位元)转换为大写(采用从低至高算法)  
  数字整数部分不得超过16位,可以是负数。  
  Ver:1.1 Modified By xsb on 2003-8-20 For:个位数处理也放在For循环中。  
  Ver:1.2 Modified By xsb on 2003-8-22 For:分后不带整字。  
  Ver:1.3 Modified By xsb on 2003-8-28 For:完善测试用例。  
  测试用例:  
  SET HEAD OFF  
  SET FEED OFF  
  select '无参数时='||NUMBER_TO_CHINESE() from dual;  
  select 'null='||NUMBER_TO_CHINESE(null) from dual;  
  select '0='||NUMBER_TO_CHINESE(0) from dual;  
  select '0.01='||NUMBER_TO_CHINESE(0.01) from dual;  
  select '0.126='||NUMBER_TO_CHINESE(0.126) from dual;  
  select '01.234='||NUMBER_TO_CHINESE(01.234) from dual;  
  select '10='||NUMBER_TO_CHINESE(10) from dual;  
  select '100.1='||NUMBER_TO_CHINESE(100.1) from dual;  
  select '100.01='||NUMBER_TO_CHINESE(100.01) from dual;  
  select '10000='||NUMBER_TO_CHINESE(10000) from dual;  
  select '10012.12='||NUMBER_TO_CHINESE(10012.12) from dual;  
  select '20000020.01='||NUMBER_TO_CHINESE(20000020.01) from dual;  
  select '3040506708.901='||NUMBER_TO_CHINESE(3040506708.901) from dual;  
  select '40005006078.001='||NUMBER_TO_CHINESE(40005006078.001) from dual;  
  select '-123456789.98='||NUMBER_TO_CHINESE(-123456789.98) from dual;  
  select '123456789123456789.89='||NUMBER_TO_CHINESE(123456789123456789.89) from dual;  
  test  
  */  
  RESULT      NVARCHAR2(100); --返回字符串  
  NUM_ROUND   NVARCHAR2(100) := TO_CHAR(ABS(ROUND(P_NUM, 2))); --转换数字为小数点后2位的字符(正数)  
  NUM_LEFT    NVARCHAR2(100); --小数点左边的数字  
  NUM_RIGHT   NVARCHAR2(2); --小数点右边的数字  
  STR1        NCHAR(10) := '零壹贰叁肆伍陆柒捌玖'; --数字大写  
  STR2        NCHAR(16) := '元拾佰仟万拾佰仟亿拾佰仟万拾佰仟'; --数字位数(从低至高)  
  NUM_PRE     NUMBER(1) := 1; --前一位上的数字  
  NUM_CURRENT NUMBER(1); --当前位上的数字  
  NUM_COUNT   NUMBER := 0; --当前数字位数  
  NUM1        NUMBER;  
  
BEGIN  
  IF P_NUM IS NULL THEN  
    RETURN NULL;  
  END IF; --转换数字为null时返回null  
  
  SELECT TO_CHAR(NVL(SUBSTR(TO_CHAR(NUM_ROUND),  
                            1,  
                            DECODE(INSTR(TO_CHAR(NUM_ROUND), '.'),  
                                   0,  
                                   LENGTH(NUM_ROUND),  
                                   INSTR(TO_CHAR(NUM_ROUND), '.') - 1)),  
                     0))  
    INTO NUM_LEFT  
    FROM DUAL; --取得小数点左边的数字  
  SELECT SUBSTR(TO_CHAR(NUM_ROUND),  
                DECODE(INSTR(TO_CHAR(NUM_ROUND), '.'),  
                       0,  
                       LENGTH(NUM_ROUND) + 1,  
                       INSTR(TO_CHAR(NUM_ROUND), '.') + 1),  
                2)  
    INTO NUM_RIGHT  
    FROM DUAL; --取得小数点右边的数字  
  SELECT CASE  
           WHEN LENGTH(NUM_LEFT) >= 8 THEN  
            TO_NUMBER(SUBSTR(TO_CHAR(NUM_LEFT), -8, 4))  
           ELSE  
            TO_NUMBER(SUBSTR(TO_CHAR(NUM_LEFT),  
                             -LENGTH(NUM_LEFT),  
                             LENGTH(NUM_LEFT) - 4))  
         END  
    INTO NUM1  
    FROM DUAL; ---取得千、百、十、万位上的数字  
  IF LENGTH(NUM_LEFT) > 16 THEN  
    RETURN '**********';  
  END IF; --数字整数部分超过16位时  
  
  --采用从低至高的算法,先处理小数点右边的数字  
  IF LENGTH(NUM_RIGHT) = 2 THEN  
    IF TO_NUMBER(SUBSTR(NUM_RIGHT, 1, 1)) = 0 THEN  
      RESULT := '零' ||  
                SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 2, 1)) + 1, 1) || '分';  
    ELSE  
      RESULT := SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 1, 1)) + 1, 1) || '角' ||  
                SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 2, 1)) + 1, 1) || '分';  
    END IF;  
  ELSIF LENGTH(NUM_RIGHT) = 1 THEN  
    RESULT := SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 1, 1)) + 1, 1) || '角整';  
  ELSE  
    RESULT := '整';  
  END IF;  
  --再处理小数点左边的数字  
  FOR I IN REVERSE 1 .. LENGTH(NUM_LEFT) LOOP  
    --(从低至高)  
    NUM_COUNT   := NUM_COUNT + 1; --当前数字位数  
    NUM_CURRENT := TO_NUMBER(SUBSTR(NUM_LEFT, I, 1)); --当前位上的数字  
    IF NUM_CURRENT > 0 THEN  
      --当前位上数字不为0按正常处理  
      RESULT := SUBSTR(STR1, NUM_CURRENT + 1, 1) ||  
                SUBSTR(STR2, NUM_COUNT, 1) || RESULT;  
    ELSE  
      --当前位上数字为0时  
      IF NUM_COUNT = 5 THEN  
        IF MOD(NUM_COUNT - 1, 4) = 0 AND NUM1 <> 0 THEN  
          RESULT  := SUBSTR(STR2, NUM_COUNT, 1) || RESULT;  
          NUM_PRE := 0; --元、万,亿前不准加零 --当前位是元、万或亿时  
        END IF;  
      ELSE  
        IF MOD(NUM_COUNT - 1, 4) = 0 THEN  
          RESULT  := SUBSTR(STR2, NUM_COUNT, 1) || RESULT;  
          NUM_PRE := 0; --元、万,亿前不准加零  
        END IF;  
      END IF;  
      IF NUM_PRE > 0 OR LENGTH(NUM_LEFT) = 1 THEN  
        --上一位数字不为0或只有个位时  
        RESULT := SUBSTR(STR1, NUM_CURRENT + 1, 1) || RESULT;  
      END IF;  
    END IF;  
    NUM_PRE := NUM_CURRENT;  
  END LOOP;  
  
  IF P_NUM < 0 THEN  
    --转换数字是负数时  
    RESULT := '负' || RESULT;  
  END IF;  
  
  RETURN RESULT;  
  
EXCEPTION  
  WHEN OTHERS THEN  
    RAISE_APPLICATION_ERROR(-20001, '数字转换大写出现错误!' || SQLERRM);  
END;   查看全部
CREATE OR REPLACE FUNCTION NUMBER_TO_CHINESE(P_NUM IN NUMBER DEFAULT NULL)  
  RETURN NVARCHAR2 IS  
  /*Ver:1.0 Created By xsb on 2003-8-18 For:  
  将金额数字(单位元)转换为大写(采用从低至高算法)  
  数字整数部分不得超过16位,可以是负数。  
  Ver:1.1 Modified By xsb on 2003-8-20 For:个位数处理也放在For循环中。  
  Ver:1.2 Modified By xsb on 2003-8-22 For:分后不带整字。  
  Ver:1.3 Modified By xsb on 2003-8-28 For:完善测试用例。  
  测试用例:  
  SET HEAD OFF  
  SET FEED OFF  
  select '无参数时='||NUMBER_TO_CHINESE() from dual;  
  select 'null='||NUMBER_TO_CHINESE(null) from dual;  
  select '0='||NUMBER_TO_CHINESE(0) from dual;  
  select '0.01='||NUMBER_TO_CHINESE(0.01) from dual;  
  select '0.126='||NUMBER_TO_CHINESE(0.126) from dual;  
  select '01.234='||NUMBER_TO_CHINESE(01.234) from dual;  
  select '10='||NUMBER_TO_CHINESE(10) from dual;  
  select '100.1='||NUMBER_TO_CHINESE(100.1) from dual;  
  select '100.01='||NUMBER_TO_CHINESE(100.01) from dual;  
  select '10000='||NUMBER_TO_CHINESE(10000) from dual;  
  select '10012.12='||NUMBER_TO_CHINESE(10012.12) from dual;  
  select '20000020.01='||NUMBER_TO_CHINESE(20000020.01) from dual;  
  select '3040506708.901='||NUMBER_TO_CHINESE(3040506708.901) from dual;  
  select '40005006078.001='||NUMBER_TO_CHINESE(40005006078.001) from dual;  
  select '-123456789.98='||NUMBER_TO_CHINESE(-123456789.98) from dual;  
  select '123456789123456789.89='||NUMBER_TO_CHINESE(123456789123456789.89) from dual;  
  test  
  */  
  RESULT      NVARCHAR2(100); --返回字符串  
  NUM_ROUND   NVARCHAR2(100) := TO_CHAR(ABS(ROUND(P_NUM, 2))); --转换数字为小数点后2位的字符(正数)  
  NUM_LEFT    NVARCHAR2(100); --小数点左边的数字  
  NUM_RIGHT   NVARCHAR2(2); --小数点右边的数字  
  STR1        NCHAR(10) := '零壹贰叁肆伍陆柒捌玖'; --数字大写  
  STR2        NCHAR(16) := '元拾佰仟万拾佰仟亿拾佰仟万拾佰仟'; --数字位数(从低至高)  
  NUM_PRE     NUMBER(1) := 1; --前一位上的数字  
  NUM_CURRENT NUMBER(1); --当前位上的数字  
  NUM_COUNT   NUMBER := 0; --当前数字位数  
  NUM1        NUMBER;  
  
BEGIN  
  IF P_NUM IS NULL THEN  
    RETURN NULL;  
  END IF; --转换数字为null时返回null  
  
  SELECT TO_CHAR(NVL(SUBSTR(TO_CHAR(NUM_ROUND),  
                            1,  
                            DECODE(INSTR(TO_CHAR(NUM_ROUND), '.'),  
                                   0,  
                                   LENGTH(NUM_ROUND),  
                                   INSTR(TO_CHAR(NUM_ROUND), '.') - 1)),  
                     0))  
    INTO NUM_LEFT  
    FROM DUAL; --取得小数点左边的数字  
  SELECT SUBSTR(TO_CHAR(NUM_ROUND),  
                DECODE(INSTR(TO_CHAR(NUM_ROUND), '.'),  
                       0,  
                       LENGTH(NUM_ROUND) + 1,  
                       INSTR(TO_CHAR(NUM_ROUND), '.') + 1),  
                2)  
    INTO NUM_RIGHT  
    FROM DUAL; --取得小数点右边的数字  
  SELECT CASE  
           WHEN LENGTH(NUM_LEFT) >= 8 THEN  
            TO_NUMBER(SUBSTR(TO_CHAR(NUM_LEFT), -8, 4))  
           ELSE  
            TO_NUMBER(SUBSTR(TO_CHAR(NUM_LEFT),  
                             -LENGTH(NUM_LEFT),  
                             LENGTH(NUM_LEFT) - 4))  
         END  
    INTO NUM1  
    FROM DUAL; ---取得千、百、十、万位上的数字  
  IF LENGTH(NUM_LEFT) > 16 THEN  
    RETURN '**********';  
  END IF; --数字整数部分超过16位时  
  
  --采用从低至高的算法,先处理小数点右边的数字  
  IF LENGTH(NUM_RIGHT) = 2 THEN  
    IF TO_NUMBER(SUBSTR(NUM_RIGHT, 1, 1)) = 0 THEN  
      RESULT := '零' ||  
                SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 2, 1)) + 1, 1) || '分';  
    ELSE  
      RESULT := SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 1, 1)) + 1, 1) || '角' ||  
                SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 2, 1)) + 1, 1) || '分';  
    END IF;  
  ELSIF LENGTH(NUM_RIGHT) = 1 THEN  
    RESULT := SUBSTR(STR1, TO_NUMBER(SUBSTR(NUM_RIGHT, 1, 1)) + 1, 1) || '角整';  
  ELSE  
    RESULT := '整';  
  END IF;  
  --再处理小数点左边的数字  
  FOR I IN REVERSE 1 .. LENGTH(NUM_LEFT) LOOP  
    --(从低至高)  
    NUM_COUNT   := NUM_COUNT + 1; --当前数字位数  
    NUM_CURRENT := TO_NUMBER(SUBSTR(NUM_LEFT, I, 1)); --当前位上的数字  
    IF NUM_CURRENT > 0 THEN  
      --当前位上数字不为0按正常处理  
      RESULT := SUBSTR(STR1, NUM_CURRENT + 1, 1) ||  
                SUBSTR(STR2, NUM_COUNT, 1) || RESULT;  
    ELSE  
      --当前位上数字为0时  
      IF NUM_COUNT = 5 THEN  
        IF MOD(NUM_COUNT - 1, 4) = 0 AND NUM1 <> 0 THEN  
          RESULT  := SUBSTR(STR2, NUM_COUNT, 1) || RESULT;  
          NUM_PRE := 0; --元、万,亿前不准加零 --当前位是元、万或亿时  
        END IF;  
      ELSE  
        IF MOD(NUM_COUNT - 1, 4) = 0 THEN  
          RESULT  := SUBSTR(STR2, NUM_COUNT, 1) || RESULT;  
          NUM_PRE := 0; --元、万,亿前不准加零  
        END IF;  
      END IF;  
      IF NUM_PRE > 0 OR LENGTH(NUM_LEFT) = 1 THEN  
        --上一位数字不为0或只有个位时  
        RESULT := SUBSTR(STR1, NUM_CURRENT + 1, 1) || RESULT;  
      END IF;  
    END IF;  
    NUM_PRE := NUM_CURRENT;  
  END LOOP;  
  
  IF P_NUM < 0 THEN  
    --转换数字是负数时  
    RESULT := '负' || RESULT;  
  END IF;  
  
  RETURN RESULT;  
  
EXCEPTION  
  WHEN OTHERS THEN  
    RAISE_APPLICATION_ERROR(-20001, '数字转换大写出现错误!' || SQLERRM);  
END;  

oracle拆分逗号分隔字符串 实现split

admin 发表了文章 • 0 个评论 • 65 次浏览 • 2018-04-30 12:02 • 来自相关话题

一个字符串中有像逗号或其它符号分隔,你想把它折分成列,如’first field, second field , third field’,
拆成

first field
second field
third field

第一种 用10G开始支持的正则表达式

anbob@ANBOB>SELECT REGEXP_SUBSTR ('first field, second field , third field', '[^,]+', 1,rownum)
  2  FROM DUAL
  3  CONNECT BY ROWNUM <=
  4  LENGTH ('first field, second field , third field') - LENGTH (REPLACE ('first field, second field , third field', ',', ''))+1;

REGEXP_SUBSTR('FIRSTFIELD,SECONDFIELD,THIRDFIELD','[^,]+',1,ROWNUM)
------------------------------------------------------------------------------
first field
second field
third field
TIP:
REGEXP_SUBSTR 函数是把那个串以正则不是以,(逗号)开头的截取,第二个参数是取第几组,rownum伪列序号,connect 循环 ,循环次数为串总长度-去除分隔符后=几个分隔符 +1

第二种用type,function

第一,先创建一个Type

CREATE OR REPLACE TYPE type_split IS TABLE OF VARCHAR2 (4000)
第二,创建函数

create or replace function split(p_list varchar2,p_sep varchar2 := ’,’)
return type_split pipelined
IS
l_idx pls_integer;
v_list varchar2(50) := p_list;
begin
 loop
   l_idx := instr(v_list,p_sep);
   if l_idx = 0 then
     pipe row(substr(v_list,1,l_idx-1));
     v_list := substr(v_list,l_idx+length(p_sep));
   else
     pipe row(v_list);
    exit;
   end if;
  end loop;
end split;
第三,调试

select * from table(split(‘aaa,bbb,ccc’,',’));

拆分列字段

anbob@ANBOB>select * from test11;

                  ID NAME
-------------------- ----------
                   1 a,b,c
                   2 e,d

nbob@ANBOB>with temp0 as (select LEVEL lv from dual CONNECT BY LEVEL <= 100)  
  2       select id,substr(t.vals,instr(t.vals, ',', 1, tv.lv) + 1,  
  3                          instr(t.vals, ',', 1, tv.lv + 1) -(  
  4                          instr(t.vals, ',', 1, tv.lv) + 1)  
  5                   ) AS name  
  6       from (select id,',' || name || ',' AS vals,  
  7                  length(name || ',') - nvl(length(REPLACE(name, ',')), 0) AS cnt  
  8             from test11) t join temp0 tv  
  9                       on  tv.lv <= t.cnt  order by 1;

                  ID NAME
-------------------- ------------------------
                   1 a
                   1 b
                   1 c
                   2 d
                   2 e
扩展 regexp_replace

V字段中每个值中字符串以,分隔,如果不是以9开头那组串加‘00’

anbob@NCME>create table testreg(v varchar2(80));
Table created.
anbob@NCME>insert into testreg values(’911,000,12,31′);
1 row created.

anbob@NCME>insert into testreg values(’11911,554000,312,931′);
1 row created.

anbob@NCME>commit;
Commit complete.

anbob@NCME>select ltrim(regexp_replace(‘,’||v,’([,])’,'\100′),’,') newv,v from testreg;

NEWV V
—————————— ——————————
00911,00000,0012,0031 911,000,12,31
0011911,00554000,00312,00931 11911,554000,312,931 查看全部
一个字符串中有像逗号或其它符号分隔,你想把它折分成列,如’first field, second field , third field’,
拆成

first field
second field
third field

第一种 用10G开始支持的正则表达式

anbob@ANBOB>SELECT REGEXP_SUBSTR ('first field, second field , third field', '[^,]+', 1,rownum)
  2  FROM DUAL
  3  CONNECT BY ROWNUM <=
  4  LENGTH ('first field, second field , third field') - LENGTH (REPLACE ('first field, second field , third field', ',', ''))+1;

REGEXP_SUBSTR('FIRSTFIELD,SECONDFIELD,THIRDFIELD','[^,]+',1,ROWNUM)
------------------------------------------------------------------------------
first field
second field
third field
TIP:
REGEXP_SUBSTR 函数是把那个串以正则不是以,(逗号)开头的截取,第二个参数是取第几组,rownum伪列序号,connect 循环 ,循环次数为串总长度-去除分隔符后=几个分隔符 +1

第二种用type,function

第一,先创建一个Type

CREATE OR REPLACE TYPE type_split IS TABLE OF VARCHAR2 (4000)
第二,创建函数

create or replace function split(p_list varchar2,p_sep varchar2 := ’,’)
return type_split pipelined
IS
l_idx pls_integer;
v_list varchar2(50) := p_list;
begin
 loop
   l_idx := instr(v_list,p_sep);
   if l_idx = 0 then
     pipe row(substr(v_list,1,l_idx-1));
     v_list := substr(v_list,l_idx+length(p_sep));
   else
     pipe row(v_list);
    exit;
   end if;
  end loop;
end split;
第三,调试

select * from table(split(‘aaa,bbb,ccc’,',’));

拆分列字段

anbob@ANBOB>select * from test11;

                  ID NAME
-------------------- ----------
                   1 a,b,c
                   2 e,d

nbob@ANBOB>with temp0 as (select LEVEL lv from dual CONNECT BY LEVEL <= 100)  
  2       select id,substr(t.vals,instr(t.vals, ',', 1, tv.lv) + 1,  
  3                          instr(t.vals, ',', 1, tv.lv + 1) -(  
  4                          instr(t.vals, ',', 1, tv.lv) + 1)  
  5                   ) AS name  
  6       from (select id,',' || name || ',' AS vals,  
  7                  length(name || ',') - nvl(length(REPLACE(name, ',')), 0) AS cnt  
  8             from test11) t join temp0 tv  
  9                       on  tv.lv <= t.cnt  order by 1;

                  ID NAME
-------------------- ------------------------
                   1 a
                   1 b
                   1 c
                   2 d
                   2 e
扩展 regexp_replace

V字段中每个值中字符串以,分隔,如果不是以9开头那组串加‘00’

anbob@NCME>create table testreg(v varchar2(80));
Table created.
anbob@NCME>insert into testreg values(’911,000,12,31′);
1 row created.

anbob@NCME>insert into testreg values(’11911,554000,312,931′);
1 row created.

anbob@NCME>commit;
Commit complete.

anbob@NCME>select ltrim(regexp_replace(‘,’||v,’([,])’,'\100′),’,') newv,v from testreg;

NEWV V
—————————— ——————————
00911,00000,0012,0031 911,000,12,31
0011911,00554000,00312,00931 11911,554000,312,931

windows账号禁止本地登录

回复

admin 发起了问题 • 1 人关注 • 0 个回复 • 88 次浏览 • 2018-04-30 10:55 • 来自相关话题

局域网共享的实现

admin 发表了文章 • 0 个评论 • 64 次浏览 • 2018-04-30 09:48 • 来自相关话题

在局域网内其他运行Windows操作系统的计算机上,可以通过网上邻居实现文件和磁盘的远程共享。
 通常情况下,只要计算机连接至局域网络,并配置了正确的IP地址信息,那么,Windows只需运行片刻,即可发现网络中所有的工作组和计算机。
对于Windows Me、Windows 2000和Windows XP而言,更是可以直接发现网络中可供共享的文件夹,并将之显示在Windows资源管理器的网络邻居中。
用户可做的,只是双击并打开自己感兴趣的文件夹而已。 注意:如果在网上邻居中无法找到欲共享资源的计算机,可利用查找计算机的方式,利用该计算机的名称查找该计算机。另外,实现共享的计算机之间应当使用同一网段的IP地址,否则,彼此之间将无法找到。
 SMB(Server Message Block)协议在NT/2000中用来作文件共享,在NT中,SMB运行于NBT(NetBIOS over TCP/IP)上,使用137,139(UDP),139(TCP)端口。在2000中,SMB可以直接运行在tcp/ip上,而没有额外的NBT层,使用TCP 445端口。 当2000使用网络共享的时候,就面临着选择139或者445端口了。
 下面的情况确定会话使用的端口:
 1、如果客户端启用了NBT,那么连接的时候将同时访问139和445端口,如果从445端口得到回应,那么客户端将发送RST到139端口,终止这个端口的连接,接着就从445端口进行SMB的会话了;如果没有从445端口而是从139得到回应,那么就从139端口进行会话;如果没有得到任何回应,那么SMB会话失败。 
2、如果客户端禁用了NBT,他就将只从445端口进行连接。当然如果服务器(开共享端)没有445端口进行SMB会话的话,那么就会访问失败了,所以禁用445端口后,对访问NT机器的共享会失败。 
3、如果服务器端启用NBT,那么就同时监听UDP 137、138端口和TCP139,445。如果禁用NBT,那么就只监听445端口了。
  查看全部
在局域网内其他运行Windows操作系统的计算机上,可以通过网上邻居实现文件和磁盘的远程共享。
 通常情况下,只要计算机连接至局域网络,并配置了正确的IP地址信息,那么,Windows只需运行片刻,即可发现网络中所有的工作组和计算机。
对于Windows Me、Windows 2000和Windows XP而言,更是可以直接发现网络中可供共享的文件夹,并将之显示在Windows资源管理器的网络邻居中。
用户可做的,只是双击并打开自己感兴趣的文件夹而已。 注意:如果在网上邻居中无法找到欲共享资源的计算机,可利用查找计算机的方式,利用该计算机的名称查找该计算机。另外,实现共享的计算机之间应当使用同一网段的IP地址,否则,彼此之间将无法找到。
 SMB(Server Message Block)协议在NT/2000中用来作文件共享,在NT中,SMB运行于NBT(NetBIOS over TCP/IP)上,使用137,139(UDP),139(TCP)端口。在2000中,SMB可以直接运行在tcp/ip上,而没有额外的NBT层,使用TCP 445端口。 当2000使用网络共享的时候,就面临着选择139或者445端口了。
 下面的情况确定会话使用的端口:
 1、如果客户端启用了NBT,那么连接的时候将同时访问139和445端口,如果从445端口得到回应,那么客户端将发送RST到139端口,终止这个端口的连接,接着就从445端口进行SMB的会话了;如果没有从445端口而是从139得到回应,那么就从139端口进行会话;如果没有得到任何回应,那么SMB会话失败。 
2、如果客户端禁用了NBT,他就将只从445端口进行连接。当然如果服务器(开共享端)没有445端口进行SMB会话的话,那么就会访问失败了,所以禁用445端口后,对访问NT机器的共享会失败。 
3、如果服务器端启用NBT,那么就同时监听UDP 137、138端口和TCP139,445。如果禁用NBT,那么就只监听445端口了。
 

修改远程桌面端口

admin 发表了文章 • 0 个评论 • 73 次浏览 • 2018-04-30 08:28 • 来自相关话题

如果打开了防火墙,先在入站规则里加上你要修改成的端口,如56789
1、打开注册表 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp],修改右边PortNamber的值,其默认值是3389,修改成所希望的端口即可,例如56789
2、再打开注册表 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro1Set\Control\Tenninal Server\WinStations\RDP-Tcp],修改右边PortNamber的值,其默认值是3389,修改成所希望的端口即可,例如56789
也可以搜索注册表 CTRL+F ,PortNamber,把3389改成56789
修改完后需要重启生效,注意防火墙的问题! 查看全部
如果打开了防火墙,先在入站规则里加上你要修改成的端口,如56789
1、打开注册表 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp],修改右边PortNamber的值,其默认值是3389,修改成所希望的端口即可,例如56789
2、再打开注册表 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro1Set\Control\Tenninal Server\WinStations\RDP-Tcp],修改右边PortNamber的值,其默认值是3389,修改成所希望的端口即可,例如56789
也可以搜索注册表 CTRL+F ,PortNamber,把3389改成56789
修改完后需要重启生效,注意防火墙的问题!

Oracle 查看表空间的大小及使用情况sql语句

admin 发表了文章 • 0 个评论 • 60 次浏览 • 2018-04-29 11:46 • 来自相关话题

1、查看表空间的名称及大小 
SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size 
FROM dba_tablespaces t, dba_data_files d 
WHERE t.tablespace_name = d.tablespace_name 
GROUP BY t.tablespace_name; 
--2、查看表空间物理文件的名称及大小 
SELECT tablespace_name, 
file_id, 
file_name, 
round(bytes / (1024 * 1024), 0) total_space 
FROM dba_data_files 
ORDER BY tablespace_name; 
--3、查看回滚段名称及大小 
SELECT segment_name, 
tablespace_name, 
r.status, 
(initial_extent / 1024) initialextent, 
(next_extent / 1024) nextextent, 
max_extents, 
v.curext curextent 
FROM dba_rollback_segs r, v$rollstat v 
WHERE r.segment_id = v.usn(+) 
ORDER BY segment_name; 
--4、查看控制文件 
SELECT NAME FROM v$controlfile; 
--5、查看日志文件 
SELECT MEMBER FROM v$logfile; 
--6、查看表空间的使用情况 
SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name 
FROM dba_free_space 
GROUP BY tablespace_name; 
SELECT a.tablespace_name, 
a.bytes total, 
b.bytes used, 
c.bytes free, 
(b.bytes * 100) / a.bytes "% USED ", 
(c.bytes * 100) / a.bytes "% FREE " 
FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c 
WHERE a.tablespace_name = b.tablespace_name 
AND a.tablespace_name = c.tablespace_name; 
--7、查看数据库库对象 
SELECT owner, object_type, status, COUNT(*) count# 
FROM all_objects 
GROUP BY owner, object_type, status; 
--8、查看数据库的版本  
SELECT version 
FROM product_component_version 
WHERE substr(product, 1, 6) = 'Oracle'; 
--9、查看数据库的创建日期和归档方式 
SELECT created, log_mode, log_mode FROM v$database; 
--1G=1024MB 
--1M=1024KB 
--1K=1024Bytes 
--1M=11048576Bytes 
--1G=1024*11048576Bytes=11313741824Bytes 
SELECT a.tablespace_name "表空间名", 
total "表空间大小", 
free "表空间剩余大小", 
(total - free) "表空间使用大小", 
total / (1024 * 1024 * 1024) "表空间大小(G)", 
free / (1024 * 1024 * 1024) "表空间剩余大小(G)", 
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)", 
round((total - free) / total, 4) * 100 "使用率 %" 
FROM (SELECT tablespace_name, SUM(bytes) free 
FROM dba_free_space 
GROUP BY tablespace_name) a, 
(SELECT tablespace_name, SUM(bytes) total 
FROM dba_data_files 
GROUP BY tablespace_name) b 
WHERE a.tablespace_name = b.tablespace_name 
  查看全部
1、查看表空间的名称及大小 
SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size 
FROM dba_tablespaces t, dba_data_files d 
WHERE t.tablespace_name = d.tablespace_name 
GROUP BY t.tablespace_name; 
--2、查看表空间物理文件的名称及大小 
SELECT tablespace_name, 
file_id, 
file_name, 
round(bytes / (1024 * 1024), 0) total_space 
FROM dba_data_files 
ORDER BY tablespace_name; 
--3、查看回滚段名称及大小 
SELECT segment_name, 
tablespace_name, 
r.status, 
(initial_extent / 1024) initialextent, 
(next_extent / 1024) nextextent, 
max_extents, 
v.curext curextent 
FROM dba_rollback_segs r, v$rollstat v 
WHERE r.segment_id = v.usn(+) 
ORDER BY segment_name; 
--4、查看控制文件 
SELECT NAME FROM v$controlfile; 
--5、查看日志文件 
SELECT MEMBER FROM v$logfile; 
--6、查看表空间的使用情况 
SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name 
FROM dba_free_space 
GROUP BY tablespace_name; 
SELECT a.tablespace_name, 
a.bytes total, 
b.bytes used, 
c.bytes free, 
(b.bytes * 100) / a.bytes "% USED ", 
(c.bytes * 100) / a.bytes "% FREE " 
FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c 
WHERE a.tablespace_name = b.tablespace_name 
AND a.tablespace_name = c.tablespace_name; 
--7、查看数据库库对象 
SELECT owner, object_type, status, COUNT(*) count# 
FROM all_objects 
GROUP BY owner, object_type, status; 
--8、查看数据库的版本  
SELECT version 
FROM product_component_version 
WHERE substr(product, 1, 6) = 'Oracle'; 
--9、查看数据库的创建日期和归档方式 
SELECT created, log_mode, log_mode FROM v$database; 
--1G=1024MB 
--1M=1024KB 
--1K=1024Bytes 
--1M=11048576Bytes 
--1G=1024*11048576Bytes=11313741824Bytes 
SELECT a.tablespace_name "表空间名", 
total "表空间大小", 
free "表空间剩余大小", 
(total - free) "表空间使用大小", 
total / (1024 * 1024 * 1024) "表空间大小(G)", 
free / (1024 * 1024 * 1024) "表空间剩余大小(G)", 
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)", 
round((total - free) / total, 4) * 100 "使用率 %" 
FROM (SELECT tablespace_name, SUM(bytes) free 
FROM dba_free_space 
GROUP BY tablespace_name) a, 
(SELECT tablespace_name, SUM(bytes) total 
FROM dba_data_files 
GROUP BY tablespace_name) b 
WHERE a.tablespace_name = b.tablespace_name