Oracle数据库PL/SQL学习笔记(一)
来源:互联网 发布:精准扶贫平台 网络 编辑:程序博客网 时间:2024/06/08 11:09
Oracel数据库的基本管理:
<span style="font-size:18px;">create tablespace test datafile 'E:\app\Administrator\oradata\orcl\test.dbf' --注意:名称test不要带引号size 100Mautoextend on next 2M maxsize 2048Mextent management local; --默认是本地管理,本地管理表空间与字典管理(dictionary)表空间相比大大提高了管理效率和数据库性能 alter tablespace test rename to test2; --改变表空间的名称 create user wanli identified by 123456 default tablespace test ACCOUNT UNLOCK; --解锁用户ALTER USER username ACCOUNT UNLOCK; --解锁用户grant connect,resource to wanli; --普通用户grant DEBUG CONNECT SESSION to wanli; --赋予用户断点测试的权限grant dba to wanli; --DBA管理用户</span>
sql语句的分类:
DDL--数据定义语言
create,alter,drop,rename,truncate,comment
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:
二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE
速度快,且使用的系统和事务日志资源少。
DML--数据操作语言
select,insert,update,delete和merge
merge关键字:
merge是insert和update的合并。连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
DCL--数据控制语言
grant和revoke 授权和撤销权限
TCL--事务控制语言
commit,rollback和savepoint
pl/sql不区分大小写
但是通常会对命令单纯使用大写形式,而对变量、列名和存储过程调用使用小写形式。
pl/sql支持2中类型的程序:
1.匿名块程序,支持批脚本。
2.命名块程序,提供存储编程单元。
匿名程序块结构:必须有执行部分,最简单的是null
语法:
declare
声明部分
begin
执行部分
[exception
异常处理部分
]
end;
声明部分:包含变量定义和声明,用户定义的pl/sql类型定义,游标定义、引用游标定义
和局部函数或过程的定义。
执行部分:包含变量赋值、对象初始化、条件结构、迭代结构、嵌套的pl/sql匿名块,或者
是对局部或存储pl/sql命名块的调用。
异常部分:包含错误处理短语,该短语可以像执行部分一样使用所有项。
变量
包含标量和复合变量
标量变量:只保存一个指。
复合变量:可保存多个值。
赋值:
Oracle赋值使用 :=
nvl()函数:
nvl(my_var,false) 如果my_var为null,则设置my_var的值为false;
基本控制结构:
检查逻辑添加和控制分支程序执行,还有一个是迭代条件直到添加满足或被命令退出。
1.条件结构
1》 if 条件1 then
null;
else
null;
end if;
2》多条件判断
if-then-elsif-then-else
2.case语句
case搜索语句:
case true
when 条件1 then
执行1;
when 条件2 then
执行2
when 条件3 then
执行3
else
默认执行
end case;
3.迭代结构
(1)
for循环包括数值for循环和游标for循环。通过使用显示的continue或exit语句分别跳过迭代或强制从循环中提早退出
for循环隐式管理其开始和结束(没有loop和end loop),不支持引用游标(refcursor),迭代引用游标只能使用显示循环结构,如简单循环和while循环。
数值for循环: starting_number .. ending_number 开始值和结束值必须是整数,中间是两个".."
begin
for i in 1..10 Loop
dbms_output.put_line('The index value is ['||i||']');
end loop;
end;
游标for循环:
for i in (游标名|sql语句) loop
执行语句;
end loop;
如果用游标名调用,就是显示游标。如果用sql语句,就是使用隐式游标。
游标for循环中索引变量不是interger数字,它是游标返回的记录结构的引用。
可以通过点号将游标索引变量和列名组合。
--隐式游标for循环(i相当于一条记录,能直接通过 i.字段名获得对应的字段值)
begin
for i in (select * from SCOTT.EMP t) loop
dbms_output.put_line('The name is ['||i.ename||']');
end loop;
end;
(2)简单循环
是显示结构,要求用户管理循环索引和退出条件。一般与局部定义的游标和引用游标(ref cursor)一起使用。
游标的几个特性:%found,%notfound,%isopen和%rowcount
declare
emp_name SCOTT.EMP.ENAME%type;--根据表的指定字段的数据类型定义变量
cursor cur is select t.ename from SCOTT.EMP t;
begin
open cur;
loop
fetch cur into emp_name;
dbms_output.put_line('The name is ['||emp_name||']');
exit when cur%notfound;
end loop;
close cur;
end;
(3)while循环
要先检查循环进入条件
declare
emp_name SCOTT.EMP.ENAME%type;
cursor cur is select t.ename from SCOTT.EMP t;
begin
open cur;
while cur%isopen loop
fetch cur into emp_name;
if cur%notfound then
close cur; --关闭游标,不能通过while循环的条件判断,自然结束循环
end if;
dbms_output.put_line('The name is ['||emp_name||']');
end loop;
end;
PL/SQL存储编程单元:
函数,过程,包和触发器,存储对象类型
在Oracle中,
函数、过程、包和对象都存在同一个命名空间中。
触发器存储在另一个命名空间。
基本结构:
create or replace function 函数名
(参数名 数据类型)
return 返回结果类型
declare
变量定义
begin
执行sql语句
return 结果值;
exception
异常处理
end;
因为函数返回的是sql数据类型,所以可以左右pl/sql赋值中的右操作数,也可以直接从sql语句中调用、
如:
select greatest(12,34) from dual; --在sql中调用greatest函数
declare
var2 number(10);
begin
var2 := greatest(11,10,50,69); --在
dbms_output.put_line('The name is ['||var2||']');
end;
在命令窗口,可以使用call 函数 给会话级绑定变量赋值
SQL> variable var3 varchar2(30);
SQL> call join_strings('hello','word') into :var3;
SQL> select :var3 from dual;
--注意,所有的参数都要声明后再使用
create or replace function getName(userid number) return varchar2 is
name_value varchar2(30);
id number(10);
begin
id := userid;
select t.name into name_value from tb_user t where t.userid = id;
return(name_value);
end getName;
存储过程:
不能作为右操作数,也不能用于sql语句。
语法:
create procedure 存储过程名
[参数名 in|out类型 数据类型] is
begin
执行sql语句
[异常处理]
end;
事务控制和异常捕捉:
begin
savepoint new_member;--设置回滚点
insert into tb_user t values(51,'wanli',22,'123');
insert into tb_user t values(51,'wanli',22,'123');
dbms_output.put_line('both succeeded');
commit; --提交
exception
when others then --when others 能够截取所有的异常,一般放在异常处理的最后。
rollback to new_member; --回滚到设置的回滚点
dbms_output.put_line(Sqlerrm);--输出错误信息
end;
触发器:
正因为触发器实在某个时刻运行,因此不能在触发器中使用sql dcl语句:
savepoint,rollback,或commit。
Oracle中的特殊字符:
:= 赋值
:变量名 指定标识符为会话级变量
&变量名 指定标识符为替换变量(可接受输入值)
= 比较运算符
日期格式的赋值:
字符串格式化为时间,最好使用to_date();
不支持隐式转化。即不能直接给 字符串格式的字符给 日期类型的变量。
relative_date := '01-jun-07';
date_1 := to_date('20140912','yyyy-mm-dd');
date_2 := cast('01-jun-07','mon-dd-yy') XXXXX ----经验证,已不能使用。
extract()内置函数可以从date值中获取数值型年月日。
复合数据类型:
主要有两种复合数据类型:记录和集合。
记录,也称结构体,包含相关元素的集合。相当于java的bean,或者类。
集合,事物集,相当于java的集合。
定义记录的语法:
type 记录名 is record
(变量1 数据类型1,
变量2 数据类型2,
)
例:
declare
type demo_record_type is record(
id number default 1,
value varchar2(10) := 'one'
);
demo demo_record_type;
begin
dbms_output.put_line('['||demo.id||']['||demo.value||']');
end;
集合:
是数组和列表。
1.varray数据类型 --类似java中的数组
--自定义数组(varray)
declare
type number_varray is varray(10) of number; --类型number_varray是包含10个数字的number类型的varray数组
list number_varray := number_varray(1,2,3,4,5,6,7,8,null,null); --变量list的类型是number_varray,并初始化
begin
for i in 1..list.limit loop --limit返回最大尺寸
dbms_output.put('['||list(i)||']');
end loop;
dbms_output.new_line;
end;
declare
type number_table is table of number; --类型是table,包含的是number,不用声明长度
list number_table := number_table(1,90,3,4,5,6,7,8);
begin
list.delete(2); --删除第二个元素,但不删除已分配的空间
dbms_output.put_line(list.count);
dbms_output.put_line(list.limit); --table没有limit属性,只有varray数组才有limit属性
for i in 1..list.count loop
if list.exists(i) then
dbms_output.put('['||list(i)||']');
end if;
end loop;
dbms_output.new_line;
end;
--联合数组数据类型 (类似set集合) 特点:无序 稀疏,大小不固定
--和嵌套表定义非常相似,主要不同点:指定了如何进行索引 index by Pls_Integer 或者 index by varchar2(10)
declare
type number_table is table of number index by Pls_Integer;
list number_table;
begin
for i in 1..8 Loop
dbms_output.put_line('The index value is ['||i||']');
list(i):= i;
end loop;
dbms_output.put_line(list.count);
list.delete(2); --和varray和嵌套表中不同,删除元素时也会删除已分配的空间
dbms_output.put_line(list.count);
for i in 1..list.count loop --由于count变小,所有最后一个值8查不到
if list.exists(i) then
dbms_output.put('['||list(i)||']');
end if;
end loop;
dbms_output.new_line;
end;
游标
类型:隐式游标和显示游标
显示游标:在声明块中定义的游标,都属于显示游标。
隐式游标:任何执行块或异常块中的DML语句都是隐式游标。(包括insert,update,delete)
--引用游标
--弱类型的引用游标没有返回类型,强类型的引用游标有返回类型
--主要作用: 实现在程序间传递结果集的功能,在同一过程中使用引用游标没有意义。
declare
type weakly_typed is ref cursor;
quick weakly_typed;
v_a1 varchar2(30);
v_b1 number(10);
begin
open quick for
select t.name,t.age from tb_user t;
/* loop
fetch quick into v_a1,v_b1;
dbms_output.put_line(v_a1||'今年'||v_b1||'岁');
exit when quick%notfound;
end loop;*/
end;
0 0
- Oracle数据库PL/SQL学习笔记(一)
- Oracle PL/SQL学习笔记(一)
- ORACLE PL/SQL 集合学习笔记(一)
- Oracle PL/SQL 上课学习笔记(一)
- oracle PL-SQL学习案例(一)
- Oracle PL/SQL 学习笔记 (2)
- Oracle PL/SQL 学习笔记(1)
- Oracle PL/SQL 学习笔记(二)
- Oracle PL/SQL 学习笔记(三)
- Oracle PL/SQL 学习笔记(四)
- Oracle学习笔记(三)PL/SQL
- PL/SQL学习笔记(一)
- pl/sql学习笔记(一)
- PL/Sql 学习笔记---(一)
- pl/sql基础知识学习笔记(一)
- Oracle PL/SQL学习笔记
- oracle学习笔记 ---- PL/SQL
- Oracle--PL/SQL学习笔记
- 软件测试if else路径开源代码java中java.util.Date里面的pase方法
- 如何判断链表有环
- 足球碳分子的搭建
- hdu 1028 Ignatius and the Princess III(母函数)
- The library `xxx.jar` contains native libraries that will not run on the device.
- Oracle数据库PL/SQL学习笔记(一)
- 图解使用CygWin进行Linux操作和编程
- 如何运行微商行业整合营销???
- SQL注入之SQLmap入门
- Java源码分析之Object
- VC控件大小和字体设置
- Latex中一些细节
- HDU 5206 Four Inages Strategy
- 深入理解计算机--字节顺序