PLSQL.docx
《PLSQL.docx》由会员分享,可在线阅读,更多相关《PLSQL.docx(36页珍藏版)》请在冰点文库上搜索。
PLSQL
常见访问oracle的技术
PLSQL过程化sqlprocedure(存储过程)
pro*c/c++使用c和c++访问oracle数据库
odbc/adovc访问数据库的技术
sqlj/jdbcjava访问数据库的技术
PL/SQL
PL/SQL(ProceduralLanguage/SQL)是在标准SQL的基础上增加了过程化处理的语言。
plsql扩展了sql
变量和数据类型
控制结构ifforgoto
过程和函数
对象类型和方法
PL/SQL程序结构
QL/SQL块
声明部分,declare//声明区,定义变量和定义类型
执行部分,begin//执行区,执行sql语句和qlsql语句
异常处理,exception//异常处理区,处理错误的区域
结束,end;
sqlplus命令行下的开发工具
图形开发工具:
plsqldevelopersqlprogramer
设置输出
setserveroutputon//设置输出
begin
dbms_output.put_line(‘helloplsql’);
end;
/
1.变量的声明和定义
declare
var_idnumber:
=100;/*变量定义和初始化*/
var_namevarchar2(30):
='test';
begin
dbms_output.put_line(var_id||':
'||var_name);
end;
2.变量的赋值
declare
var_idnumber;/*变量定义和初始化*/
var_namevarchar2(30);
begin
var_id:
=1001;
var_name:
='test';
dbms_output.put_line(var_id||':
'||var_name);
end;
3.变量的修饰
constantnotnull
eg.var_idconstantnumber:
=100;
var_namevarchar2(30)notnull:
=’a’;
一个变量声明为notnull必须赋初值,因为任何一个变量定义之后不赋值值都是null。
4变量数据类型
1.标量型(基本类型)
a)数字型(number,binary_integer)
b)字符型(char,varchar2(0-4K))
c)布尔型(boolean:
true,false,NULL)
d)日期型(date)
2.组合型
a)RECORD,TABLE,
3.参考类型引用类型
a)refcursor
4.大类型
a)CLOB(0-4G)
b)BLOB(0-4G)
c)BFILE(0-4G)(一般不使用这种类型,因为存储数据的路径就可以解决问题)
eg.
NUMBER(4,3)123.4567//错误超出精度
NUMBER(3,-3)1234//1000
NUMBER(4,6)0.0012345//0.001235
5.定义两个变量分别和s_emp表中id和first_name的类型相同
把id=1的数据赋值给这个两个变量然后输出
declare
var_idnumber(7);
var_namevarchar2(25);
begin
selectid,first_nameintovar_id,var_namefroms_empwhereid=1;
dbms_output.put_line(var_id||var_name);
end;
6.使用%type得到表的字段对应的类型
表名.字段名%type
declare
var_ids_emp.id%type;
var_names_emp.first_name%type;
begin
selectid,first_nameintovar_id,var_namefroms_empwhereid=2;
dbms_output.put_line(var_id||':
'||var_name);
end;
7.把s_emp表中的idfrist_namesalary对应的类型取出来定义变量,然后把id=1的数据赋值给first_namesalary输出这些信息
8.记录类型record类型
/*定义一个类似于c语言结构体类型*/
type类型名isrecord(
字段名类型,
字段名类型,
字段名类型
);
把s_emp表中的idfrist_namesalary对应的类型取出来定义变量,然后把id=1的数据赋值给first_namesalary输出这些信息
declare
--定义一个记录类型
typeemptypeisrecord(
ids_emp.id%type,
names_emp.first_name%type,
salarys_emp.salary%type
);
--使用类型定义变量
var_empemptype;
var_emp2emptype;
begin
--使用sql给记录类型的变量赋值
selectid,first_name,salaryintovar_emp2froms_empwhereid=1;
var_emp:
=var_emp2;--整体赋值
dbms_output.put_line(var_emp.id||''||var_emp.name||''||var_emp.salary);
end;
当查询出的字段少于记录中的字段时,单独使用记录中的字段,没有赋值的字段是null:
selectfirst_name,salaryintovar_emp.name,var_emp.salaryfroms_empwhereid=1;
记录中的字段赋值
var_emp.name:
=var_emp2.name;--(c语言用strcpy,区别)
var_emp.salary:
=var_emp2.salary;
表名%rowtype取得表的一行对应的类型
s_dept%rowtype
s_emp%rowtype
eg:
declare
--使用表的一行的类型定义一个变量
var_emps_emp%rowtype;
begin
select*intovar_empfroms_empwhereid=1;
dbms_output.put_line(var_emp.id||''||var_emp.first_name||''||var_emp.salary);
end;
//%rowtype就是一个字段名和表头中的字段名和字段顺序完全相同的记录类型。
类似于c数组的类型table类型
TYPEtabletypeISTABLEOFtypeINDEXBYBINARY_INTEGER;
行的数目由BINARY_INTEGER的范围决定:
-214743648---214743647
Key没有必要是顺序的可以用firstlastnext方法遍历
declare
--定义一个table类型
typenumstypeistableofs_emp.id%typeindexbybinary_integer;
var_numsnumstype;
var_indbinary_integer:
=1;
begin
var_nums
(1):
=100;
var_nums
(2):
=200;
var_nums(3):
=600;
selectsalaryintovar_nums(4)froms_empwhereid=1;
dbms_output.put_line(var_nums(var_ind));
var_ind:
=var_ind+1;
dbms_output.put_line(var_nums(var_ind));
var_ind:
=var_ind+1;
dbms_output.put_line(var_nums(var_ind));
var_ind:
=var_ind+1;
dbms_output.put_line(var_nums(var_ind));
end;
---------------------------------------------------------------------
/*table
下标不连续迭代器思想
first()得到第一个元素对应的下标
last()最后一个元素对应的下标
next(n)根据一个元素的下标得到下一个元素的下标
*/
declare
--定义一个table类型
typenumstypeistableofs_emp.id%typeindexbybinary_integer;
var_numsnumstype;
var_indbinary_integer:
=1;
begin
var_nums
(1):
=100;
var_nums
(2):
=200;
var_nums(3):
=600;
selectsalaryintovar_nums(4)froms_empwhereid=1;
var_ind:
=var_nums.first();
dbms_output.put_line(var_nums(var_ind));
var_ind:
=var_nums.next(var_ind);
dbms_output.put_line(var_nums(var_ind));
var_ind:
=var_nums.next(var_ind);
dbms_output.put_line(var_nums(var_ind));
var_ind:
=var_nums.last();
dbms_output.put_line(var_nums(var_ind));
end;
declare
typetbistableofs_emp%rowtypeindexbybinary_integer;
tb1tb;
bidbinary_integer:
=1;
begin
select*intotb1
(1)froms_empwhereid=3;--得到一条记录
select*intotb1(5)froms_empwhereid=7;
bid:
=tb1.first();
dbms_output.put_line(tb1(bid).id||''||tb1(bid).first_name);
bid:
=tb1.next(bid);
dbms_output.put_line(tb1(bid).id||''||tb1(bid).first_name);
end;
变量的作用域和可见性
<>--指定标签abc
declare--嵌套
var_mnumber:
=1;
begin
declare
var_mnumber:
=100;
var_nnumber:
=100;
begin
/*局部可以访问全局的*//*同名则局部优先*/
dbms_output.put_line(var_m);--访问局部变量
dbms_output.put_line(abc.var_m);--变量前面加全局标签访问
end;
/*全局不能访问局部的*/
dbms_output.put_line(var_n);--错误
end;
1.分支语句
a.ifa>bthen
endif;
b.ifa>bthen
else
endif;
c.ifaelsifaelsifaendif;
eg:
declare
anumber:
=10;
bnumber:
=20;
cnumber:
=5;
begin
ifaa:
=b;
elsifaa:
=c;
else
dbms_output.put_line('aisthemaxnumber');
endif;
dbms_output.put_line('themaxnumber:
'||a);
end;
declare
var_anumber;
var_bnumber;
var_cnumber;
var_dnumber;
var_enumber;
var_maxnumber;
begin
var_a:
=&var_a;
var_b:
=&var_b;
var_c:
=&var_c;
var_d:
=&var_d;
var_e:
=&var_e;
var_max:
=var_a;
ifvar_maxvar_max:
=var_b;
endif;
ifvar_maxvar_max:
=var_c;
endif;
ifvar_maxvar_max:
=var_d;
endif;
ifvar_maxvar_max:
=var_e;
endif;
dbms_output.put_line('maxnumber:
'||var_max);
end;
2.循环语句
a.简单循环
loop
/*循环代码*/
endloop;
/*如何退出循环*/
1)exitwhen退出条件;//之间退出循环,不执行任何语句
2)if退出条件
语句;//退出前可以执行一些语句
exit;
endif;
eg:
declare
var_inumber;
begin
var_i:
=1;
loop
dbms_output.put_line(var_i);
ifvar_i>10then
exit;
endif;
var_i:
=var_i+1;
--exitwhenvar_i>10;
endloop;
dbms_output.put_line('loopover');
end;
b.while循环
1.while循环的语法
while循环条件loop
endloop;
2.while循环举例:
输出1到10
declare
var_inumber;
begin
var_i:
=1;
whilevar_i<=10loop
dbms_output.put_line(var_i);
var_i:
=var_i+1;
endloop;
end;
3.while循环的退出(同loop)
exitwhen退出条件
if退出条件then…exit;endif;
c.for循环------智能循环
1.for循环的语法
for变量ina..bloop
endloop;
2.for循环举例:
输出1到10
begin
forvar_iin1..10loop
dbms_output.put_line(var_i);
endloop;
end;
3.for循环中的变量不允许修改
4.如何反向输出输出10到1
begin
forvar_iinreverse1..10loop
dbms_output.put_line(var_i);
endloop;
end;
5.for循环的退出,同while
d.循环的嵌套
1.例子
3.使用类似于c语言的goto语句
4.plsql中可以把标签放前面
3.goto语句
使用goto完成输出1到10
plsql中的sql使用
select语句要和into结合使用。
dml(insertdeleteupdate)tcl(commitrollbacksavepoint)可以直接在plsql中使用
DDL(createdropalter)不能直接在plsql中使用,需要使用动态sql。
-------------------------------------------------------------------------------------------------------------
回顾:
常见的访问oracle的技术
plsql
proc/c++
odbc/ado
sqlj/jdbc
plsql的程序结构
declare
/*申明区
定义变量和类型*/
begin
/*执行区
执行sql语句和plsql语句*/
exception
/*异常处理区
处理程序错误的*/
end;
---------------------------
plsql中定义变量
1.使用sql中类型来定义变量
变量名类型;
2.binary_integerboolean
3.变量的修饰
constantnotnull
4.给变量手动赋值
使用sql语句给变量赋值
5.表名.字段名%type取得表的字段对应的类型
6.记录类型
type类型名isrecord(
字段名类型,
字段名类型,
字段名类型
);
如何给记录类型赋值
当查询的字段数少于记录类型字段数
记录类型之间的赋值整体选择字段赋值
7.表的一行对应的类型
表名%rowtype
8.table类型
类似c语言的数组
type类型名istableof表中的类型
indexbybinary_integer;
变量名(下标):
=值;
当下标连续时的遍历
当下标不连续
迭代器思想
first()
last()
next(n)
--------------------------------
变量的作用域和可见性
局部优先
<<标签名>>
--------------------------------
plsql的控制语句
1.分支语句
if条件then
endif;
if条件then
else
endif;
if条件then
elsif条件then
elsif条件then
else
endif;
2.循环语句
a.简单循环
loop
endloop;
b.while循环
while循环条件loop
endloop;
c.for循环
for变量ina..bloop
endloop;
---------------
d.循环的退出
exitwhen退出条件
if退出条件then
exit;
endif;
f.循环的嵌套
通过在内层循环中改变条件退出外层循环
使用goto可以直接在内层循环退出外层循环
使用exit标签名
------------------
3.goto语句
使用goto完成输出1到10
declare
var_inumber;
begin
var_i:
=1;
<>
ifvar_i<11then
dbms_output.put_line(var_i);
var_i:
=var_i+1;
gotomyloop;
endif;
dbms_output.put_line('myloopover!
');
end;
---------------------------------------------
plsql中的sql使用
1.select语句要和into结合使用。
2.dml(insertdeleteupdate)
tcl(commitrollbacksavepoint)
可以直接在plsql中使用
3.DDL(createdropalter)不能直接在plsql
中使用,需要使用动态sql。
动态sql:
把一个字符串对应的sql当做sql语句来执行
createtabletestsql(idnumber);//静态的,运行后不能修改
‘createtabletestsql(idnumber)’
1.DDL:
的动态sql--DDL必须要用动态的sql
2.DML的动态sql
-------------------------------------------------------------------------------
为了解决字符串拼接的问题使用占位符简化拼接
占位符冒号开头使用using替代占位符号。
3.select语句的动态sql
能且只能返回一个结果
游标:
用来处理多行数据的一个数据类型
一条sql语句可以认为是匿名游标
1.游标的语法
a)声明游标
curson游标名issql语句;
b)打开游标
open游标名;
c)提取数据
i.非滚动游标提取数据必须是顺序的
ii.fetch游标名into变量名;
d)关闭游标
close游标名;
2.例:
把s_emp表中所有的数据放入一个游标中
i.输出前两天的idfirst_namesalary
3.遍历游标中所有的数据
a)游标的属性
%found是否发现新数据
游标必须处于打开状态如果没有打开游标使用则返回非法游标。
游标至少被fetch过一次如果没fetch则返回NULL值。
发现了新数据就返回true,否则返回false。
%notfound是否没有发现新数据
游标必须处于打开状态否则是非法游标
没有fetch则返回NULL值
发现了新数据就返回false,没有发现新数据就返回true.
%isopen游标是否打开
打开就返回true否则返回false
打开的游标不能在打开,关闭的游标不能在关闭。
%r