Oracle过程

时间:2023-02-05 11:57:17
--过程:类似于Java中的无返方法
--示例1:过程的基本语法
create or replace procedure 过程名(
[参数1 类型(不要长度), 参数2 类型,....]
) is/as
[局部变量1 类型(要长度);
局部变量2 类型(要长度);
.....
]
begin
可执行代码
[exception]
end;
--调用过程
DECLARE
BEGIN
过程名(参数);
END;




--示例2 根据编号,查询某给用户的姓名和年龄:tem_user
create or replace procedure getUserInfo(
no number
) is
name VARCHAR2(20);
age number(10);
begin
select "Name","Age" into name,age
from "tem_user"
where "UserNo"=no;
DBMS_OUTPUT.PUT_LINE(no||'号的用户的姓名是:'||name||',年龄是:'||age);
end;

DECLARE
v_no number(4) :=1002;
begin
getUserInfo(v_no);
end;


--示例3 向tem_user中添加一个记录
create or replace procedure addUser(
no number,name varchar2,age number
)is
BEGIN
insert into "tem_user" VALUES(no,name,age);
END;

BEGIN
-- addUser(1005,'小白龙',100);
-- addUser(no=>1006,name=>'白骨精',age=>300);
addUser(no=>1007,age=>800,name=>'太上老君');
END;


--示例4 用不同的传参方式创建过程
--in:传入的参数
--out:传出的参数
--in out :又能传入、传出
--查询某一门课程的平均分,如果小于90则加10分,输出更新后的平均分
create or replace procedure calcuAvg(
subNo in number,avg out number,num in out number
)is
v_avg number(4);
begin
select AVG("StudentResult") into v_avg
from "Result" where "SubjectNo"=subNo;

avg :=v_avg;

IF v_avg<90 then
num:= v_avg+num;
end IF;
end;

DECLARE
v_num1 number(4) :=2;
v_num2 number(4);
v_num3 number(4) :=10;
BEGIN
calcuAvg(v_num1,v_num2,v_num3);
DBMS_OUTPUT.PUT_LINE(v_num1||'号课程的原平均分是:'||v_num2||',加分后的是:'||v_num3);
END;




--函数:类似于Java中的有返方法
--函数的基本语法
create or replace function 函数名(
型参列表
)return 返回值类型
is 返回值的名 返回值类型;
begin
--可执行的代码;
end;


--示例5 数学运算
create or replace function calcu(
num1 number,num2 number,num3 number
)return number
is result number;
begin
result :=(num1+num2)*num3;
return result;
end;

DECLARE
v_num1 number(4) :=10;
v_num2 number(4) :=20;
v_num3 number(4) :=30;
BEGIN
DBMS_OUTPUT.PUT_LINE('运算结果是:'||calcu(v_num1,v_num2,v_num3));
END;


--示例6 统计参加了某门考试的人数
create or replace function getCount(
subNo number :=2 --函数可以直接给变量赋值,过程不可以
)return number is person_count number;
begin
select count(1) into person_count
from "Result" where "SubjectNo"=subNo;
return person_count;
end;

BEGIN
DBMS_OUTPUT.PUT_LINE('2号课程的考试人数是:'||getCount());
END;


--删除过程与函数
drop procedure getUserInfo;
drop FUNCTION getCount;


--用函数改造示例4
create or replace procedure calcuAvgFunc(
subNo number,avg number
)ruturn number is avg_value number;
begin
select AVG("StudentResult") into v_avg
from "Result" where "SubjectNo"=subNo;

ruturn avg_value;
end;

DECLARE
v_num1 number(4) :=2;
v_num3 number(4) :=10;
v_result number(4);
v_result2 number(4);
BEGIN
avg_value :=calcuAvgFunc(v_num1,v_num2,v_num3);
IF avg_value<90 then
avg_value:= avg_value+v_num3;
end IF;
DBMS_OUTPUT.PUT_LINE(v_num1||'号课程的原平均分是:'|| ||',加分后的是:'||v_num3);
END;