-
1、光标的属性
%found:光标中是否有数据,有则返回true,无返回false。
%notfound:与上面相反。
%isopen:判断光标是否打开,打开返回true,否则返回false。
%rowcount:影响的行数,例如光标中有100条记录,现在这个指针到10行这里,那么它聚会返回10。它不是总行数。
2、光标数的限制:默认情况下,oracle数据库允许在同一会话下,只能打开300个光标(可以查看oracle初始化参数得到这个值)。它的意思是指open 光标之后,打开到一定数量就不可以在打开光标了。
注意:查询数据库参数时,需要使用管理员,这里使用sysdba。show parameter这里是模糊查询,后面可以接查询的名,它会自动加%%,如图。
修改系统参数语法:alter system set 参数字段=值。如图,这里的scope代表范围,它有三个值。如果scope为memory,那么修改只是更改当前实例,不更改参数文件。如果为spfile,那么修改只是更改参数文件,不更改当前实例(如果是spfile,数据库需要重新启动)。both代表前两个同时更改。
查看全部 -
使用PL/SQL完成员工涨工资。
注意:演示过程中,执行完PL/SQL,查询却没有涨工资,这是因为PL/SQL执行它是一个事物,而查询是一个事物,PL/SQL执行完需要提交事物,否则查询就会发生没有改变。所以一定注意写完PL/SQL程序后,如果修改了数据库中的记录必须要提交事物。这里为了显示刚才增加的工资所以在上面添加rollback,回滚到修改之前的工资。
——总结——
1、oracle数据库默认开启数据库事务。
2、oracle,默认的事物隔离级别是read commited。
查看全部 -
光标:PL/SQL中使用光标代表一个集合(ResultSet)。
光标语法:如图,注意:定义光标时,CURSOR是定义光标的关键字,变量的名字放在它后面。
使用光标语法:如图,它的意思相当于执行select语句,得到集合。如图,从光标中取值并放入变量pename中。如图,当使用完光标后,还需要关闭,它的意思释放光标占用系统的一些资源。
fetch的作用:如图,它有两点作用。1、当开启光标的时候,初始化光标后,集合会有一个指针指向集合的第一条记录地址,fetch的第一个作用就是将该指针指向的记录返回。2、将指针移动后一条记录的地址。所以可以通过循环这个光标来返回集合中所有的记录。
举例:通过光标打印所有员工姓名和工资,定义光标规范,尽量把fetch后的变量和光标定义在一块。这里需要注意into后面字段的顺序要和查询语句的返回字段顺序一一对应。
判断光标中是否还有数据语法:这里需要了解光标的属性。
光标的属性:总共有四个属性。1、%found它代表如果fetch取到值,它的值就为true,否则就为false。2、%notfound它代表与第一种相反的意思。
查看全部 -
PL/SQL光标的引入:如图,在Java中如果想要循环select查询结果集合中的每一个数据,可以通过ResultSet,通过对象的next()方法,遍历集合中每一个数据。光标的作用就是这样子的。
查看全部 -
PL/SQL循环语句的使用
第一种循环语句形式:当条件满足total<=25000时,执行LOOP和END LOOP之间的循环体,不满足时退出循环。
举例:注意,PL/SQL中没有++这种自增运算符。
第二种循环语句形式:如果满足when后面的条件,则跳出循环体。不满足则执行循环体。
举例:如图。
第三种循环语句形式:I是循环变量,IN后面是循环变量的取值,像这里就是从1取到3,其中1..3代表1、2、3三个数字,注意..的使用必须是连续的数字。
举例:如图。
推荐使用第二种循环,因为这种方式使用光标比较方便。
查看全部 -
PL/SQL中if语句的使用(语句序列DML语句)
第一种IF语句形式,如图。
第二种IF语句形式,如图。
第三种IF语句形式,如图。
举例:判断用户从键盘输入的数字。1、如何使用if语句。2、如何接受一个键盘的输入(键盘输入的都是字符串)。
查看全部 -
引用型变量:其中my_name表示变量名,emp表示员工表,ename表示员工名字段,整句代表引用emp表的ename字段类型作为该变量的类型。
引用型变量优势:它会随着参考类型改变而改变。
举例:注意在PL/SQL中,赋值有两种方式,一种是:=,另一种是使用into关键字,oracle中的dbms_output包的put_line参数中的连接符||。
记录型变量:取表中一行变量的类型作为变量的类型,可以理解记录型变量为数组,数组中的每一个元素就代表这一行的每一列,如果要引用其中某一列,可以通过——》变量名.字段名
举例:
查看全部 -
PL/SQL的完整程序结构
变量的定义语法:如图,需要注意的是变量名称放在类型前,赋值使用:=。
举例:这里可以使用sysdate来获取当前时间。
查看全部 -
PL/SQL(Procedure Language/SQL):Oracle对sql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句。例如:分支、循环等,使SQL语言具有过程处理能力,PL/SQL是面向过程的语言。
如下这种方式,就需要使用PL/SQL来实现。
查看全部 -
学习PL/SQL作用
1、对oracle的一个扩展。
例如:涨工资,可以通过java使用jdbc来操作,这里可以通过调用PL/SQL来操作,它的效率是操作oracle数据库最高的,相比其他语言。
2、它是学习存储过程、自定义函数、触发器的基础。
举例:简单的PL/SQL例子,它以declare开头代表声明。接下来是说明,它是一个程序,所以它会有变量,光标,例外,这里指对他们的声明。程序以begin开始,end;结束,中间是程序体。(dbms_output是PL/SQL提供的程序包,这个程序包中提供了很多的方法,其中put_line()它是一个存储过程,它的作用是接受一个字符串打印在屏幕上)。最后需要/,代表退出编辑环境,并且执行PL/SQL程序。此时还需要一个操作,因为默认oracle的输出开关是关闭的,通过set serveroutput on打开输出开关。这里的/代表执行上一条SQL语句或者上一条PL/SQL程序。
注意:如果程序没有说明部分那么前面的declare可以不写。
Oracle中包的位置,可以通过查看文档了解包的用途。
其中第一个表示Oracle数据库中提供了哪些程序包,第二个相当于语法手册,代表怎么使用。
拉到最下方可以看到oracle10g中提供了198个程序包。
而dbms这个包是第68个可以查看它的overview概述,它还提供了一些examples,还可以查看这个程序包中有哪些子程序,像put_line这个存储过程,通过它可以了解每一个包的详细用法。
在命令行中直接使用命令(desc 包名)查看包的结构,这种形式查看更为简洁。
put_line它是一个存储过程,需要一个参数A,并且类型为字符串,并且为输入参数。
查看全部 -
set serveroutput on
declare
cursor cemp is select empno,sal from emp order by sal;
pempno emp.empno%type;
psal emp.sal%type;
countEmp number:=0;
salTotal number;
begin
select sum(sal) into salTotal from emp;
open cemp;
loop
exit when salTotal > 50000;
fetch cemp into pempno,psal;
exit when cemp%notfound;
update emp set sal = sal*1.1 where empno =pempno;
countEmp := countEmp +1;
salTotal:=salTotal + psal*0.1;
end loop;
close cemp;
dbms.output.put_line();
end;
/
查看全部 -
set serveroutput on
declare
cursor cemp is select to_char(hiredate,'yyyy') from emp;
phiredate varchar2(4);
count80 number := 0;
count81 number := 0;
count82 number := 0;
count87 number := 0;
begin
open cemp;
loop
fetch cemp into phiredate;
exit when cemp%notfound;
if phiredate = '1980' then count80:=count80+1;
elsif phiredate = '1981' then count80:=count81+1;
elsif phiredate = '1982' then count80:=count82+1;
else count87:=count87+1;
end if;
close cemp;
dbms.output.put_line();
end;
/
查看全部 -
set sereroutput on
declare
cursor cemp is select ename from emp where deptno = 50;
pename emp.ename%type;
no_emp_found exception;
begin
open cemp;
fetch cemp into pename;
if cemp%notfound then
raise no_emp_found;
end if;
close cemp;
exception
when no_emp_found then dbms_output.put_line();
when others then dbms_output.put_line();
end;
/
查看全部 -
自定义例外
查看全部 -
修改光标数的限制
alter system set open_cursor = 400 scope = both;
memory 只改当前实例
spfile 改参数文件,需要重启数据库
查看全部
举报