plsql过程化语言
--控制输出--
declare
begin
dbms_output.put_line('hello/plsql');
end;
--变量的声明和使用--
declare
v_num number(8):=10;
v_num1 number(8):=20;
v_num2 number(8);
begin
v_num2:=v_num+v_num1;
dbms_output.put_line('结果为:'||v_num2);
end;
--声明常量 在数据类型前面加constant--
declare
π constant number(8,5):=3.1415;
R number(9):=2;
area number(10,8);
begin
area:=π*R*R;
dbms_output.put_line(area);
end;
--关于赋值--把emp表的7369的工资sal 赋值给v_sal--into--
declare
v_empno number(4):=7369;
v_sal number(7,2);
begin
select sal into v_sal from emp where empno=v_empno;
dbms_output.put_line(v_empno||'的工资为'||v_sal);
end;
---使用表的列类型--v_empno的类型是emp表empno字段的类型--
declare
v_empno emp.empno%type:=7499;
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=v_empno;
dbms_output.put_line(v_empno||'的工资为'||v_sal);
end;
declare
v_cname emp.ename%type;
v_cjob emp.job%type;
begin
select emp.ename,emp.job into v_cname,v_cjob from emp where emp.empno=7369;
dbms_output.put_line(v_cname||'的工作为:'||v_cjob);
end;
--使用表的行类型--
declare
erow emp%rowtype;
begin
select * into erow from emp where emp.empno=7369;
dbms_output.put_line('姓名:'||erow.ename);
dbms_output.put_line('工作:'||erow.job);
end;
--使用分支语句
declare
erow emp%rowtype;
num1 number;
begin
select * into erow from emp where emp.empno=7369;
select count(emp.empno) into num1 from emp where emp.empno=7369;
if num1>0 then
dbms_output.put_line('姓名:'||erow.ename);
dbms_output.put_line('职位:'||erow.job);
else
dbms_output.put_line('没有此人');
end if;
end;
--弹出框
accept num prompt'请输入一个数字';
declare
pnum number:=#
begin
if pnum=0 then dbms_output.put_line('你输入的是0');
elsif pnum=1 then dbms_output.put_line('你输入的是1');
else dbms_output.put_line('你输入了其他数字');
end if;
end;
--loop循环语句--
declare
i number;
begin
i:=0;
loop
i:=i+1;
dbms_output.put_line(i);
exit when(i>100);
end loop;
end;
--while循环--
declare
i number :=1;
begin
while i<10 loop
dbms_output.put_line(i);
i:=i+1;
end loop;
end;
--for循环--
declare
i number:=1;
begin
for i in 1..100 loop
dbms_output.put_line(i);
end loop;
end;
--for循环反序--
declare
i number:=1;
begin
for i in reverse 1..100 loop
dbms_output.put_line(i);
end loop;
end;
游标游标相当于一个集合
--打印emp的员工的工资
declare
--定游光标--
cursor cemp is select ename,sal from emp;
--为游标定义对应的变量
pname emp.ename%type;
psal emp.sal%type;
begin
open cemp;
--循环取出游标里的元素
loop
--取一条记录赋值给pname 和 psal--
fetch cemp into pname,psal;
exit when cemp%notfound;
dbms_output.put_line(pname||'的工资为'||psal);
end loop;
close cemp;
end;
案例给emp表的老板的工资+1000 经理+800,员工+400
declare
--查询emp表的编号和工作放入游标中(相当集合)
cursor cemp is select empno,job from emp;
pempno emp.empno%type;
pjob emp.job%type;
begin
--打开游标--
open cemp;
loop
--遍历游标把empno赋值给pempno job赋值给pjob。
fetch cemp into pempno,pjob;
--循环的退出条件为cemp游标没有值时
exit when cemp%notfound;
--如果pjob为president说明就是老板
if pjob='PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
--如果pjob是manager说明是经理
elsif pjob='MANAGER' then update emp set sal=sal+800 where empno=pempno;
--否则就是员工
else update emp set sal=sal+400 where empno=pempno;
end if;
--结束循环--
end loop;
--关闭游标--
close cemp;
end;
通过system用户 在SQL plus上输入 show parameter cursor 可以查看cursor的最大连接数
修改光标的最大连接数 alter system set open_cursors=400 scope=both;
scope的取值有三个 both:两个同时更改
memory :只更改当前事例,不更改 参数文件
spfile:只更改参数文件,不更改当前事例(数据库重启服务)
set serveroutput on