setserveroutputon;--计算两个整数的和与这两个整数的差的商declareaint:=100;bint:=200;cnumber;beginc:=(a+b)/(a-a);dbms_output.put_line(c);exceptionwhenzero_dividethendbms_output.put_line('除数不能为零!');end;/declareNum_salnumber;--声明一个数值变量Var_enamevarchar2(20);--声明一个字符串变量beginselectename,salintoVar_ename,Num_salfromscott.empwhereempno=7369;--检索指定的值并保存在变量中dbms_output.put_line(Var_ename||'的工资是'||Num_sal);--输出变量的值end;/--简单的插入一条语句createorreplaceprocedurepro1isbegininsertintoscott.emp(empno,ename)values(1111,'1111');end;/execpro1;select*fromscott.emp;--删除一条语句(传参)createprocedurepro2(in_empnonumber)isbegindeletefromempwhereempno=in_empno;end;/--简单的插入一条语句(传参)createorreplaceprocedurepro3(in_empnonumber,in_enamevarchar2)isbegininsertintoscott.emp(empno,ename)values(in_empno,in_ename);end;/declare--定义变量的格式是变量名称变量的类型v_enamevarchar2(8);beginselectenameintov_enamefromempwhereempno=&empno;--将查询到的值存入v_ename变量中--输出v_enamedbms_output.put_line('雇员名是'||v_ename);end;/--将上面的块改成过程createprocedurepro4(v_in_empnonumber)isv_enamevarchar2(8);beginselectenameintov_enamefromempwhereempno=v_in_empno;dbms_output.put_line('雇员名是'||v_ename);end;/--编写一个过程,实现输入雇员名,新工资可以修改雇员的工资createprocedurepro5(in_enameinvarchar2,in_newsalinnumber)isbeginupdateempsetsal=in_newsalwhereename=in_ename;end;/--编写一个过程,可以接受id和薪水,更新薪水,如果id不存在,需要在exception中捕获,并给出提示!createorreplaceprocedurepro6(in_empnonumber,in_salnumber)isv_enamevarchar2(32);v_empnonumber;beginselectempnointov_empnofromempwhereempno=in_empno;--此条语句为了实现在exception中可以抛出no_data_foundupdateempsetsal=in_salwhereempno=in_empno;exceptionwhenno_data_foundthendbms_output.put_line('您输入的编号有误!');end;/--编写一个函数,可以根据接受用户名并返回用户的年薪createorreplacefunctionfun1(in_enamevarchar2)returnnumberis--定义一个变量来接受年薪v_annual_salnumber;beginselect(sal+nvl(comm,0))*13intov_annual_salfromempwhereename=in_ename;returnv_annual_sal;end;/selectfun1('SMITH')fromdual;--定义一个包,该包有一个过程,该过程可以接收用户名和新的薪水(将用于通过用户名去更新薪水),--还有一个函数,该函数可以接受一个用户名(将用于实现得到该用户的年薪是多少)createorreplacepackagemypackage1is--声明一个过程procedurepro1(in_enamevarchar2,in_newsalnumber);--声明一个函数functionfun1(in_enamevarchar2)returnnumber;end;/--编写一个包体的案例createorreplacepackagebodymypackage1is--实现过程procedurepro1(in_enamevarchar2,in_newsalnumber)isbeginupdateempsetsal=in_newsalwhereename=in_ename;end;--实现函数functionfun1(in_enamevarchar2)returnnumberisv_annual_salnumber;beginselect(sal+nvl(comm,0))*13intov_annual_salfromempwhereename=in_ename;returnv_annual_sal;end;end;/--输入员工的工号,显示雇员姓名、工资、个人所得税(税率为0.03)createorreplaceprocedurepro7(in_empnoinnumber)isv_tax_ratenumber(3,2):=0.03;v_enamevarchar(32);v_salnumber;v_paynumber;beginselectename,salintov_ename,v_salfromempwhereempno=in_empno;v_pay:=v_tax_rate*v_sal;dbms_output.put_line(v_ename||'工资是='||v_sal||'个人所得税是:='||v_pay);end;/--使用%type定义数据createorreplaceprocedurepro7(in_empnoinnumber)isv_tax_ratenumber(3,2):=0.03;v_enameemp.ename%type;v_salemp.sal%type;v_paynumber;beginselectename,salintov_ename,v_salfromempwhereempno=in_empno;v_pay:=v_tax_rate*v_sal;dbms_output.put_line(v_ename||'工资是='||v_sal||'个人所得税是:='||v_pay);end;/--使用pl/sql复合类型(record),编写一个过程可以接受一个用户编号,并显示该用户的名字,薪水,工作岗位。createorreplaceprocedurepro8(in_empnoinnumber)is--定义一个记录数据类型typemy_record1isrecord(v_enameemp.ename%type,v_salemp.sal%type,v_jobemp.job%type);--定义一个变量,该变量的类型是my_record1v_emp_recordmy_record1;beginselectename,sal,jobintov_emp_recordfromempwhereempno=in_empno;dbms_output.put_line('姓名是:'||v_emp_record.v_ename||'工作是:'||v_emp_record.v_job||'工资是:'||v_emp_record.v_sal);end;/declaretypemy_table1istableofemp.ename%typeindexbybinary_integer;my_tablemy_table1;--定义一个变量my_table1类型beginselectenameintomy_table(0)fromempwhereempno=7369;dbms_output.put_line('员工名:'||my_table(0));end;--说明:my_table1是pl/sql表的类型--emp.ename%type指定表元素的类型和长度--my_table是pl/sql表变量--sp_table(0)则表示下标为0的元素--使用pl/sql编写一个过程,可以输入部门编号,并显示该部门所有员工姓名和工资。createorreplaceprocedurepro9(in_deptnonumber)is--先定义一个游标变量类型typezxp_emp_cursorisrefcursor;--定义一个游标变量v_emp_cursorzxp_emp_cursor;--定义两个变量v_enameemp.ename%type;v_salemp.sal%type;v_empnoemp.empno%type;begin--执行语句openv_emp_cursorforselectename,sal,empnofromempwheredeptno=in_deptno;--取出游标中的数据loopfetchv_emp_cursorintov_ename,v_sal,v_empno;--判断当前游标是否到达最后exitwhenv_emp_cursor%notfound;--输出dbms_output.put_line('雇员编号'||v_empno||'用户名:'||v_ename||'薪水:'||v_sal);endloop;--关闭游标closev_emp_cursor;end;/--流程控制部分--编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10%。createorreplaceprocedurepro1(in_enamevarchar2)is--定义工资变量v_salemp.sal%type;beginselectsalintov_salfromempwhereename=in_ename;ifv_sal2000thenupdateempsetsal=sal*1.1whereename=in_ename;endif;end;/--编写一个过程,可以输入一个雇员名,如果该雇员的奖金不是0就在原来基础上增加100,如果为零就设为200;createorreplaceprocedurepro1(in_enamevarchar2)is--定义奖金v_commemp.comm%type;beginselectcommintov_commfromempwhereename=in_ename;ifv_comm0thenupdateempsetcomm=comm+100whereename=in_ename;elseupdateempsetcomm=200whereename=in_ename;endif;end;/--编写一个过程,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,--如果该雇员的职位是MANAGER就给他的工资增加500,其他职位的雇员工资增加200。createorreplaceprocedurepro1(in_empnonumber)is--定义一个职位变量v_jobemp.job%type;beginselectjobintov_job