setserveroutput on;--计算两个整数的和与这两个整数的差的商declareaint:=100;bint:=200;c number;beginc:=(a+b)/(a-a);dbms_output.put_line(c);exceptionwhenzero_divide thendbms_output.put_line('除数不能为零!');end;/declareNum_sal number; --声明一个数值变量Var_ename varchar2(20); --声明一个字符串变量beginselect ename,sal into Var_ename,Num_sal from scott.emp where empno=7369; --检索指定的值并保存在变量中dbms_output.put_line(Var_ename||'的工资是'||Num_sal); --输出变量的值end;/--简单的插入一条语句create or replace procedure pro1 isbegininsert into scott.emp(empno,ename)values(1111,'1111');end;/exec pro1;select * from scott.emp;--删除一条语句(传参)create procedure pro2(in_empno number) isbegindelete from emp where empno=in_empno;end;/--简单的插入一条语句(传参)create or replace procedure pro3(in_empnonumber,in_ename varchar2) isbegininsert into scott.emp(empno,ename)values(in_empno,in_ename);end;/declare--定义变量的格式是变量名称变量的类型v_enamevarchar2(8);beginselect ename into v_ename from emp where empno=&empno; --将查询到的值存入v_ename变量中--输出v_enamedbms_output.put_line('雇员名是'||v_ename);end;/--将上面的块改成过程create procedure pro4(v_in_empno number) isv_enamevarchar2(8);beginselectename into v_ename from emp where empno=v_in_empno;dbms_output.put_line('雇员名是'||v_ename);end;/--编写一个过程,实现输入雇员名,新工资可以修改雇员的工资create procedure pro5(in_ename in varchar2,in_newsal in number) isbeginupdateemp set sal=in_newsal where ename = in_ename;end;/--编写一个过程,可以接受id和薪水,更新薪水,如果id不存在,需要在exception中捕获,并给出提示!create or replace procedure pro6(in_empnonumber,in_sal number) isv_enamevarchar2(32);v_empno number;beginselect empno into v_empno from emp where empno = in_empno; --此条语句为了实现在exception中可以抛出no_data_foundupdateemp set sal = in_sal where empno = in_empno;exceptionwhenno_data_found thendbms_output.put_line('您输入的编号有误!');end;/--编写一个函数,可以根据接受用户名并返回用户的年薪create or replace function fun1(in_ename varchar2)return number is--定义一个变量来接受年薪v_annual_sal number;beginselect (sal+nvl(comm,0))*13 into v_annual_sal from emp where ename=in_ename; returnv_annual_sal;end;select fun1('SMITH') from dual;--定义一个包,该包有一个过程,该过程可以接收用户名和新的薪水(将用于通过用户名去更新薪水),--还有一个函数,该函数可以接受一个用户名(将用于实现得到该用户的年薪是多少)create or replace package mypackage1 is--声明一个过程procedure pro1(in_ename varchar2,in_newsal number);--声明一个函数function fun1(in_ename varchar2) return number;end;/--编写一个包体的案例create or replace package body mypackage1 is--实现过程procedure pro1(in_ename varchar2,in_newsal number) isbeginupdateemp set sal=in_newsal where ename = in_ename;end;--实现函数function fun1(in_ename varchar2) return number isv_annual_sal number;begin select(sal+nvl(comm,0))*13 into v_annual_sal from emp where ename=in_ename;returnv_annual_sal;end;end;/--输入员工的工号,显示雇员姓名、工资、个人所得税(税率为0.03)create or replace procedure pro7(in_empno in number) isv_tax_rate number(3,2):=0.03;v_ename varchar(32);v_sal number;v_pay number;beginselectename,sal into v_ename,v_sal from emp where empno=in_empno;v_pay:=v_tax_rate*v_sal;dbms_output.put_line(v_ename||'工资是='||v_sal||'个人所得税是:='||v_pay); end;/--使用%type定义数据create or replace procedure pro7(in_empno in number) isv_tax_rate number(3,2):=0.03;v_enameemp.ename%type;v_salemp.sal%type;v_pay number;beginselectename,sal into v_ename,v_sal from emp where empno=in_empno;v_pay:=v_tax_rate*v_sal;dbms_output.put_line(v_ename||'工资是='||v_sal||'个人所得税是:='||v_pay); end;/--使用pl/sql复合类型(record),编写一个过程可以接受一个用户编号,并显示该用户的名字,薪水,工作岗位。
create or replace procedure pro8(in_empno in number) is--定义一个记录数据类型type my_record1 is record(v_enameemp.ename%type,v_salemp.sal%type,v_jobemp.job%type);--定义一个变量,该变量的类型是my_record1v_emp_record my_record1;beginselectename,sal,job into v_emp_record from emp where empno=in_empno;dbms_output.put_line('姓名是:'||v_emp_record.v_ename||'工作是:'||v_emp_record.v_job||'工资是:'||v_emp_record.v_sal);end;/declare type my_table1 is table of emp.ename%type index by binary_integer;my_table my_table1; --定义一个变量my_table1类型beginselectename into my_table(0) from emp where empno = 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编写一个过程,可以输入部门编号,并显示该部门所有员工姓名和工资。
create or replace procedure pro9(in_deptno number) is--先定义一个游标变量类型typezxp_emp_cursor is ref cursor;--定义一个游标变量v_emp_cursorzxp_emp_cursor;--定义两个变量v_enameemp.ename%type;v_salemp.sal%type;v_empnoemp.empno%type;begin--执行语句open v_emp_cursor for select ename,sal,empno from emp where deptno=in_deptno;--取出游标中的数据loopfetchv_emp_cursor into v_ename,v_sal,v_empno;--判断当前游标是否到达最后exit when v_emp_cursor%notfound;--输出dbms_output.put_line('雇员编号'||v_empno||'用户名:'||v_ename||'薪水:'||v_sal);end loop;--关闭游标closev_emp_cursor;end;/--流程控制部分--编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10%。