华为云空间在哪里找

华为云空间可以在文件管理中找到,具体的操作步骤如下:

1、这里以华为p10 plus手机为例,先打开手机上的【实用工具】。

2、进入到手机的实用工具以后,接着点击【文件管理】。

3、进入到文件管理页面以后,接着点击左边的【云空间】。

4、*后进入到云空间页面以后,就可以对云存储空间进行管理了,如果云存储空间不够的话就可以选择【升级云存储空间】。

华为技术有限公司是一家生产销售通信设备的民营通信科技公司,主要创始人任正非,成立于1987年,总部位于深圳。1996年华为开始进入大独联体市场;1998年将市场拓展到中国主要城市并把触角探向欧美;2003年与3Com合作成立合资公司;2010年首次入围《财富》世界500强企业排名;2016年8月,位居“2016中国民营企业500强”榜单榜首。

华为技术有限公司总部位于中国广东省深圳市龙岗区坂田华为基地。华为于1987年在中国深圳正式注册成立。2007年合同销售额160亿美元,其中海外销售额115亿美元,并且是当年中国国内电子行业营利和纳税*。截至到2008年底,华为在国际市场上覆盖100多个国家和地区,全球排名前50名的电信运营商中,已有45家使用华为的产品和服务。华为的产品和解决方案已经应用于全球150多个国家,服务全球运营商50强中的45家及全球1/3的人口。

linux之RAID知识的总结

RAID的简单介绍

RAID是Redundant Array of Inexpensive 的缩成,称为廉价冗余磁盘阵列。原理是利用数组方式来做磁盘组,配合数据分散排列的设计,提升数据的安全性。其中磁盘阵列是有很多便宜、容量较小、稳定性较高、速度较慢的磁盘组合成一个大型的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能

目前RAID技术大致分为两种:基于硬件的RAID技术的硬RAID和基于软件RAID技术的软RAID.

软件RAID:是指通过网络操作系统自身提供的磁盘管理功能将连接的普通SCSI卡上的多块硬盘配置成逻辑盘,组成raid阵列。

硬件RAID:是在服务器的bos界面进行RAID级别的配置,然后内核通过RAID适配器把RAID识别为sd接口的硬盘。

RAID 级别的介绍

随着RAID技术经过不断的发展,现已有RAID 0 到 RAID 6 七种基本的RAID 级别,同时还有RAID 0和RAID 1的组合形式,称为RAID10。其中的级别并不代表技术的高低。接下来就简单介绍一下RAID级别的组合方式和特性。

1、         RAID0

%title插图%num

RAID 0连续以位或字节为单位分割数据,并行读/写于多个磁盘上(如上图),因此具有很高的数据传输率,但它没有数据冗余,因此出错几率较大,一旦其中一块磁盘坏掉,数据将无法恢复。因此RAID0不能应用于数据安全性高的场合。

2、         RAID1

%title插图%num

 

它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据(如上图)。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID 1是磁盘阵列中单位成本*高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据。

3、         RAID4

%title插图%num

 

RAID4是将数据条块化分布于不同的硬盘上,区别在于RAID 4使用简单的奇偶校验,并用单块磁盘存放奇偶校验信息,如上图前两块存放数据,第三块磁盘则存放前两块的异或校验码。如果一块磁盘失效,奇偶盘及其他数据盘可以重  新产生数据;如果奇偶盘失效则不影响数据使用。RAID 4对于大量的连续数据可提供很好的传输率,但对于随机数据来说,奇偶盘会成为写操作的瓶颈。

4、         RAID5

%title插图%num

 

RAID5 与 RAID4 之间*大的区别就是校验信息均匀分布在各个磁盘上也就是三个磁盘轮流做为校验盘,如上图所示,这样就避免了RAID 4中出现的瓶颈问题。如果其中一块磁盘出现故障,那么由于有校验信息,所以所有数据仍然可以保持不变。如果可以使用备用磁盘,那么在设备出现故障之后,将立即开始同步数据。如果两块磁盘同时出现故障,那么所有数据都会丢失。RAID5 可以经受一块磁盘故障,但不能经受两块或多块磁盘故障。

5、         RAID10

%title插图%num

RAID10实际是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余。它的优点是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比较低。

mdadm命令详解

   在Linux中式通过mdadm来创建和维护软RAID的,mdadm是一个模式化的命令,因此有很多的模式。具体模式和选项如下:

Assemble 装配模式;Create  创建模式 ;Follow or Monitor  监控模式(运行特性);Grow: 增长模式;Manage 管理模式

mdadm 模式化命令如下:

-C 创建模式

-a yes 可以自动创建不存在的设备

-n 表示使用几块磁盘创建

-x  表示使用几块空闲盘 spare disks

-c  指定块大小 默认64KB

-l   指定级别

-p   layout

-D 查看详细信息

-S 停止raid设备

-A 装配模式(装配已停下的设备)

-F 监控模式

–add,–fail –remove 自动工作在监控模式下

–examine –scan 扫描当前设备信息

–fail简写成-f 可以模拟设备坏掉

–add 新增一块磁盘

–remove 删除一块磁盘

创建软一个RAID的步骤如下:

  创建软RAID的设备可以是任意设备或是分区,一般应该是把多块磁盘的分区做成RAID。这里我们就以一个磁盘上的多个分区创建软RAID为例进行讲解。

例一:在磁盘/dev/sda中创建一个6G的RAID0具体的操作步骤如下:

1、分析6G的RAID

根据RAID0的特性,我们可以创建为两个3G或是三个2G抑或六个1G的分区,这里我们就以两个3G为例进行讲解。

2、创建分区

使用“fdisk“命令在磁盘/dev/sda中创建两个3G的分区,并调整分区标识类型id 为fd,然后查看我们创建的分区。操作如下图:

%title插图%num

创建分区%title插图%num

调整分区类型

%title插图%num

查看创建好的分区

3、创建RAID

分区创建完成后不要像平时操作那样直接格式化分区,应该直接创建RAID.

在创建RAID之前应该先使用partprobe 命令来使我们的分区能够被识别。然后再使用如下命令进行创建。

mdadm -C /dev/md0 -a yes -l 0 -n 2 /dev/sda6 /dev/sda7

其中-C是指创建模式下的命令, -a如果没有设备也可自动创建,-n 指定几块磁盘 –l 指定raid级别。

4、格式化raid并挂载

格式化:mke2fs /dev/md0

挂载:mkdir /mt 创建一个目录载到

%title插图%num

挂载成功后,切换到mt目录下查看会有lost+foud

创建一个具有空闲盘的RAID5并模拟磁盘的坏掉

   我们先来创建一个2G的RAID5并具有一块空闲盘。

1、分析创建2G的RAID5需要建立几个分区,根据RAID5的特性我们需要建立三个1G的分区,因为还需要一个空闲盘,所以我们这里要建立四个1G的分区。

2、创建分区,具体步骤和创建RAID0是一样的,这里就不做详细说明。

3、创建RAID5

mdadm -C /dev/md0 -a yes -l 5 -n 3 –x 1 /dev/sda6 /dev/sda7

其中-x表示创建几块空闲磁盘

然后用mdadm –D /dev/md0查看RAID5的详细信息如下

%title插图%num

4.格式化并挂载到/mt目录下,操作和RAID0一样,在此就不重复了。

5、模拟一块坏掉的磁盘

我们先拷贝一个文件到挂载目录/mt下,是为了查看磁盘坏掉对文件数据是否有影响

cp /etc/fstab  /mt,

%title插图%num

接下来我们模拟/dev/sda5坏掉

%title插图%num

然后用mdadm –D /dev/md0查看详细信息如下:

%title插图%num

接下来我们看看拷贝的文件是否受影响

%title插图%num

由此可知在RAID5中当坏掉一块盘时,因为有一块空闲盘顶替了坏掉的磁盘,所以我们数据仍然存在,并不会丢失。

那我们现在再模拟/dev/sda6坏掉,也就说我们已经坏掉了两块盘。然后查看数据是否丢失。

 

如果我们的数据并没有丢失,这就和RAID5的特性有关系了,RAID5是允许坏掉一块磁盘的,所以即使剩余两块磁盘,数据还是不会丢失的。

接下来简单介绍一下怎么生成RAID的配置文件。

前面已经提到的—examine –scan 选项是扫描当前设备信息。生成配置文件其实很简单,只需把扫描的设备信息保存到一个文件中即可,具体如下:

mdadm –examine –scan /dev/md0 >> /etc/mdadm.conf

Linux系统中Raid完全攻略

RAID 0

RAID 0 也叫 Stripe 或 Striping(带区卷),是 RAID 级别中存储性能*好的一个。RAID 0 *好由相同容量的两块或两块以上的硬盘组成。如果组成 RAID 0 的两块硬盘大小不一致,则会影响 RAID 0 的性能。

这种模式下会先把硬盘分隔出大小相等的区块,当有数据需要写入硬盘时,会把数据也切割成相同大小的区块,然后分别写入各块硬盘。这样就相当于把一个文件分成几个部分同时向不同的硬盘中写入,数据的读/写速度当然就会非常快。

从理论上讲,由几块硬盘组成 RAID 0,比如由 3 块硬盘组成 RAID 0,数据的写入速度就是同样的数据向一块硬盘中写入速度的3倍。我们画一张 RAID 0 的示意图,如图 1 所示。

%title插图%num
图 1 RAID 图

解释一下这张示意图。我们准备了 3 块硬盘组成了 RAID 0,每块硬盘都划分了相等的区块。当有数据要写入 RAID 0 时,首先把数据按照区块大小进行分割,然后再把数据依次写入不同的硬盘。每块硬盘负责的数据写入量都是整体数据的 1/3,当然写入时间也只有原始时间的 1/3。所以,从理论上讲,由几块硬盘组成 RAID 0,数据的写入速度就是数据只写入一块硬盘速度的几倍。

RAID 0 的优点如下:

  • 通过把多块硬盘合并成一块大的逻辑硬盘,实现了数据跨硬盘存储。
  • 通过把数据分割成等大小的区块,分别存入不同的硬盘,加快了数据的读写速度。数据的读/写性能是几种 RAID 中*好的。
  • 多块硬盘合并成 RAID 0,几块小硬盘组成了更大容量的硬盘,而且没有容量损失。RAID 0 的总容量就是几块硬盘的容量之和。

RAID 0 有一个明显的缺点,那就是没有数据冗余功能,RAID 0 中的任何一块硬盘损坏,RAID 0 中所有的数据都将丟失。也就是说,由几块硬盘组成 RAID 0,数据的损毁概率就是只写入一块硬盘的几倍。

我们刚刚说了,组成 RAID 0 的硬盘的大小*好都是一样的。那有人说我只有两块不一样大小的硬盘,难道就不能组成 RAID 0 吗?

答案是可以的。假设有两块硬盘,一块大小是 100GB,另一块大小是 200GB。由这两块硬盘组成 RAID 0,那么当*初的 200G 数据写入时,是分别存放在两块硬盘当中的;但是当数据大于 200GB 之后,*块硬盘就写满了,以后的数据就只能写入第二块硬盘中,读/写性能也就随之下降了。

一般不建议企业用户使用 RAID 0,因为数据损毁的概率更高。如果对数据的读/写性能要求非常高,但对数据安全要求不高时,RAID 0 就非常合适了。

RAID 1

RAID 1也叫 Mirror 或 Mirroring(镜像卷),由两块硬盘组成。两块硬盘的大小*好一致,否则总容量以容量小的那块硬盘为主。RAID 1 就具备了数据冗余功能,因为这种模式是把同一份数据同时写入两块硬盘。

比如有两块硬盘,组成了 RAID 1,当有数据写入时,相同的数据既写入硬盘 1,也写入硬盘 2。这样相当于给数据做了备份,所以任何一块硬盘损坏,数据都可以在另一块硬盘中找回。RAID 1 的示意图如图 2 所示。

%title插图%num
图 2 RAID 1示意图

RAID 1 具有了数据冗余功能,但是硬盘的容量却减少了 50%,因为两块硬盘当中保存的数据是一样的,所以两块硬盘际上只保存了一块硬盘那么多的数据,这也是我们把 RAID 1 称作镜像卷的原因。

RAID 1 的优点如下:

  • 具备了数据冗余功能,任何一块硬盘出现故障,数据都不会丟失。
  • 数据的读取性能虽然不如RAID 0,但是比单一硬盘要好,因为数据有两份备份在不同的硬盘上,当多个进程读取同一数据时,RAID会自动分配读取进程。

RAID 1 的缺点也同样明显:

  • RAID 1 的容量只有两块硬盘容量的 50%,因为每块硬盘中保存的数据都一样。
  • 数据写入性能较差,因为相同的数据会写入两块硬盘当中,相当于写入数据的总容量变大了。虽然 CPU 的速度足够快,但是负责数据写入的芯片只有一个。

RAID 10 或 RAID 01

我们发现,RAID 0 虽然数据读/写性能非常好,但是没有数据冗余功能;而 RAID 1 虽然具有了数据冗余功能,但是数据写入速度实在是太慢了(尤其是软 RAID)。

那么,我们能不能把 RAID 0 和 RAID 1 组合起来使用?当然可以,这样我们就即拥有了 RAID 0 的性能,又拥有了 RAID 1 的数据冗余功能。

我们先用两块硬盘组成 RAID 1,再用两块硬盘组成另一个 RAID 1,*后把这两个 RAID 1组成 RAID 0,这种 RAID 方法称作 RAID 10。那先组成 RAID 0,再组成 RAID 1 的方法我们作 RAID 01。我们通过示意图 3 来看看 RAID 10。

%title插图%num
图 3 RAID 10示意图

我们把硬盘 1 和硬盘 2 组成了*个 RAID 1,把硬盘 3 和硬盘 4 组成了第二个 RAID 1,这两个 RAID 1组成了 RAID 0。因为先组成 RAID 1,再组成 RAID 0,所以这个 RAID 是 RAID 10。

当有数据写入时,首先写入的是 RAID 0(RAID 0 后组成,所以数据先写入),所以数据 1 和数据 3 写入了*个 RAID 1,而数据 2 和数据 4 写入了第二个 RAID 1。当数据 1 和数据 3 写入*个 RAID 1 时,

因为写入的是 RAID 1,所以在硬盘 1 和硬盘 2 中各写入了一份。数据 2 和数据 4 也一样。

这样的组成方式,既有了 RAID 0 的性能优点,也有了 RAID 1 的数据冗余优点。但是大家要注意,虽然我们有了 4 块硬盘,但是由于 RAID 1 的缺点,所以真正的容量只有 4 块硬盘的 50%,另外的一半是用来备份的。

RAID 5

RAID 5 *少需要由 3 块硬盘组成,当然硬盘的容量也应当一致。当组成 RAID 5 时,同样需要把硬盘分隔成大小相同的区块。当有数据写入时,数据也被划分成等大小的区块,然后循环向 RAID 5 中写入。

每次循环写入数据的过程中,在其中一块硬盘中加入一个奇偶校验值(Parity),这个奇偶校验值的内容是这次循环写入时其他硬盘数据的备份。当有一块硬盘损坏时,采用这个奇偶校验值进行数据恢复。通过示意图来看看 RAID 5 的存储过程,如图 4 所示。

%title插图%num
图 4 RAID 5 示意图

在这张示意图中,我们使用三块硬盘组成了 RAID 5。当有数据循环写入时,每次循环都会写入一个奇偶校验值(Parity),并且每次奇偶校验值都会写入不同的硬盘。这个奇偶校验值就是其他两块硬盘中的数据经过换算之后产生的。因为每次奇偶校验值都会写入不同的硬盘,所以任何一块硬盘损坏之后,都可以依赖其他两块硬盘中保存的数据恢复这块损坏的硬盘中的数据。

需要注意的是,每次数据循环写入时,都会有一块硬盘用来保存奇偶校验值,所以在 RAID 5 中可以使用的总容量是硬盘总数减去一块的容量之和。

比如,在这张示意图中,由三块硬盘组成了 RAID 5,但是真正可用的容量是两块硬盘的容量之和,也就是说,越多的硬盘组成 RAID 5,损失的容量占比越小,因为不管由多少块硬盘组成 RAID 5,奇偶校验值加起来只占用一块硬盘。而且还要注意,RAID 5 不管是由几块硬盘组成的,只有损坏一块硬盘的情况才能恢复数据,因为奇偶校验值加起来只占用了一块硬盘,如果损坏的硬盘超过一块,那么数据就不能再恢复了。

RAID 5 的优点如下:

  • 因为奇偶校验值的存在,RAID 5 具有了数据冗余功能。
  • 硬盘容量损失比 RAID 1 小,而且组成 RAID 5 的硬盘数量越多,容量损失占比越小。
  • RAID 5的数据读/写性能要比 RAID 1 更好,但是在数据写入性能上比 RAID 0 差。

RAID 5 的缺点如下:

  • 不管由多少块硬盘组成 RAID 5,只支持一块硬盘损坏之后的数据恢复。
  • RAID 5 的实际容量是组成 RAID 5 的硬盘总数减去一块的容量之和。也就是有一块硬盘用来保存奇偶校验值,但不能保存数据。

从总体上来说,RAID 5 更像 RAID 0 和 RAID 1 的折中,性能比 RAID 1 好,但是不如 RAID 0;数据冗余比 RAID 0 好,而且不像 RAID 1 那样浪费了 50% 的硬盘容量。

软 RAID 和硬 RAID

我们要想在服务器上实现 RAID,可以采用磁盘阵列卡(RAID 卡)来组成 RAID,也就是硬 RAID。RAID 卡上有专门的芯片负责 RAID 任务,因此性能要好得多,而且不占用系统性能,缺点是 RAID 卡比较昂贵。

如果我们既不想花钱又想使用 RAID,那就只能使用软 RAID 了。软 RAID 是指通过软件实现 RAID 功能,没有多余的费用,但是更加耗费服务器系统性能,而数据的写入速度比硬 RAID 慢。

华为Watch GT2新增门禁卡功能 不再担心出门忘带钥匙

华为Watch GT2新色与GT2e新品随P40在全球亮相,新增的女性生理周期管理、100种运动模式及自动识别、动态表盘等功能受到了众多关注。4月8日华为将举办国内发布会,华为Watch GT2两款新色(栗木红/凝霜白)将与国内消费者正式见面,而且在健康方面或有新功能亮相。华为Watch GT2在日常服务方面也带来了很多小惊喜,虽然发布会还没到,但是*近就新上线了门禁卡功能,提前让用户们尝鲜。

华为Watch GT2的日常服务一直很贴心,在之前就支持NFC公交支付、支付宝扫码支付、信息提示等,为生活带来了很多便利。本次新增的门禁卡功能,同样是利用华为NFC的技术,模拟实体门钥匙,出门时候不用再携带各种钥匙,轻松便捷。

%title插图%num
华为Watch GT2新增的门禁卡功能,为用户带来尝鲜体验,而*大的亮点还是要看本次发布会新色带来的健康、运动升级。据了解华为Watch GT2新增女性生理周期管理,更加重视女性健康关怀。都市中的女性经常忙于工作和生活,对于自己的身体缺乏照顾,有了女性生理周期管理功能,就可以及时获得周期预测和生理提醒,提前做好准备工作,多一分淡定从容,少一丝手忙脚乱,非常贴心。

此外,有消息透露华为Watch GT2在与301医院合作的健康研究方面或许还有升级。目前华为Watch GT2已加入301医院的心脏健康研究和睡眠呼吸暂停研究,支持房颤早搏筛查和睡眠呼吸暂停风险识别。新加入的健康研究,或许将对健康管理场景进一步细分,提供更加全面智能的服务。

在全球发布会上,100种运动模式及自动识别成为人们关注的焦点。华为Watch GT2在原15种模式之上,新增85种自定义运动记录,包括跑酷、街舞、滑板、攀岩等*限、休闲、健身、水上项目、球类、冰雪项目等六大运动类型,不管是都市街头还是户外山川,都有相应运动模式。同时华为Watch GT2还新增6种运动模式自动识别,分别是户外跑步、户外步行、室内步行、室内跑步、椭圆机和划船机,运动时不用再手动去选择模式,只要开始运动,便会自动识别对应运动模式,让运动更加智能。在运动模式下,华为Watch GT2会记录运动时间、热量、心率区间、运动效果、恢复时间等数据,同时支持心率过高过低提醒,避免运动风险,带来私教般运动体验。

%title插图%num
综合来看,华为Watch GT2不仅是一件高颜值的配饰,更是一种新的生态,涵盖了运动、办公、休闲、日常等各种场景,将以前生活中的繁杂程序,进行简化集中到手表身上。4月8日,华为Watch GT2新色将与国内消费者正式见面,除了女性生理周期管理还有很多新功能亮相。

门禁卡功能升级指导:

%title插图%num %title插图%num

Oracle_SQL练习_08

Oracle_SQL练习_08

–1、创建表myemp和emp表具有相同的结构和记录。
create table myemp as select * from emp;
–2、给myemp的empno列添加主建约束。
alter table myemp add constraint pk_myemp primary key(empno);
–3、给myemp添加一条记录。
insert into myemp(empno,ename…) values()
–4、给myemp添加一条记录只有empno,ename,mgr,sal,deptno有值,其他列为空。
insert into myemp(empno, ename, mgr, sal, deptno) values()
–5、显示所有 薪金高于公司均薪金的人。
SELECT * FROM emp WHERE nvl(sal, 0) > (SELECT AVG(nvl(sal, 0)) FROM emp)

–6、显示所有 薪金高于各自部门平均薪金的人。 关联子查询*******
SELECT *
FROM emp
INNER JOIN (SELECT round(AVG(nvl(sal, 0)), 2) avgsal, deptno
FROM emp
GROUP BY deptno) t1
ON emp.deptno = t1.deptno
WHERE nvl(sal, 0) > avgsal

–7、给所有10部门的经理(MANAGER)和20部门的职员(CLERK),增加薪金10%。
UPDATE emp
SET sal = sal * 1.1
WHERE (deptno = 10 AND job = ‘MANAGER’)
OR (deptno = 20 AND job = ‘CLERK’)

–8、使用EMP,DEPT表显示所有销售部’SALES’的员工。
select * from emp where job = ‘SALESMAN’
–9、删除DEPT中没有员工的部门。
DELETE FROM dept WHERE deptno NOT IN (SELECT DISTINCT deptno FROM emp)
–10、显示所有的部门信息和人数。******
SELECT t1.deptno, t1.cnt 员工人数, dept.dname, dept.loc
FROM (SELECT COUNT(*) CNT, deptno FROM emp GROUP BY deptno) t1
INNER JOIN dept
ON dept.deptno = t1.deptno

–11、删除雇佣年限低于20年的员工。
DELETE FROM emp WHERE months_between(SYSDATE, hiredate) < 20 * 12
–12、显示各部门员工薪金*高的前2名
SELECT *
FROM (SELECT emp.*,
row_number() over(PARTITION BY deptno ORDER BY nvl(sal, 0) DESC) grade
FROM emp) t1
WHERE t1.grade <= 2

–13、显示薪金*高的3位员工
SELECT *
FROM (SELECT emp.*, row_number() over(ORDER BY nvl(sal, 0) DESC) grade
FROM emp) t1
WHERE t1.grade <= 3

–14、为EMP的各字段建立必要的索引,使得如下查询能使用上索引
— select * from emp where ename like ‘S%’;

— select * from emp where job=’MANAGER’;

— select * from emp where hiredate>to_date(‘1982′,’yyyy’);

 

Oracle_数据的还原_09

Oracle_数据的还原_09

小技巧

1.          查看回收站

select * from user_recyclebin;
2.          清空回收站

purge recyclebin
3.          还原被删的对象

flashback table “Bin(回收站中的表的名字)” to before drop( rename to 表名)
4.          DML恢复(Data Manipulation Language)

那我们知道一条Transaction语句,如果没有COMMIT是可以通过ROLLBACK来撤销的。但是如果如果语句已经COMMIT如何来撤销呢。

在Oralcel里面有一张特殊的表:flashback_transaction_query,desc来看看表结构。如下图所示。

%title插图%num

可以看到表里面的列,这些列就是我们找到SQL语句的限制条件啦。

比方说,昨天你写COMMIT的语句都需要撤销,那么这个时候

SELECT undo_sql
FROM flashback_transaction_query
WHERE logon_user = ‘SCOTT’
AND table_name = ‘EMP2’
AND start_timestamp BETWEEN SYSDATE – 1 AND SYSDATE
之前介绍过SPOOL技术,我们可以在SQL语句的上面和下面分别加上SPOOL D:\flashback.sql SPOOL OFF

Oracle_PL-SQL_10

Oracle_PL-SQL_10

PL-SQL: ProcedureLanguage

PL中的主要内容

java source、directory、procedure、function、package、trigger、view

1.   块结构
DECLARE
/*
*定义部分(定义变量、常量、复杂数据类型、游标)
*/
BEGIN
/*
执行部分(pl/sql语句)
*/
excetpion WHENOTHERSTHEN
/*
异常处理部分(处理运行错误)
*/
END;
在PL SQL 中,在test window里面可以对PL-SQL进行调试、查看结果等操作

注意点:

DECLARE
BEGIN
dbms_output.put_line(2 ** 3);
dbms_output.put_line(””);
END;
输出

8

2.  变量和类型
PL-SQL中declare段申明的变量只能在内部使用。

PL-SQL中的类型和SQL中的类似,具体可以查看网上相关文档,这里不再赘述。

注意点:在PL中可以通过%TYPE关键字来定义变量的类型

Student_namestudens.username%TYPE;

3.  条件逻辑
在PL-SQL中,IF、THEN、ELSE、ELSIF和ENDIF等关键字是用于执行条件逻辑的。

例子:

DECLARE
counter INTEGER := 3;
BEGIN
IF counter = 1THEN
dbms_output.put_line(‘嘻嘻’);
ELSIF counter = 2THEN
dbms_output.put_line(‘哈哈’);
ELSE
dbms_output.put_line(‘呵呵’);
ENDIF;
END;
CASE WHEN THEN
DECLARE
os INTEGER := 10;
BEGIN
CASE
WHEN os = 10THEN
dbms_output.put_line(‘XP’);
WHEN os = 20THEN
dbms_output.put_line(‘LINUX’);
ENDCASE;
END;
4.  循环
简单循环
要结束简单循环,可以使用EXIT或EXIT WHEN语句。EXIT立即结束,EXIT WHEN语句在指定条件出现时,结束循环。

DECLARE
counter INTEGER := 0;
BEGIN
LOOP
counter := counter + 1;
–当WHEN条件成立的时候,跳出循环
EXITWHEN counter = 5;
ENDLOOP;
dbms_output.put_line(counter);
END;
WHILE循环
DECLARE
counter INTEGER := 5;
BEGIN
–当WHILE条件不满足时,跳出循环
WHILE counter > 0LOOP
counter := counter – 1;
ENDLOOP;
dbms_output.put_line(counter);
END;
FOR循环
DECLARE
BEGIN
FOR num INREVERSE1 .. 5LOOP
dbms_output.put_line(num);
ENDLOOP;
END;
GOTO语句(NOT RECOMENDED)
PL/SQL中GOTO语句是无条件跳转到指定的标号去的意思。语法如下:

GOTO label;
……
<<label>> /*标号是用<< >>括起来的标识符 */
注意,在以下地方使用是不合法的,编译时会出错误。

(1)跳转到非执行语句前面。

(2) 跳转到子块中。

(3) 跳转到循环语句中。

(4)跳转到条件语句中。

(5) 从异常处理部分跳转到执行。

(6)从条件语句的一部分跳转到另一部分

NULL语句
在PL/SQL 程序中,NULL语句是一个可执行语句,可以用 null 语句来说明“不用做任何事情”的意思,相当于一个占位符或不执行任何操作的空语句,可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。如:

DECLARE

BEGIN

IF v_num IS NULL THEN
GOTO labelPrint;
END IF;

<<labelPrint>>
NULL; –不需要处理任何数据。
END;

DECLARE
v_emp_id employees.employee_id%TYPE;
v_first_name employees.first_name%TYPE;
v_salary employees.salary%TYPE;
v_sal_raise NUMBER(3,2);
BEGIN
v_emp_id := &emp_id;
SELECT first_name, salary INTO v_first_name, v_salary
FROM employees WHERE employee_id = v_emp_id;
IF v_salary <= 3000 THEN
v_sal_raise := .10;
DBMS_OUTPUT.PUT_LINE(v_first_name||’的工资是’||v_salary
||’、工资涨幅是’||v_sal_raise);
ELSE
–使用NULL语句,增加程序的可读性,告诉程序员,IF ELSE外的业务逻辑。
NULL;
END IF;
END;

看一个例子,分别用3中循环,求1+2+3。。。100的和。
–普通循环
/*DECLARE
i INTEGER := 1;
summation INTEGER:= 0;
BEGIN
LOOP
summation :=summation + i;
i := i + 1;
EXIT WHEN i> 100;
END LOOP;
dbms_output.put_line(summation);
END;*/
–WHILE循环
/*DECLARE
i INTEGER := 1;
summation INTEGER:= 0;
BEGIN
WHILE i < 101LOOP
summation :=summation + i;
i := i + 1;
END LOOP;
dbms_output.put_line(summation);
END;*/
–FOR循环
/*DECLARE
summation INTEGER:= 0;
BEGIN
FOR i IN 1 .. 100LOOP
summation :=summation + i;
END LOOP;
dbms_output.put_line(summation);
END;*/
5.      游标
DECLARE
–申明变量
vename emp.ename%TYPE;
vsal emp.sal%TYPE;
–申明游标
CURSOR cur_emp IS
SELECT ename, sal FROM emp;
BEGIN
–打开游标
OPEN cur_emp;
LOOP
–遍历提取
FETCH cur_emp
INTO vename, vsal;
EXITWHEN cur_emp%NOTFOUND;
dbms_output.put_line(‘vEname=’ || vename || ‘,vSal=’ || vsal);
ENDLOOP;
— 关闭游标
CLOSE cur_emp;
END;
简化写法(利用FOR IN 语句)

DECLARE
CURSOR cur_ename IS
SELECT ename FROM emp;
BEGIN
FOR cur_person IN cur_ename LOOP
dbms_output.put_line(cur_person.ename);
ENDLOOP;
END;
DECLARE
CURSOR cur_ename IS
SELECT ename FROM emp;
BEGIN
FOR cur_person IN cur_ename LOOP
dbms_output.put_line(cur_person.ename);
ENDLOOP;
END;

 

Oralce_数据类型的选择_11

Oralce_数据类型的选择_11

在进行数据库设计的时候,表机构的设计是至关重要的一部分,还有一部分可能往往容易被轻视,那就是数据类型的选择。前一篇中讲到了一点点数据类型,这章具体讲讲,下面的文章不是我写的,是摘自与Oracle编程艺术里的。(部分地方稍微做了修改)

~~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

选择一个正确的数据类型,这看上去再容易不过了,但我屡屡见得选择不当的情况。要选择什么类型来存储你的数据,这是一个*基本的决定,而且这个决定会在以后的数年间影响着你的应用和数据。选择适当的数据类型至关重要,而且很难事后再做改变,也就是说,一旦选择某些类型实现了应用,在相当长的时间内就只能“忍耐”(因为你选择的类型可能不太合适)。

这一章我们将介绍Oracle 所有可用的基本数据类型,讨论这些类型如何实现,并说明每种类型分别适用于哪些情况。在此不讨论用户定义的数据类型,因为用户定义的数据类型只是由Oracle 内置数据类型导出的一些复合对象。我们会分析如果不合适地使用了错误的数据类型,甚至只是对数据类型使用了不正确的参数(如长度、精度、小数位等),将会发生什么情况。读完这一章后,你将对使用哪些类型有所了解,明白这些类型如何实现以及何时使用,还有很重要的一点,你会认识到为什么关键是要针对具体任务使用适宜的类型。

Oracle 数据类型概述
Oracle 提供了22 种不同的SQL 数据类型供我们使用。简要地讲,执行数据类型如下:
CHAR:这是一个定长字符串,会用空格填充来达到其*大长度。非null 的CHAR(12.)总是包含12.字节信息(使用了默认国家语言支持National Language Support,NLS 设置)。稍后将更详细地介绍NLS 的作用。CHAR 字段*多可以存储2,000 字节的信息。
NCHAR:这是一个包含UNICODE格式数据的定长字符串。Unicode 是一种对字符进行编码的通用方法,而不论使用的是何种计算机系统平台。有了NCHAR 类型,就允许数据库中包含采用
VARCHAR2:目前这也是VARCHAR 的同义词。这是一个变长字符串,与CHAR 类型不同,它不会用空格填充至*大长度。VARCHAR2(12.)可能包含0~12.字节的信息(使用默认NLS 设置)。
VARCHAR2 *多可以存储4,000 字节的信息。
NVARCHAR2:这是一个包含UNICODE 格式数据的变长字符串。NVARCHAR2(12.)可以包含0~12.字符的信息。NVARCHAR2 *多可以存储4,000 字节的信息。
RAW:这是一种变长二进制数据类型,这说明采用这种数据类型存储的数据不会发生字符集转换。可以把它看作由数据库存储的信息的二进制字节串。这种类型*多可以存储2,000 字节的信息。
NUMBER:这种数据类型能存储精度*多达38 位的数字。这些数介于12.0×12.(-130)— —(但不包括)12.0×12.(126)之间。每个数存储在一个变长字段中,其长度在0(尾部的NULL 列就是0字节)~22 字节之间。Oracle 的NUMBER类型精度很高,远远高于许多编程语言中常规的FLOAT和DOUBLE 类型。
BINARY_FLOAT:这是Oracle 10g Release 1 及以后版本中才有的一种新类型。它是一个32位单精度浮点数,可以支持至少6 位精度,占用磁盘上5 字节的存储空间。
LONG:这种类型能存储*多2G 的字符数据(2GB 是指2 千兆字节,而不是2 千兆字符,因为在一个多字节字符集中,每个字符可能有多个字节)。由于LONG 类型有许多限制(后面会讨578/ 849论),而且提供LONG 类型只是为了保证向后兼容性,所以强烈建议新应用中不要使用LONG 类型,而且在现有的应用中也要尽可能将LONG 类型转换为CLOB 类型。
LONG RAW:LONG RAW 类型能存储多达2GB 的二进制信息。由于LONG 同样的原因,建议在将来的所有开发中都使用CLOB 类型,另外现有的应用中也应尽可能将LONG RAW 转换为BLOB 类型。
DATE:这是一个7 字节的定宽日期/时间数据类型。其中总包含7 个属性,包括:世纪、世纪中哪一年、月份、月中的哪一天、小时、分钟和秒。
TIMESTAMP:这是一个7 字节或12.字节的定宽日期/时间数据类型。它与DATE 数据类型不同,因为TIMESTAMP 可以包含小数秒(fractional second);带小数秒的TIMESTAMP 在小数点右边*多可以保留9 位。
TIMESTAMP WITH TIME ZONE:与前一种类型类似,这是一个12.字节的定宽TIMESTAMP,不过它还提供了时区(TIME ZONE)支持。数据中会随TIMESTAMP 存储有关时区的额外信息,所以原先插入的TIME ZONE 会与数据一同保留。
TIMESTAMP WITH LOCAL TIME ZONE:与TIMESTAMP 类似,这是一种7 字节或12.字节的定宽日期/时间数据类型;不过,这种类型对时区敏感(time zone sensitive)。如果在数据库中有修改,会参考数据中提供的TIME ZONE,根据数据库时区对数据中的日期/时间部分进行“规范化”。所以,如果你想使用U.S./Pacific 时区插入一个日期/时间,而数据库时区为U.S./Eastern,*后的日期/时间信息会转换为Eastern 时区的日期/时间,并像TIMESTAMP 一样存储。获取这个数据时,数据库中存储的TIMESTAMP 将转换为会话时区的时间。INTERVAL YEAR TO MONTH:这是一个5 字节的定宽数据类型,用于存储一个时间段,这个类型将时段存储为年数和月数。可以在日期运算中使用这种时间间隔使一个DATE 或TIMESTAMP类型增加或减少一段时间。
INTERVAL DAY TO SECOND:这是一个12.字节的定宽数据类型,用于存储一个时段,这个类型将时段存储为天/小时/分钟/秒数,还可以有*多9 位的小数秒。BFILE:这种数据类型允许在数据库列中存储一个Oracle 目录对象(操作系统目录的一个指针)和一个文件名,并读取这个文件。这实际上允许你以一种只读的方式访问数据库服务器上可用的操作系统文件,就好像它们存储在数据库表本身中一样。
BLOB:在Oracle9i 及以前的版本中,这种数据类型允许存储*多4GB 的数据,在Oracle 10g及以后的版本中允许存储*多(4GB)×(数据库块大小)字节的数据。BLOB 包含不需要进行字符集转换的“二进制“数据,如果要存储电子表格、字处理文档、图像文件等就很适合采用这种数据类型。
CLOB:在Oracle9i 及以前的版本中,这种数据类型允许存储*多4GB 的数据,在Oracle 10g及以后的版本中允许存储*多(4GB)×(数据库块大小)字节的数据。CLOB 包含要进行字符集转换的信息。这种数据类型很适合存储纯文本信息。
NCLOB:在Oracle9i 及以前的版本中,这种数据类型允许存储*多4GB 的数据,在Oracle 10g及以后的版本中允许存储*多(4GB)×(数据库块大小)字节的数据。NCLOB 存储用数据库国家字符集编码的信息,而且像CLOB 一样,这些信息要进行字符集转换。
ROWID:ROWID 实际上是数据库中一行的12.字节地址。ROWID 中编码有足够的信息,足以在磁盘上定位这一行,以及标识ROWID 指向的对象(表等)。
UROWID:UROWID 是一个通用ROWID,用于表(如IOT 和通过异构数据库网关访问的没有固579/ 849定ROWID 的表)。UROWID 是行主键值的一种表示,因此,取决于所指向的对象,UROWID 的大小会有所变化。
这些只是Oracle类型的一个概述,如果需要更加深入的理解Oracle类型,可以下载《Oracle编程艺术》。

Oralce_PL-SQL_Prodedure_12

Oralce_PL-SQL_Prodedure_12

Procedure
参数模式:in、out、in out
Procedure的创建
CREATE[OR REPLACE] PROCEDURE procedurename(arg1 [model] datatype,arg2 [model] datatype,…) IS/AS
BEGIN
END;
注意:

无参 时,创建不能有过程名称后面不需要()

eg:用procedure求n1~n2的和
CREATEORREPLACEPROCEDURE sp_sum(i ININTEGER,
j ININTEGER,
res OUTNUMBER) IS
i1 INTEGER := i;
j1 INTEGER := j;
sm INTEGER := 0;
BEGIN
WHILE i1 <= j1 LOOP
sm := sm + i1;
i1 := i1 + 1;
ENDLOOP;
res := sm;
END;
其实说到底,oracle还是对表的CRUD, Cursor的作用就很明显了,所以Cursor作为参数在procedure中的应用我们也要掌握好,这样才能熟练的运用之。

这种情况,先定义一个package,在package中定义一种Type

那么这个时候我们就定义了一个类型了,以后要创建一个cursor类型就可以直接这样来创建。

创建一个包,包里面包含一个TYPE为REF CURSOR的类型

CREATEORREPLACEPACKAGE typeutil IS
TYPE cur_type ISREFCURSOR;
END;
创建一个Procedure,用来遍历出emp表中的ename

CREATEORREPLACEPROCEDURE sp_print(cur_emp OUT typeutil.cur_type) IS
cur SYS_REFCURSOR;
BEGIN
OPEN cur FOR
SELECT ename form emp;
cur_emp := cur;
END;
调用Procedure

DECLARE
cur SYS_REFCURSOR;
vename VARCHAR2(20);
BEGIN
sp_print(cur);
LOOP
FETCH cur
INTO vename;
EXITWHEN cur%NOTFOUND;
dbms_output.put_line(vename);
ENDLOOP;
CLOSE cur;
END;
那我们可以很清晰的看到,先在package中定义了一个Type,为ref cursor,然后create procedure 目的来遍历emp中的ename,然后调用。这是方法一,显得有点繁琐,让我们看看方法二。

我们可以看到,这里直接引入了一种Type SYS_REFCURSOR,直接定义一个cursor就很方便了。看看具体PL的实现。

CREATEORREPLACEPROCEDURE sp_print2(cur_emp OUTSYS_REFCURSOR) IS
cur SYS_REFCURSOR;
BEGIN
OPEN cur FOR
SELECT ename FROM emp;
cur_emp := cur;
END;
CREATEORREPLACEPROCEDURE sp_test(cur_emp OUTVARCHAR2) IS
BEGIN
dbms_output.put_line(‘HELLOWORLD’);
END;
注意,这里参数类型不需要给出指定的数字,PL会根据你的返回值,然后判断到底用多大的空间来接受,认为的给出参数的数字是错误的。

调用
Call 过程名(无参)

Call 过程名(参数)

Exec过程名(参数)

删除
drop proceduresp_name
查看
SELECT* FROM user_procedures;
查看过程源代码
SELECT TEXT FROMuser_source where name = ‘SP_SUM’
增加调试信息
ALTER PROCEDUREsp_name COMPILE DEBUG

Oracle_PL-SQL_JavaSource_13

Oracle_PL-SQL_JavaSource_13

JAVA Source
有的时候,我们需要在Oracle的Prodedure、Function中调用JAVA代码来实现功能,比方说下面的这个例子,调用JAVA代码来实现大小写金额的转换,如果这个代码用PL实现,难度还是有的,那如果我们先写成JAVA代码,然后通过调用,来实现,还是可以的。
创建
–create or replace and compile java source named javasource_name
–as
–package package_name
/*
* java code here
*/

CREATE or replace and compile java source named js_translater
AS
package com.yzupope.util;
/*
* 人民币大小写金额转化
*/
public class XhgUtil {

private static final String UNIT = “万千佰拾亿千佰拾万千佰拾元角分”;

private static final String DIGIT = “零壹贰叁肆伍陆柒捌玖”;

private static final double MAX_VALUE = 9999999999999.99D;

public static String trans(double v) {
if (v < 0 || v > MAX_VALUE)
return “参数非法!”;
long l = Math.round(v * 100);//round(double a):返回*接近参数的long(返回值为static long)

if (l == 0)
return “零元整”;
String strValue = l + “”;
// j用来控制单位
int j = UNIT.length() – strValue.length();
String rs = “”;
boolean isZero = false;
// i用来控制数
for (int i = 0; i < strValue.length(); i++, j++) {
char ch = strValue.charAt(i);
if (ch == ‘0’) {
isZero = true;
if (UNIT.charAt(j) == ‘亿’ || UNIT.charAt(j) == ‘万’
|| UNIT.charAt(j) == ‘元’) {
rs = rs + UNIT.charAt(j);
isZero = false;
}
} else {
if (isZero) {
rs = rs + “零”;
isZero = false;
}
rs = rs + DIGIT.charAt(ch – ‘0’) + UNIT.charAt(j);
}
}
if (!rs.endsWith(“角”) && !rs.endsWith(“分”)) {
rs = rs + “整”;
}
rs = rs.replaceAll(“亿万”, “亿”);
return rs;
}
}
创建引用
CREATE OR REPLACE FUNCTION xchg(v NUMBER) RETURN VARCHAR2
AS
LANGUAGE JAVA NAME com.yzupope.util.XhgUtil.trans(double)return java.lang.String’;
函数调用
select xchg(105.91) FROM dual;
Where are java classes stored in Oracle?(如何查看呢)
SELECT object_name, object_type, status, TIMESTAMP
FROM   user_objects
WHERE  (object_name NOT LIKE ‘SYS_%’ AND object_name NOT LIKE ‘CREATE$%’ AND
object_name NOT LIKE ‘JAVA$%’ AND object_name NOT LIKE ‘LOADLOB%’)
AND object_type LIKE ‘JAVA %’
ORDER  BY object_type, object_name;
当然也可以通过工具查看