存储过程和函数的区别
1.返回值的区别,函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有
2.调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用,函数一般情况下是用来计算并返回一个计算结果,存储过程一般是用来完成特定的数据操作 (比如修改、插入数据库表或执行某些DDL语句等等)
3.编译的区别:存储过程只需编译一次,调用的时候不需要再编译,函数每调用一次都需要重新编译
1.创建一个过程,能向dept表中添加一个新记录。(in参数)
CREATE OR REPLACE PROCEDURE sp_1(p_deptno dept.deptno%TYPE,
p_dname dept.dname%TYPE,
p_loc dept.loc%TYPE) IS
BEGIN
INSERT INTO dept VALUES(p_deptno,p_dname,p_loc); COMMIT;
END;
--调用
DECLARE
v_deptno dept.deptno%TYPE:='&部门编号:';
v_dname dept.dname%TYPE:='&部门名称:';
v_loc dept.loc%TYPE:='&部门位置:';BEGIN sp_1(v_deptno,v_dname,v_loc);END;
2.从emp表中查询给定职工的职工姓名和工资。(提示:使用&来输入员工编号 要求:利用out模式的参数将值传给调用者)
CREATE OR REPLACE PROCEDURE sp_2(p_empno emp.empno%TYPE,
p_ename OUT emp.ename%TYPE,
p_sal OUT emp.sal%TYPE) IS
v_c NUMBER;
BEGIN
SELECT COUNT(1) INTO v_c FROM emp WHERE empno=p_empno;
IF v_c=0 THEN dbms_output.put_line('没有这个员工编号!');
else
SELECT ename,sal INTO p_ename,p_sal FROM emp WHERE empno=p_empno; dbms_output.put_line('员工姓名:'||RPAD(p_ename,10)||'员工工资:'||p_sal);
END IF;
END;
--调用
DECLARE
v_ename emp.ename%TYPE;
v_empno emp.empno%TYPE:='&员工编号:';
v_sal emp.sal%TYPE;BEGIN sp_2(v_empno,v_ename,v_sal);
END;
3.创建一个过程,在执行调用过程时,可随机输入emp表中某个雇员的姓名,根据雇员的姓名,返回该雇员的薪水值,并输出(out参数)
CREATE OR REPLACE PROCEDURE sp_3(p_ename emp.ename%TYPE,
p_sal OUT emp.sal%TYPE) IS
v_c NUMBER;
BEGIN
SELECT COUNT(1) INTO v_c FROM emp WHERE ename=p_ename;
IF v_c=0 THEN
dbms_output.put_line('没有这个雇员的姓名!');
else
SELECT sal INTO p_sal FROM emp WHERE ename=p_ename; dbms_output.put_line('雇员的薪水:'||