--块结构
begin
dbms_output.put_line('哈罗,我来了!');--打印一句话
end;
declare
n number;
begin
n:=90;
dbms_output.put_line('n='||n);
end;
--存储过程
create or replace procedure my_liu_1 as
begin
dbms_output.put_line('这是我的第一个存储过程函数');
end;
--存储过程(传入参数)
create or replace procedure my_liu_2(n number) as
begin
dbms_output.put_line('n='||n);
end;
--使用存储函数求阶乘
create or replace procedure my_liu_3(n number,res out number) as
begin
res :=n*10;
end;
--定义变量
var n number;
exec my_liu_3(20,:n);
--定义变量,输出你指定的值
declare
r number;
begin
my_liu_3(2,r);
dbms_output.put_line('r= '||r);
end;
--存储过程 while
create or replace procedure liu_4(n number,res out number) as
i number:=1;
begin
res:=0;
while i<=n loop
res:=res+i;
i:=i+1;
end loop;
end;
--开启执行
set serveroutput on;
--执行结果
execute liu_4(10,:n);
--定义块,执行结果
declare
r number;
begin
liu_4(10,r);
dbms_output.put_line('r=='||r);
end;
--存储过程 for
create or replace procedure liu_5(n number,res out number) as
begin
res:=0;
for i in 1..n loop
res:=res+i;
end loop;
end;
--游标的使用
--根据部门显示员工的工资
create or replace procedure show_ename_sal_by_deptno(par_deptno number) as
cursor emp_cur is select ename,sal from emp where deptno=par_deptno;--定义游标
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
begin
open emp_cur; --打开游标
if emp_cur%ISOPEN then
dbms_output.put_line('游标已经打开');
else
dbms_output.put_line('游标没有打开');
end if;
fetch emp_cur into v_ename,v_sal;--提取数据
while emp_cur%FOUND loop
dbms_output.put_line('姓名:'||v_ename||' 工资:'||v_sal);
fetch emp_cur into v_ename,v_sal;
end loop;
close emp_cur;
end;
--执行游标结果
exec show_ename_sal_by_deptno(10);
--使用 fetch cursor bulk collect into 创建游标
create or replace procedure show_ename_sal_by_deptno(par_deptno number) as
cursor emp_cur is select ename,sal from emp where deptno=par_deptno;--定义游标
TYPE emp_table_type is table of emp_cur%ROWTYPE;
v_emp_table emp_table_type;
begin
open emp_cur;--开启游标
fetch emp_cur bulk collect into v_emp_table;--全部提取
for i in 1..v_emp_table.count loop
dbms_output.put_line('姓名:'||v_emp_table(i).ename||' 工资:'||v_emp_table(i).sal);
end loop;
close emp_cur;
end;
--分批显示数据
create or replace procedure show_names as
cursor emp_cur is select ename from emp;
TYPE emp_table_type is table of emp.ename%TYPE;
v_emp_table emp_table_type;
v_count_per_row number:=5;
begin
open emp_cur;
loop
fetch emp_cur bulk collect into v_emp_table limit v_count_per_row;
dbms_output.put_line('姓名:');
for i in 1..v_emp_table.count loop
dbms_output.put_line(v_emp_table(i)||' ');
end loop;
dbms_output.new_line;
exit when emp_cur%NOTFOUND;
end loop;
close emp_cur;
end;
--for 定义游标
create or replace procedure show_ename_sal as
cursor emp_cur is select ename,sal from emp;
begin
for emp_record in emp_cur loop
dbms_output.put_line('name :'||emp_record.ename||' sal:' ||emp_record.sal);
end loop;
end;