archar2,newsal number); function annual_income(name varchar2) return number; end; / 给包实现包体: create or replace package sp_package is procedure update_sal(name varchar2,newsal number) is begin update emp set sal=newsal where ename=name; end; function annual_income(name varchar2) return number is annual_salary number; begin select sal*12+nvl(comm,0) into annual_salary from emp where ename=name; return annual_salary; end; end; / 如何调用包,调用包中的过程和函数,调用的时候,需要在过程和函数面前添加包名 exec sp_package.update_sal('SCOTT',120); PL/SQL基础 定义并使用变量 标量(scalar)-常用类型 在PL/SQL中 标量定义的案例: (1)定义一个变长的字符串 v_ename varchar2(20) (2)使用一个变量 数据赋值: := declare c_tax_rate number(3,2) := 0.03; v_ename varchar2(5); v_sal number(7,2); v_tax_sal number(7,2); begin --执行 select ename,sal into v_ename,v_sal from emp where empno = &no; --计算所得税 v_tax_sal := v_sal*c_tax_rate; --输出 dbms_output.put_line(姓名是:'' || v_ename ||'工资是:'||v_sal||'交税:'||v_tax_sal) ; end; 标量(scalar)-使用%type类型: v_ename emp.ename%type;//表示变量v_ename定义的大小和表emp的字段enamel大小一致 复合变量(composite)介绍: 用于存放多个值的变量,主要包括: 类似高级语言的结构体 type emp_recode_type is recode ( name emp.ename%type, salary emp.sal%type, title emp.job%type ); //定义了一个PL/SQL记录类型emp_recode_type,类型包含是哪个数据name,salary,title sp_recode emp_recode_type;//定义了一个变量sp_recode,它的类型为emp_recode_type 具体编写: declare type emp_recode_type is record(name emp.ename%type, salary emp.sal%type, title emp.job%type); sp_recode emp_recode_type; begin select ename,sal,job into sp_record from emp where empno=7788; dbms_output.put_line('员工名:' || sp_record.name || '工资是' || sp_record.salary); end; 复合类型: 相当于高级高级语言中的数组,但是需要注意的是在高级语言中数组的下标不能为负数,但是此处是可以为负数的 PL/SQL表实例: declare --index by binary_integer表示下标是整数,正整数和负整数都可以的 type sp_table_type is table of emp.ename%type index by binary_integer; sp_table sp_table_type; begin select ename into sp_table(0) from emp where empno=7788; dbms_output.put_line('员工名:' || sp_table(0)); end; ?如何返回多条数据类型?? 复合变量-参照变量 参照变量是指用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享相同的对象,从而降低占用的控件,在编写 PL/SQL程序时,可以使用游标比那辆(ref cursor)和对象类型变量(ref obj_type)两种参照变量类型 参照变量-ref cursor游标变量 使用游标时,当定义游标时不需要 declare --定义游标类型sp_emp_cursor type sp_emp_cursor is ref cursor;//定义了一个游标 --定义游标变量 test_cursor sp_emp_cursor; --定义变量 v_ename emp.ename%type; v_sal emp.sal%type; begin --执行 --把test_cursor 和一个 select结合,即test_cursor指向结果集 open test_cursor for select ename,sal from emp where deptno=&no; loop fetch test_cursor into v_ename,v_sal; --判断工资高低,决定是否更新 --判断是否test_cursor为空 exit when test_cursor%notfound; dbms_output.put_line('名字:' || v_name || '工资:' || v_sal); end loop; end; 复合变量-嵌套表 复合变量-复合表
|