oracle进阶实战笔记

本文包含以下内容:

1、Oracle PL/SQL使用

2、Oracle中的5种约束条件(非空约束、唯一约束、主键约束、外键约束、check约束)

3、oracle单引号、双引号区别(OTL编程时不注意会经常犯错)

5、事务

6、系统日期&系统时间

7、序列

8、存储过程

9、函数

  1. Oracle PL/SQL使用

    【简介】

    PL/SQL是在oracle里面的编程语言,用来写存储过程、触发器、函数等等。

    PL/SQL语言是SQL的补充。SQL没有分支,没有循环,是第四代编程语言,非过程的,只要求得结果。

【注意】

必须先执行set serveroutput on 才能看到输出。

执行set serveroutput on以后能导致 SQL*Plus检索和显示buffer。

“/”表示执行,相当于输入了run;

【举例】

SQL> set serveroutput on

SQL> declare

2 v_sal number(6,0);

3 begin

4 v_sal := 6600;

5 if (v_sal < 2500) then

6 v_sal := v_sal * 2;

7 dbms_output.put_line(‘sal < 2500 ’ || v_sal);

8 elsif (v_sal > 2500) then

9 v_sal := v_sal / 2;

10 dbms_output.put_line(‘sal > 2500 ’ || v_sal);

11 else

12 dbms_output.put_line(‘sal = 2500 ’ || v_sal);

13 end if;

14 end;

15 /

sal > 2500 3300

PL/SQL procedure successfully completed.

常用变量类型:

1)binary_integer:整数,主要用来计数而不是用来表示字段类型

2)number:数字类型

3)char:定长字符串

4)varchar2:变长字符串

5)date:日期

6)long:长字符串,最长2GB

7)boolean:布尔类型,可以取值为true、false和null值(建议boolean类型在声明时给初值,否则就是空值)

变量声明的规则:

1)变量名不能够使用保留字,如from、select等

2)第一个字符必须是字母

3)变量名最多包含30个字符

4)不要与数据库的表或者列同名

5)每一行只能声明一个变量

说明:

1)constant相当于Java里面的final,常量; C++中的const, 常量。

2)“||”是字符串连接符。

3)dbms_output.put_line不能打印布尔类型的值。

//循环

SQL> declare

2 i binary_integer := 1;

3 begin

4 loop

5 dbms_output.put_line(i);

6 i := i + 1;

7 exit when (i >= 9);

8 end loop;

9 end;

10 /

1

2

3

4

5

6

7

8

PL/SQL procedure successfully completed.

【总结】

PL/SQL写程序非常的固定:

[DECLARE]

–声明部分,可选。声明各种变量游标

BEGIN

–执行部分,必须。从这儿开始,程序开始执行

[EXCEPTION]

–异常处理部分,可选。相当于catch到exception时执行的东西

END;

–结束,end后要有分号

–eg:最简单的语句块

begin

dbms_output.put_line(‘Hello World!’);

end;

/

2.Oracle中的5种约束条件

oracle中对表有五种约束条件

非空(not null)约束

唯一(unique)约束

主键(primary key)约束

外键(foreign key)约束

check约束

2.1 非空约束

create table TT (

id number(3) not null,

name varchar2(100) constraint TT_NAME_NN not null

);

2.2 唯一性约束

1)、唯一约束要求被约束的列或列的组合值是唯一的,不能有两个相同值存在。

2)、唯一约束可以定义在列级也能定义在表级。表级可以定义字段的组合。

3)、唯一约束允许空值,因为空值不等于任何值。

4)、组合字段的唯一约束,只要字段的组合不完全一样就可以插入表。

create table TT (

id number(3),

name varchar2(100),

constraint TT_ID_NAME_UK unique (id, name)

);

SQL> select owner, constraint_name, constraint_type, table_name from user_constraints where table_name=‘TT‘;

OWNER
--------------------------------------------------------------------------------
CONSTRAINT_NAME C TABLE_NAME
------------------------------ - ------------------------------
SYSTEM
SYS_C007178 C TT

SYSTEM
TT_NAME_NN C TT

违反唯一性插入举例:

SQL> drop table TT;

Table dropped.

//创建

SQL> SQL> create table TT (

2 id number(3),

3 name varchar2(100),

4 constraint TT_ID_NAME_UK unique (id, name)

5 );

Table created.

//插入

SQL> insert into TT values(1, ‘aaaa’);

1 row created.

//插入

SQL> insert into TT values(1, ‘bbbb’);

1 row created.

//再次重复插入,报错!

SQL> insert into TT values(1, ‘aaaa’);

insert into TT values(1, ‘aaaa’)

*

ERROR at line 1:

ORA-00001: unique constraint (SYSTEM.TT_ID_NAME_UK) violated

2.3主键

**通过主键可以找到唯一一行与之对应的记录。

1)、一个表只能有一个主键约束。

2)、单一主键定义在列级,组合主键定义在表级。

3)、主键不允许空值,不允许出现重复值。

SQL> CREATE TABLE TB_PK_EXAMPLE( ID number, NAME varchar2(50), DESCRIPTION varchar2(300), CONSTRAINT TB_PK_EXAMPLE_PK PRIMARY KEY(ID));

Table created.

//插入一行数据

SQL> insert into TB_PK_EXAMPLE values(1, ‘laoyang’, ‘testing’);

1 row created.

//插入一行数据,ID相同,违反主键约束,会报错。

SQL> insert into TB_PK_EXAMPLE values(1, ‘zhang’, ‘testing’);

insert into TB_PK_EXAMPLE values(1, ‘zhang’, ‘testing’)

*

ERROR at line 1:

ORA-00001: unique constraint (SYSTEM.TB_PK_EXAMPLE_PK) violated

2.4外键

1)一个表的外键必须是,另一个表的主键或唯一键。

2) 外键可以为空值,一个外键值必须匹配一个在父表中存在的值或者空值。

3) 外键可以定义在表级(单列),列级(单列或列的组合)。

4) 外键必须指向父表的PK字段或UK字段。

//创建表

SQL> create table tb_supplier

2 (

3 supplier_id number not null,

4 supplier_name varchar2(50) not null,

5 contact_name varchar2(50),

6 CONSTRAINT pk_supplier PRIMARY KEY (supplier_id)

7 );

Table created.

//创建表

SQL> create table tb_products

2 (

3 product_id number not null,

4 product_name varchar2(100),

5 supplier_id number not null,

//外键约束

//

6 constraint fk_products_supplier foreign key (supplier_id) references tb_supplier(supplier_id)

7 );

Table created.

2.5 Check约束

check约束定义了一个每行都必须满足的条件,类似与在插入数据时,对数据做了一个where过滤。

举例如下:

SQL> CREATE TABLE tb_age (age NUMBER(3));

Table created.

//限定年龄的范围【0,125】

SQL> ALTER TABLE tb_age ADD CONSTRAINT ck_temp_age CHECK((AGE>0) AND (AGE <= 125));

Table altered.

//在给定范围内可以插入。

SQL> insert into tb_age values(33);

1 row created.

//超出范围内的两个测试值-1, 126都会报错。

SQL> insert into tb_age values(126);

insert into tb_age values(126)

*

ERROR at line 1:

ORA-02290: check constraint (SYSTEM.CK_TEMP_AGE) violated

SQL> insert into tb_age values(-1);

insert into tb_age values(-1)

*

ERROR at line 1:

ORA-02290: check constraint (SYSTEM.CK_TEMP_AGE) violated

3.Oracle双引号&单引号区别

1.双引号的作用:

关键字,对象名、字段名加双引号,则示意 Oracle将严格区分大小写,否则Oracl都默认大写。

2.单引号的作用:

1)引用一个字符串常量,也就是界定一个字符串的开始和结束。

2)转义符,对紧随其后出现的字符(单引号)进行转义。

3) 表示它本身,也就是它作为一个字符串的一部分而出现在一个字符串常量中,这点与2密不可分。

eg:

SQL> select sysdate from dual;

SYSDATE
------------------
18-APR-16

//以下则表示字符串
SQL> select ‘sysdate‘ from dual;

‘SYSDAT
-------
sysdate

4.group by & count使用

1)、分组的实质就是一行(或多行)中的某一列(或多列)具有相同值。

2)、组是非空的,如果分组成功,组至少包含一个成员(或行)。

3)、组是独特的,意味着,当查询中使用group by时,select列表中就不必使用distinct关键字。

4)、当针对非空表的查询(包含group by)中使用聚集函数count时,它绝对不会返回0。至少会返回一个非0值。

//创建表

SQL> create table fruits (name varchar2(10));

Table created.

//插入数据

SQL> insert into fruits values (‘Oranges’);

1 row created.

SQL> insert into fruits values (‘Oranges’);

1 row created.

SQL> insert into fruits values (‘Oranges’);

1 row created.

SQL> insert into fruits values (‘Apple’);

1 row created.

SQL> insert into fruits values (‘Peach’);

1 row created.

SQL> insert into fruits values (null);

1 row created.

SQL> insert into fruits values (null);

1 row created.

SQL> insert into fruits values (null);

1 row created.

SQL> insert into fruits values (null);

1 row created.

SQL> insert into fruits values (null);

1 row created.

//分组查询1

SQL> select name, count(name) from fruits group by name;

NAME COUNT(NAME)



0

Oranges 3

Apple 1

Peach 1

//分组查询2

SQL> select name, count(*) from fruits group by name;

NAME COUNT(*)



5

Oranges 3

Apple 1

Peach 1

分组查询1&分组查询2对比表明:

count(name)会忽略列的空值行,count(*)不会忽略空值行。

6.Oracle字符集

SQL> select userenv(‘language‘) from dual;
USERENV(‘LANGUAGE‘)
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8

//oracle安装的宿主机查询

[[email protected] rc.d]# echo $NLS_LANG

AMERICAN_AMERICA.AL32UTF8

oracle环境变量中的NLS_LANG是定义客户端的字符集。

比如环境变量NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

但是数据库三个实例的字符集可以分别是:

AMERICAN_AMERICA.AL32UTF8、

AMERICAN_AMERICA.WE8ISO8859P1、

AMERICAN_AMERICA.ZHS16GBK。

5、事务

事务会把数据库从一种一致状态转变为另一种一致状态,这就是事务的任务。

oracle的事务提供了ACID特征:

原子性(atomicity):事务中的所有动作要么都发生,要么都不发生。

一致性(consistency):事务将数据库从一种一致状态转变为下一种一致状态。

隔离性(isolation):一个事务的影响在该事务提交前对其他事务都不可见。

持久性(durability):事务一旦提交,其结果就是永久性的。

其中最重要的特性是它的原子性。

一定要显式地使用commit或rollback来终止你的事务。commit:commit会结束你的事务,并使得已做的所有修改成为永久性的(持久保存)。

6、系统日期、系统时间操作

//系统日期

SQL> create table tb_date(x date);

Table created.

SQL> insert into tb_date values(sysdate);

1 row created.

SQL> select * from tb_date;

X
------------------
18-APR-16

//系统时间

SQL> create table tb_time(stamp timestamp);

Table created.

SQL> insert into tb_time values(sysdate);

1 row created.

SQL> insert into tb_time values(systimestamp);

1 row created.

SQL> select * from tb_time;

STAMP
---------------------------------------------------------------------------
18-APR-16 02.11.57.000000 PM
18-APR-16 02.12.03.242952 PM

截取时间举例(截取年份):

SQL> select trunc(sysdate,‘YYYY‘) from dual;
TRUNC(SYSDATE,‘YYY
------------------
01-JAN-16

7、序列

序列(sequence)是oracle数据库对象中的一个,每次使用时它会自动增加(或减少)。

//创建序列

SQL> create sequence seq1

2 increment by 1

3 start with 1

4 maxvalue 999999

5 minvalue 1

6 cycle

7 nocache;

Sequence created.

//查询序列的nextval值

SQL> select seq1.nextval from dual;

NEXTVAL
----------
1

//查询序列的当前currval值

SQL> select seq1.currval from dual;

CURRVAL
----------
1

//查询序列的 nextval值

SQL> select seq1.nextval from dual;

NEXTVAL
----------
2

SQL> create table tb_stu(id number,name varchar2(40));

Table created.

//用序列作为参数插入表中

SQL> insert into tb_stu values (seq1.nextval, ‘testtest’);

1 row created.

//查询表,能看到序列值的递增。

SQL> select * from tb_stu;

ID NAME



3 testtest

//删除表中数据

SQL> delete from tb_stu;

1 row deleted.

//修改表第一个属性类型

SQL> alter table tb_stu modify id char(1);

Table altered.

//向表中插入数据,注意:插入时,数字型和字符型oracle会自动做转换,序列像一个组件一样在插入记录时直接拿来用。

SQL> insert into tb_stu values (seq1.nextval, ‘test2test2’);

1 row created.

//查询表中数据(序列值仍出现递增)

SQL> select * from tb_stu;

I NAME



4 test2test2

总结:

创建序列语法:

CREATE SEQUENCE sequence_name

[INCREMENT BY n]

[START WITH n]

[{MAXVALUE n | NOMAXVALUE}] 10^27

[{MINVALUE n | NOMINVALUE}] -10^27

[{CYCLE | NOCYCLE }]

[{CACHE n | NOCACHE}];

说明:

INCREMENT BY:每次加几个

START WITH:从几开始

MAXVALUE:最大值是多少,或NOMAXVALUE不设置最大值

MINVALUE:最小值是多少,或NOMINVALUE不设置最小值

CYCLE:累加到最大值之后循环,或NOCYCLE一直累加不循环

CACHE:设置内存里缓存多少个序列,如果系统down掉了内存中的序列会丢失,导致序列跳号,也可以设置为NOCACHE不缓存。

8、存储过程

存储过程:一段程序,用于改变数据库对象的状态,可以包含一个或多个行为,往往是将一个表的记录经过处理后放到另一个表。

说明:和函数的功能非常相似,但又有不同,下节9会有详细的对比不同说明。

//创建存储过程

SQL> CREATE OR REPLACE PROCEDURE proc_1 (num number, name varchar2)

2 IS

3 BEGIN insert into tb_emp1(empno, ename) values (num, name);

4 END;

5

6 /

Procedure created.

//执行存储过程(最后的“/”代表执行,详见本文1. Oracle PL/SQL使用部分描述)。

SQL> BEGIN proc_1(11, ‘laoyang11’);

2 END;

3 /

PL/SQL procedure successfully completed.

//查看执行结果

SQL> select * from tb_emp1;

EMPNO
----------
ENAME
--------------------------------------------------------------------------------
JOB
--------------------------------------------------------------------------------
11
zhang
engineer

11
laoyang11

EMPNO
----------
ENAME
--------------------------------------------------------------------------------
JOB

总结:

创建存储过程的语法格式:

CREATE [OR REPLACE] PROCEDURE procedure_name

[(parameter_name [IN | OUT | IN OUT] TYPE[,….])]

{IS | AS }

[LOCAL declarations]

BEGIN

executable statements;

[EXCEPTION

exception_statements;

END procedure_name;

9、函数

函数的作用是计算一个功能,往往是用来计算并返回一个计算结果。

//创建函数(含参数)。

//返回number类型的数据。

SQL> CREATE OR REPLACE FUNCTION sal_tax

2 (v_sal number)

3 return number

4 is

5 begin

6 if (v_sal < 2000) then

7 return 0.10;

8 elsif (v_sal < 2750) then

9 return 0.15;

10 else

11 return 0.20;

12 end if;

13 end;

14 /

Function created.

//查询

SQL> select sal_tax(2000) from dual;
SAL_TAX(2000)
-------------
          .15

SQL> select sal_tax(5555) from dual;
SAL_TAX(5555)
-------------
           .2

//函数中没有参数的,可以不加()。

//函数中一般不会用dbms_output.put_line打印信息,因为函数是用来计算并返回一个计算结果的,当然加了打印也没关系(测试后也验证了:不会打印)

SQL> CREATE OR REPLACE FUNCTION hello RETURN VARCHAR2 IS

2 var VARCHAR2(40) := ‘hello function’;

3 BEGIN

4 –dbms_output.put_line(‘aaaaaaaaaaa’);

5 return var;

6 END;

7 /

Function created.

SQL> select hello from dual;
HELLO
--------------------------------------------------------------------------------
hello function

总结:

函数的基本语法格式:

CREATE [OR REPLACE] FUNCTION function_name

[(parameter_name [IN | OUT | IN OUT] TYPE[,….])]

RETURN TYPE

{IS | AS}

BEGIN

FUNCTION BODY

END function_name;

重点————函数和存储过程的区别:

1)函数和过程比较类似,不同的是函数必须返回一个值,而存储过程仅是为了执行一系列的操作。

2)在调用的时候,函数可以作为表达式的一部分进行调用,并且可以使用在SELECT中。而存储过程只能作为一个PL/SQL语句进行调用,且不能在SELECT语句中使用。

3)函数的语法结构和存储过程比较类似,除了函数使用FUNCTION进行定义之外。外一个重要的特点就是,函数具有RETURN子句,指定函数的返回类型。

4)函数和存储过程都可以使用out参数来返回内容。

2016-4-17 am0:30

作者:铭毅天下

转载请标明出处,原文地址:http://blog.csdn.net/laoyang360/article/details/51189292

如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

时间: 2024-10-30 17:32:50

oracle进阶实战笔记的相关文章

oracle进阶笔记-基础准备-oracel-linux安装

Oracle 11g 在RedHat Linux 5.8_x64平台的安装手册 搭建环境:VM10 + RedHat 5.8_x64 +oracle 11g (grid+db) 步骤简述: 1.在电脑上安装VMware软件 2.创建一个RedHat5.8_x64系统的虚拟机完成系统安装,并配置系统基本的操作环境 3.检测环境是否符合Oracle的最低安装要求,并安装软件包和系统补丁 4.创建用户和组,并设置工作角色分离,修改内核参数设置用户资源控制 5.创建ASM并安装grid 6.安装Orac

oracle进阶笔记-基础准备-sqlplus用户登录

1 sqlplus 登录 本地登录 (登录数据库服务器) oracle 登录 sqlplus 账户名/密码 as 角色名 1.1 sys登录 例如: sqlplus sys/oracle ERROR: ORA-28009: connection as SYS should be as SYSDBA or SYSOPER sys管理员必须有角色sysdba [[email protected] ~]$ sqlplus sys/oracle as sysdba 执行show user ; SQL>

oracle进阶笔记-常用工具的使用-oracle sql developer

oracle sql developer 类似于plsqldeveloper 下载地址;http://www.oracle.com/technology/products/database/sql_developer/index.html 安装工具 解压就OK 打开 首先必须建立一个对数据库连接 1 连接名(任意) oracle11g_connect 输入账户名sys 密码 oracle 连接方式 基本 角色 sysdba 主机名: 数据库服务器主机名或者ip地址 192.168.3.1 侦听的

oracle进阶笔记-管理员1-数据库逻辑结构

-------------------------------逻辑结构------------------------------------ 参考文档:12章 tablespace 表空间 最大存储单位 建立对象指定存储在那个表空间 Segment 段: 可以存储数据 表段(建立表xs 一定建议个段xs段) Extent 区 :空间分配单位 (至少对象一个区) Oracle data block 数据库块 最小i/0单位 连续的数据块就组成区 存储同一类型的数据区域成为一个段 一个段只在一个表

For与Function进阶实战、Lazy的使用笔记总结

本期内容: 1:For循环的进阶实战,(更多的实战代码) 2:Function进阶实战,(Function更多的定义和实现方式) 3:Lazy的使用,(延迟加载) For循环常用: for(i <- 1 to 2; j <- 1 to 2 if i!=j){ println((100*i+j)+" ") } Function函数: 注意:(特别重要) 1:scala中的函数是一定有值返回的,但可以在声明时不明确指定函数的返回值,代码块中的最后一个参数作为scala函数的返回

定向爬虫实战笔记

定向爬虫实战笔记 流程图如下: 来自追女神助手(痴汉)v0.1: 1.#-*-coding:utf8-*-2.3.import smtplib4.from email.mime.text import MIMEText5.import requests6.from lxml import etree7.import os8.import time9.import sys10.reload(sys)11.sys.setdefaultencoding('utf-8')12.13.14.15.clas

004-For与Function进阶实战、Lazy的使用

004-For与Function进阶实战.Lazy的使用 For进阶 非常常见的形式 可以加入条件表达式进行数据过滤 Function进阶 函数是有值的(默认的话为Unit),所以可以直接将结果赋值给变量 =>(可理解为做法)匿名函数的使用 只对函数的做法关心并不关心函数的名字 匿名函数执行方法 函数的值赋值给一个变量 通过变量的名称加上()(括号进行函数传值) 递归调用时候必须要声明函数的返回值类型 函数中参数的默认初始化 如果在调用中传递参数的值会覆盖掉初始化的值 可变参数的定义 Lazy的

Oracle Rac11g 学习笔记

查看集群节点状态 命令是olsnodes -i 显示每个节点的VIP, -n 显示每个节点在RAC集群中的编号 -p 显示每个节点所使用的私有IP地址 -s 显示每个节点的状态(activive或者inactive) 列车集群中所有资源 crs_stat -t 查看crs资源状态 crsctl check crs 查看ctss服务的状态 crsctl check ctss 查看集群中所有节点状态 crsctl check cluster -all 查看ASM实例进程 ps -ef | grep

机器学习实战笔记6(SVM)

鉴于July大哥的SVM三层境界(http://blog.csdn.net/v_july_v/article/details/7624837)已经写得非常好了,这里我就不详细描述,只是阐述简单的几个概念.如果看SVM三层境界有困惑,我也愿意与大家交流,共同进步. 简单概念描述: (1)      支持向量机(SVM, support vectormachine)就是通过最大化支持向量到分类超平面之间的分类间隔.分类超平面就是我们想要得到的决策曲面:支持向量就是离分类超平面最近的点,而间隔即为支持