Oracle 基本 以及 plsql 语句

Oracle

一、基本SQL语句
1、综述
基本SQL 语句分为DDL、DML、DCL和TCL 四种: 
(1)DDL 数据定义语言 —————> 对表结构、索引和同义词的操作 
(2)DML数据操作语言 —————> 表数据的增删改查 
(3)DCL 数据控制语言 —————> 授权和收回权限 
(4)TCL 事务控制语言 —————> commit、rollback、savepoint

2、DDL 数据定义语言
(1)表
A.创建 
–创建表

create table tbl_person(
       pid number(11) primary key,
       pname varchar(20),
       psex varchar(4) not null,
       pposition varchar(20),
       constraint per_u unique (pname),
       constraint per_c check (psex in ('boy','girl'))
)
--constraint 对表字段添加约束 (unique 、check 、primary key 、 foreign key)
1
2
3
4
5
6
7
8
9
B.删除 
–删除表

drop table tbl_person;
1
C.修改 
–添加新字段 
alter table tbl_person add page number(4); 
–修改字段名 
alter table tbl_person rename column page to age; 
–修改字段数据类型 
alter table tbl_person modify (age varchar(4)); 
–删除字段 
alter table tbl_person drop column age; 
–修改表名 
rename tbl_person to t_person; 
rename t_person to tbl_person; 
–删除约束 
alter table tbl_person drop constraint per_u; 
–添加约束 
alter table tbl_person add constraint per_u unique (pname); 
–禁用约束 
alter table tbl_person disable constraint per_u; 
–启用约束 
alter table tbl_person enable constraint per_u;

(2)索引
A.创建 
–创建索引 感觉就是目录 根据某种顺序便于查找之类的

create index name_in on tbl_person(pid desc); 
1
B.删除 
–删除索引

drop index  name_in;
1
(3)同义词
A.创建 
–创建同义词 同义词就是给表或视图取一个别名

CREATE SYNONYM <synonym_name> for <tablename/viewname>
1
Eg:create synonym mm for emp;

B.删除 
–删除同义词

drop  synonym  mm;
1
3、DML数据操作语言
(1)增删改——update

insert into tbl_person values(tbl_person_seq.nextval,'zhangsan','boy','snncjj');
insert into tbl_person values(tbl_person_seq.nextval,'lisi','boy','snncjj');

update tbl_person set pposition = 'ajkaj' where pid=5;

delete from tbl_person where pid=5;
1
2
3
4
5
6
(2)查—–query

select * from tbl_person;
select count(*)  from tbl_person;
select pname  from tbl_person where pid = 4;
1
2
3
一般查询

SELECT [DISTINCT] <column1 ,columns2,...>
                        -- DISTINCT --表示隐藏重复的行
FROM <table1>
[WHERE <条件>]   WHERE --按照一定的条件查找记录
[GROUP BY <column_list>]   GROUP BY --分组查找(需要汇总时使用)
[HAVING <条件>]                                             HAVING --分组的条件
[ORDER BY <column_list> [ASC|DESC]]  
                            -- ORDER BY --对查询结果排序
1
2
3
4
5
6
7
8
聚集函数—-只能放在select或者having下面 
SUM –求和 
AVG –求平均值 
MAX –求最大值 
MIN –求最小值 
COUNT –求个数

子查询

SELECT <字段列表> from <table_name> where 字段 运算符(<SELECT 语句>);
eg:select * from emp where sal=(select max(sal) from emp);
1
2
Any 运算符

select * from emp where sal>ANY(select sal from emp where deptno=30) and deptno<>30;
--找出比deptno=30的员工最低工资高的其他部门的员工
1
2
ALL 运算符

select * from emp where sal>ALL(select sal from emp where deptno=30) and deptno<>30;
--找出比deptno=30的员工最高工资高的其他部门的员工
1
2
连接查询

SELECT <字段列表> from <table1,table2> WHERE table1.字段[(+)]=table2.字段[(+)]
eg:select empno,ename,dname from emp,dept where emp.deptno=dept.deptno;
1
2
分页—rownum

select * from emp where rownum<=10;--查询前10行记录
select * from emp where rownum<=3 and empno not in (
    select empno from emp where rownum<=3);     
    --查询第3到6行记录 

SELECT * FROM   
(  
SELECT A.*, ROWNUM RN   
FROM (SELECT * FROM TABLE_NAME) A   
WHERE ROWNUM <= 40  
)  
WHERE RN >= 21  
1
2
3
4
5
6
7
8
9
10
11
12
4、DCL 数据控制语言
(1)授权

GRANT <权限列表> to <user_name>;
1
(2)收回权限

REVOKE <权限列表> from <user_name>
1
5、TCL 事务控制语言
COMMIT 提交 
– ROLLBACK 撤销数据更新 返回到事务开始时的状态 或者回退到保存点 注意:回退到更上层的保存点之后,下层的会失效 
– SAVEPOINT 保存点

二、Oracle其他对象
1、视图
创建视图

CREATE [OR REPLACE] VIEW <view_name>  AS  <SELECT 语句>;
1
删除视图

DROP VIEW <view_name> 
1
2、序列
创建序列

CREATE SEQUENCE <sequencen_name> 
INCREMENT BY n
START WITH n
[MAXVALUE n][MINVALUE n]
[CYCLE|NOCYCLE]
[CACHE n|NOCACHE];

INCREMENT BY n --表示序列每次增长的幅度;默认值为1
START WITH n --表示序列开始时的序列号。默认值为1
MAXVALUE n --表示序列可以生成的最大值(升序)
MINVALUE n --表示序列可以生成的最小值(降序)
CYCLE --表示序列到达最大值后,在重新开始生成序列.默认值为 NOCYCLE
CACHE --允许更快的生成序列
1
2
3
4
5
6
7
8
9
10
11
12
13
使用序列

CURRVAL 返回序列的当前值. 
注意在刚建立序列后,序列的CURRVAL值为NULL,所以不能直接使用。 
可以先初始化序列: 
方法:select .nextval from dual; 之后就可以使用CURRVAL属性了

NEXTVAL 返回序列下一个值; 
可以表示记录ID的自增: 
insert into tbl_person values(tbl_person_seq.nextval,’lisi’,’boy’,’snncjj’);

修改序列

ALTER SEQUENCE <sequencen_name> 
INCREMENT BY n
START WITH n
[MAXVALUE n][MINVALUE n]
[CYCLE|NOCYCLE]
[CACHE n|NOCACHE];
1
2
3
4
5
6
删除序列

DROP SEQUENCE <sequence_name> 
1
3、用户
创建用户

CREATE USER <user_name> [profile "DEFAULT"]
identified by "<password>" [default tablespace "USERS"]
1
2
删除用户

DROP USER <user_name> CASCADE;
1
4、角色 
创建角色

CREATE  ROLE  <role_name>  identified by "<password>"
1
删除角色

DROP ROLE <role_name>
1
三、Pl/SQL
pl/sql 过程化SQL语言 是Oracle 数据库对标准数据库语言SQL的扩展,把数据库技术和过程化程序设计语言联系起来 
简而言之 pl/sql就是可以过程化的操作SQL语句

1、Pl/SQL结构
DECLARE           --声明部分
   声明语句
BEGIN             --执行部分
   执行语句
EXCEPTION         --异常处理部分
   执行语句
END;
1
2
3
4
5
6
7
变量声明 
<变量名> 类型 [:=初始值]; 
1、特殊类型======字段%type 
eg: name emp.ename%type –表示name的类型和emp.ename的类型相同

2、表类型===========%rowtype 
eg:test emp%rowtype 
–表示test的类型为emp表的行类型;也有 .empno; .ename; .sal ;等属性 
常量声明 
<变量名> CONSTANT 类型:=初始值; 
示例: pi constant number(5,3):=3.14;

全局变量声明 
VARIABLE <变量名> 类型; 
示例: VARIABLE num number;

使用全局变量 
:<变量名> 
示例: 
:num:=100; 
i=:num;

查看全局变量的值 
print <变量名> 
示例: print num;

赋值运算符: := 
示例: num := 100; 
使用SELECT <列名> INTO <变量名> FROM <表名> WHERE <条件> 
注意select into 语句的返回结果只能为一行; 
示例:test emp%rowtype; 
select * into test from emp where empno=7788;

用户交互输入 
<变量>:=’&变量’ 
示例: 
num:=# 
注意oracle的用户交互输入是先接受用户输入的所有值后在执行语句; 
所以不能使用循环进行用户交互输入;

条件控制语句 
IF <条件1> THEN 
语句 
[ELSIF <条件n> THEN 注意是ELSIF 
语句] 
[ELSE 
语句] 
END IF;

循环控制语句 
1.LOOP 
LOOP 
语句; 
EXIT WHEN <条件> 
END LOOP;

2.WHILE LOOP 
WHILE <条件> 
LOOP 
语句; 
END LOOP;

3.FOR 
FOR <循环变量> IN 下限..上限 
LOOP 
语句; 
END LOOP;

NULL 语句 
null; 
表示没有操作;

注释使用 
单行注释: – 
多行注释:/* ………………….*/

异常处理

EXCEPTION 
WHEN <异常类型> THEN 
语句; 
WHEN OTHERS THEN 
语句; 
END;

2、过程
存储过程 类似函数,需要调用存储过程名称

定义:存储过程(Stored Procedure)是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程在创建时即在服务器上进行编译,所以执行起来比单个 SQL 语句快。

存储过程的优点: 
(1)存储过程只在创造时进行编译,以后每次执行存储过程都不需 
再重新编译, 而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行 
速度; 
(2) 当对数据库进行复杂操作时(如对多个表进行 Update, Insert, Query, Delete 时) , 
可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用; 
(3)存储过程可以重复使用,可减少数据库开发人员的工作量; 
(4)安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

存储过程的缺点: 
(1)如果更改范围大到需要对输入存储过程的参数进行更改,或者 
要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调 
用, 等等, 这时候估计比较繁琐了。 
(2) 可移植性差。 
由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。

存储过程和函数的区别

过程没有返回值 通过参数的in、out和in out 决定是传入参数还是输出参数 
函数有返回值 功能没有过程强大


–in out 参数


– in 参数 和 out参数


–不能在参数里面定义变量的大小 不然创建的过程会有一个×


3、函数
函数 
–参数不能设置变量大小 
–但是变量声明时 如下面的m 因为要把tbl_person里pname的值传给m,所以m的类型必须完全与pname相同


–函数


4、包
包 管理过程和函数的东西 这两个东西都可以放在包里面 
–包头: 公共部分 和 包体:私有部分 
– 公共部分放过程函数声明 
– 包体放过程和函数的具体实现

5、数据库链接
数据库链接 database link 
–可以直接 用本地数据库通过 数据库链接 访问远程数据库的 表 
–1.需要有create database link 系统权限 
–2.登录本地数据库 
–3.CREATE DATABASE LINK 链接名 CONNECT TO 账户 IDENTIFIED BY 口令 USING 服务名; 
–4.访问远程数据库的表 表名@数据库链接名 
– 表名@数据库链接名 相当于在本地数据库中直接使用的表名

6、Job
job 定时任务 可设置定时调用过程或函数或包 实现数据库的定时操作

–创建一个job 实现每3秒钟往下表中插入当前时间

--创建序列

create sequence time_job_seq increment by 1 start with 1 maxvalue 999 minvalue 1 nocycle nocache;

--创建过程  实现每次调用过程就在time_jobTest表中插入当前时间
create or replace procedure set_time_job_value as
begin
  insert into time_jobTest values(time_job_seq.nextval,sysdate,'123');
end;

‘set_time_job_value;’ 注意这里有个分号 千万不能掉 
what值是有一个分号的 千万别掉了 掉了会报好几个错 ora 06550 ora 06512 什么’end’值之类的


7、触发器
触发器 
select * from time_jobTest; 
delete from time_jobTest where 1=1;

select * from tbl_person;

alter table time_jobTest add t_type varchar(20);

select * from time_jobTest; 
delete from time_jobtest;

–创建触发器 person_log 
–实现每次对表tbl_person增删改记录的时候 在time_jobTest里插入增删改的信息


for each row –表示是行级触发器 不加这句的话默认是语句触发器


注意这里是elsif 不是else if


:new 和 :old 的使用
new — 触发器执行过程中触发表作操作的当前行的新纪录

old — 触发器执行过程中触发表作操作的当前行的旧纪录
**要注意 
1、必须是行级触发器。

因为:new或者:old是当前触发表操作的当前行的新数据或者旧数据,所以必须在行级触发器中才能使用。 否则编译时会出现错误。

2、当触发器被不同事件触发时,需要注意:

insert触发操作 只 :new
delete触发操作 只 :old
update触发操作 都行

如果违反上述操作中随意使用:new或者:old不会在编译时报错误但是会发现使用这两个关键字无效。

3、使用触发器时如果要修改:new的值需要注意:

只行级前触发器才能修改:new的值,而行级后触发器不可以。

因为行级前触发器是在本行DML操作之前,所以才能修改:new的值。从逻辑上说,也只在这时修改才意义。 如果行级后触发器要试图修改:new的值会报变异错误。从逻辑上说后触发器的执行已经在本行DML操作,以后了, 再修改:new的值已经不会对数据产生影响了。

4、当在触发条件中使用:new或者:old的时候注意,只能直接写 old或者new,不能带符号”:”否则会出错。

–触发器种类

–DDL触发器 针对表中的数据操作 insert update delete 这些会有相应的触发事件 
–DML触发器 针对表的操作 create drop alter 
–数据库触发器 针对数据库的操作 startup shutdown logon logoff severerror

–行级触发器对DML语句影响的每个行执行一次。 
–语句级触发器对每个DML语句执行一次,

事件

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PL/SQL编程 pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展。pl/sql不仅允许嵌入式sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误。这样使得他的功能变的更强大。缺点是移植性不好。 编写一个存储过程,向表中添加数据。 1. create table mytest (name varchar2(30),passwd varchar2(30)); 2. create or replace procedure xxc_pro1 is begin insert into mytest values ('小红','m123'); end; 3. 调用过程 exec 过程名(参数1,参数2…)或call 过程名参数1,参数2…) ① exec xxc_pro1; 或者是 ② call xxc_pro1; pl/sql可以做什么? 块:包括过程、函数、触发器、包。 编写规范: 1. 注释 --:单行注释 eg:select * from emp where empno=7788;--取得员工信息 /*……*/多行注释 2. 表示符号(变量)的命名规范: ① 当定义变量时,建议用v_作为前缀:v_ename ② 当定义常量时,建议用c_作为前缀:c_rate ③ 当定义游标时,建议用_cursor作为后缀:emp_cursor ④ 当定义例外时,建议用e_作为前缀:e_error 块(block)是pl/sql的今本程序单元,编写pl/sql程序实际上就是在编写pl/sql块;pl/sql块由三部分组成:定义部分,执行部分,例外处理部分。 declare --可选部分 /*定义部分:定义常量,变量,游标,例外,复杂数据类型*/ begin --必选部分 /*执行部分:要执行的pl/sql语句和sql语句*/ exception --可选部分 /*例外处理部分:处理运行的各种错误*/ 实例1:只包含执行部分的pl/sql块 SQL> set serveroutput on --打开输出 SQL> begin 2 dbms_output.put_line('hello'); 3 end; 4 / 说明:dbms_output是oracle提供的包,该包包含一些过程,put_line就是其中之一。 实例2:包含定义部分和执行部分 SQL> declare 2 v_ename varchar2(5); 3 begin 4 select ename into v_ename from emp where empno = &no; 5 dbms_output.put_line('雇员名'||v_ename); 6 end; 7 / 说明:&:从控制台输入变量,会弹出一个对话框。 实例3.同时输出雇员名和工资 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno=&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 end; 8 / 包含定义,执行,和例外处理的pl/sql块。 实例4.当输入的员工号不存在时 SQL> declare 2 v_ename varchar2(20); 3 v_sal number(10,2); 4 begin 5 select ename,sal into v_ename,v_sal from emp where empno =&no; 6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 exception --异常处理部分 8 when no_data_found then 9 dbms_output.put_line('请输入正确的员工号!'); 10 end; 11 / 以上为块的基础,下面来介绍块的各个组成:过程,函数,触发器,包。 过程 过程用于执行特定的操作,当执行过程的时候,可以指定输入参数(in),也可以指定输出参数(out)。通过在过程中使用输入参数,可以讲数据输入到执行部分,通过使用输出参数,可以将执行部分的数据输出到应用环境,在pl/sql中可以使用create procedure命令来创建过程。 编写一个存储过程,可以输入雇员名和新工资来改变员工工资。 --案例 create or replace procedure xxc_pro3(newname in varchar2,newsal in number) is begin update emp set sal=newsal where ename=newname; end;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值