存储过程小知识:
1、输出并换行语句: dbms_output.put_line
2、字符串用单引号
3、字符串的拼接通过“||”
4、其他异常用others表示
5、在SQL窗口调用存储过程:begin...存储过程名()...end;在命令窗口可以直接exec 存储过程名()。
//创建无参存储过程
create or replace procedure findAllPerson
as
v_name person.name%type;
v_salary person.salary%type;
cursor cur_person is select * from person;
begin
for cur in cur_person loop
v_name:=cur.name;
v_salary:=cur.salary;
dbms_output.put_line('姓名:'||v_name||'------薪资:'||v_salary);
end loop;
end;
//执行存储过程
begin
findAllPerson;
end;
//创建删除的存储过程
create or replace procedure delete_procedure(v_id in person.id%type)is
no_result exception;
begin
delete from person where id=v_id;
if sql%notfound then raise no_result;
end if;
exception
when no_result then dbms_output.put_line('没有找到要删除的数据');
when others then dbms_output.put_line(sqlcode||'-----'||sqlerrm);
end;
//执行删除的存储过程
begin
delete_procedure(8);
commit;
end;
//创建查询的存储过程
create or replace procedure query_procedure(v_id in person.id%type,v_name out person.name%type,v_salary out person.salary%type)
is
begin
select name,salary into v_name,v_salary from person where id=v_id;
exception
when no_data_found then
dbms_output.put_line('没有找到要查询的数据');
end;
//执行查询的存储过程
declare
v_name person.name%type;
v_salary person.salary%type;
begin
query_procedure(3,v_name,v_salary);
dbms_output.put_line('姓名:'||v_name||',薪资:'||v_salary);
end;
存储过程与存储函数的区别
相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数。
2.都是一次编译,多次执行。
不同点:1.存储过程定义关键字用procedure,函数定义用function。
2.存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。
3.执行方式略有不同,存储过程的执行方式有两种(1.使用execute2.使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1() form dual;)。
总结:如果只有一个返回值,用存储函数,否则,一般用存储过程。