--创建存储过程
CREATE OR REPLACE PROCEDURE first_proc
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('我是过程');
DBMS_OUTPUT.PUT_LINE('Hello Everyone!');
END;

--创建函数
CREATE OR REPLACE FUNCTION first_func
RETURN VARCHAR2
IS
BEGIN
DBMS_OUTPUT.put_line('我是函数');
RETURN 'Hello Everyone!';
END;

--调用存储过程
BEGIN
first_proc;
END;

--调用存储函数
BEGIN
DBMS_OUTPUT.put_line(first_func);
END;

--1:创建输入参数的存储过程
--根据员工号删除指定的员工信息
CREATE OR REPLACE PROCEDURE proc1
(v_empno IN empnew.empno%TYPE)
IS
BEGIN
--根据员工号删除指定的员工信息
DELETE FROM empnew WHERE empno = v_empno;
--判断是否删除成功
IF SQL%NOTFOUND THEN
-- -20000~ -20999之间
RAISE_APPLICATION_ERROR(-20008,'指定删除的员工不存在!');
ELSE
DBMS_OUTPUT.put_line('删除成功!');
END IF;
END;

--2;创建带有输出参数的存储过程
--求指定部门的平均工资和总人数
CREATE OR REPLACE PROCEDURE proc2
(v_deptno IN NUMBER, v_avgsal OUT NUMBER, v_cnt out NUMBER)
IS
BEGIN
SELECT AVG(sal),COUNT(*)
INTO v_avgsal, v_cnt
FROM emp
WHERE deptno = v_deptno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('没有此部门!');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLERRM);
END;

--3:创建带有输入输出参数的存储过程
--实现两个数的交换
CREATE OR REPLACE PROCEDURE proc3
(v_num1 IN OUT NUMBER, v_num2 IN OUT NUMBER)
AS
v_temp NUMBER := 0;
BEGIN
v_temp:= v_num1;
v_num1:= v_num2;
v_num2:= v_temp;
END;

--1:创建带有输入参数的存储函数
--根据部门编号返回该部门的总工资
CREATE OR REPLACE FUNCTION func1
(v_deptno IN NUMBER)
RETURN NUMBER
IS
v_sumsal NUMBER;
BEGIN
SELECT SUM(SAL) INTO v_sumsal FROM emp WHERE deptno = v_deptno;
RETURN v_sumsal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有此部门!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

--2:创建带有输出参数的存储函数
--根据员工号输出员工的姓名和员工的工资,并且返回员工的年收入
CREATE OR REPLACE FUNCTION func2
(v_empno IN emp.empno%TYPE, v_name OUT emp.ename%TYPE, v_sal OUT emp.sal%TYPE)
RETURN NUMBER
IS
v_salsum NUMBER;
BEGIN
SELECT ename,sal,(sal+nvl(comm,0))*12
INTO v_name,v_sal,v_salsum
FROM emp
WHERE empno = v_empno;
RETURN v_salsum;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('没有此员工!');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLERRM);
END;

--3:创建带有输入输出参数的存储函数
--求两个数的平方和,并输出两个数的平方

CREATE OR REPLACE FUNCTION func3
(n1 IN OUT NUMBER, n2 IN OUT NUMBER)
RETURN NUMBER
AS
BEGIN
n1 := n1*n1;
n2 := n2*n2;
RETURN n1+n2;
END;

--调用无参的存储过程
begin
first_proc;
end;

--调用带有输入参数的存储过程
begin
proc1(1234);
end;

--调用带有输出参数的存储过程
DECLARE
v_avgsalary NUMBER;
v_count NUMBER;
BEGIN
PROC2(10,v_avgsalary,v_count);
DBMS_OUTPUT.put_line('平均工资:'||v_avgsalary);
DBMS_OUTPUT.put_line('总人数:'||v_count);
END;

--调用带有输入输出参数的存储过程
DECLARE
v_n1 NUMBER := 5;
v_n2 NUMBER := 10;
BEGIN
PROC3(v_n1,v_n2);
DBMS_OUTPUT.put_line('N1:'||v_n1);
DBMS_OUTPUT.put_line('N2:'||v_n2);
END;

--删除存储过程
DROP PROCEDURE proc1;

--调用无参的函数
BEGIN
DBMS_OUTPUT.put_line(first_func);
END;

--调用带有输入参数的函数
BEGIN
DBMS_OUTPUT.put_line('部门的工资总额'||func1(&no));
END;

--调用带有输出参数的函数
DECLARE
v_name emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_salsum NUMBER;
BEGIN
v_salsum := func2(&no,v_name,v_sal);
DBMS_OUTPUT.put_line('姓名:'||v_name);
DBMS_OUTPUT.put_line('工资:'||v_sal);
DBMS_OUTPUT.put_line('年收入:'||v_salsum);
END;

--调用带有输入输出参数的函数
DECLARE
v_n1 number :=5;
v_n2 number :=6;
v_sum number;
BEGIN
v_sum := func3(v_n1,v_n2);
DBMS_OUTPUT.put_line('N1的平方:'||v_n1);
DBMS_OUTPUT.put_line('N2的平方:'||v_n2);
DBMS_OUTPUT.put_line('平方和:'||v_sum);
END;

--删除存储函数
DROP FUNCTION func1;

--求部门的年收入
CREATE OR REPLACE FUNCTION func4
(v_deptno IN NUMBER DEFAULT 10,v_t IN NUMBER)
RETURN NUMBER
IS
v_sumsal NUMBER;
BEGIN
SELECT SUM((sal+nvl(comm,0))*12)
INTO v_sumsal
FROM emp
WHERE deptno = v_deptno;
DBMS_OUTPUT.put_line('测试:'||v_t);
RETURN v_sumsal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('没有此部门');
WHEN OTHERS THEN
DBMS_OUTPUT.put_line(SQLERRM);
END;

--调用
declare
v_totalsal number;
begin
v_totalsal := func4(v_t=>1);
dbms_output.put_line(v_totalsal);
end;

最新文章

  1. 8.eclipse调试smali
  2. 使用jQuery Mobile的注意事项(译)
  3. CI 框架中 AR 操作
  4. IOS UITableView的分隔线多出问题
  5. Linux下PHP+MySQL+CoreSeek中文检索引擎配置
  6. php程序备份还原mysql数据库
  7. python的工作记录B
  8. Yii2 分页类的扩展和listview引用
  9. Virtualbox 启动虚拟机报错以及扩展、显卡驱动安装
  10. 【★】Web精彩实战之
  11. openpose模型在AI challenge人体骨骼关键点检测的表现
  12. RSA签名和验证数据
  13. H5直播避坑指南
  14. C# 处理Excel公式(一)——创建、读取Excel公式
  15. 一次HTTP请求响应涉及了哪些?
  16. python, Image
  17. scenario testing
  18. 【 Gym - 101138D 】Strange Queries (莫队算法)
  19. 西部世界第二季全集高清百度云在线观看BT种子迅雷下载
  20. Selenium学习笔记

热门文章

  1. CreateThread传递多个参数的方法(利用结构体的参数指针)
  2. socket编程详解,转自http://www.sme-cn.com:82/archives/669
  3. UWP使用AppService向另一个UWP客户端应用程序提供服务
  4. 【Git】生成Patch和使用Patch
  5. C#数字图像处理时注意图像的未用区域
  6. 数据库连接池之_DButils
  7. Qt:解析命令行(使用QCommandLineOption和QCommandLineParser)
  8. InfoPath分别定义New/Edit 表单
  9. 基于mipsel编译Qt4.6.2版本(有具体参数和编译时遇到的问题)
  10. 记住以下10条,Linux磁盘与文件系统管理无忧矣