-- =====<PL/SQL中的数据类型>===== --
-- 包含标量类型、LOB类型、属性类型
-- 标量类型包含:数字、字符、布尔型、日期时间、参照类型
-- LOB类型包含:BFILE、BLOB、CLOB、NCLOB
-- 复合类型包含:PL/SQL记录、PL/SQL表
-- 1.标量类型(scalar)==>常用类型,数据库中的预定义类型的变量
-- 定义标量的语法:variable_NAME data_TYPE,其中variable_NAME是变量名,data_TYPE是PL/SQL中预定义的类型
-- 定义变量示例
-- 定义一个变长字符串
v_name varchar2(20);
-- 定义一个小数并赋初始值为5.4,:=是赋值号
v_sal2 number(6,2):=5.4;
-- 定义一个日期类型数据
v_hiredate date;
-- 定义一个布尔变量,不能为空,初始值为FALSE
v_valid boolean not null default false;
-- 定义一个常量
c_num constant number(5):=100;
-- 例:输入员工号,显示雇员姓名、工资、个人所得税。
-- 说明变量的使用
create or replace procedure pro_01(v_empno number) is -- 声明需要用到的变量变量 -- 声明就定义了该变量 v_ename varchar2(20); v_sal number(10,2); c_taxrate constant number(3,2):=0.03; v_tax number(10,2); begin select ename,sal into v_ename,v_sal from emp where empno=v_empno; -- 根据工资计算所得税 v_tax:=v_sal*c_taxrate; dbms_output.put_line('姓名:'||v_ename||'工资:'||v_sal||'所得税:'||v_tax); end;
-- 定义变量时数据类型参照数据库表中的数据类型,以实现对变量长度空间的灵活分配
create or replace procedure pro_02(v_empno number) is -- 声明变量时数据类型参照表字段的类型 v_ename emp.ename%type; v_sal emp.sal%type; c_taxrate constant number(3,2):=0.03; v_tax number(10,2); begin select ename,sal into v_ename,v_sal from emp where empno=v_empno; -- 根据工资计算所得税 v_tax:=v_sal*c_taxrate; dbms_output.put_line('姓名:'||v_ename||'工资:'||v_sal||'所得税:'||v_tax); end;
-- 两例代码请注意变量声明时变量类型的区别
-- 2.复合变量==>
-- PL/SQL记录=>一个类型存放多个数据
-- 定义一个PL/SQL记录类型emp_recordtype
-- 包含3个数据name,sal,job
-- 语法:type CompositeTyp_NAME is record();
-- 例:定义一个函数,根据输入的员工编号,返回员工的姓名,工资和岗位
-- 对于PL/SQL记录的使用首先要定义一个包,将记录放到包中:
-- 首先定义一个包 create or replace package package_01 is -- 在包中定义一个复合类型 type emp_recordtype is record( v_name emp.ename%type, v_sal emp.sal%type, v_job emp.job%type ); end package_01;
-- PL/SQL记录是为多返回值而生的,有时在PL/SQL编程中,得到的结果不止一个,且类型各不相同,使用PL/SQL记录可解决此问题:
-- 由于需要返回多个值,通过返回自定义类型,将多个值包含在自定义类型中 create or replace procedure pro_03(v_empno number) is -- 定义自定义类型的变量 v_record package_01.emp_recordtype; begin -- 查询语句 select ename,sal,job into v_record.v_name,v_record.v_sal,v_record.v_job from emp where empno=v_empno; dbms_output.put_line('姓名:'||v_record.v_name||'工资:'||v_record.v_sal||'岗位:'||v_record.v_job); end;
-- PL/SQL表=>
-- 例:查询部门10的所有员工的姓名。
create or replace procedure pro_04(v_deptno number) is -- 定义一个PL/SQL表类型=>表类型类似于C/C++/Java中的数组类型 type emp_tableNAME is table of emp.ename%type index by binary_integer; -- 使用自定义表类型创建数组变量 v_names emp_tableNAME; begin select ename into v_names(0) FROM EMP WHERE DEPTNO=v_deptno; dbms_output.put_line(v_names(0)); end; -- 此代码运行时报错,多条数据需要使用参照变量
-- 3.参照类型==>
-- 游标类型 ref cursor=>
-- 例:使用PL/SQL编写一个块,可以输入部门号,显示该部门所有员工的姓名和工资
-- 由于有多个结果,需要进行多取出结果,并输出,游标在此就充当了一个标记的作用,将结果循环获取
create or replace procedure pro_04(v_deptno number) is -- 定义一个游标类型 type empcursor_TYPE is ref cursor; -- 定义游标变量,此处默认是关闭的 emp_cursor empcursor_TYPE; -- 定义变量接受游标中的数据 v_ename emp.ename%type; v_sal emp.sal%type; begin -- 使用游标时要打开,再将PL/SQL语句执行的结果交给游标管理 open emp_cursor for select ename,sal from emp where deptno=v_deptno; -- 循环取出游标中的数据 loop -- 取游标数据 fetch emp_cursor into v_ename,v_sal; dbms_output.put_line('姓名:'||v_ename||'工资:'||v_sal); -- 当游标中没有数据时结束循环 exit when emp_cursor%notfound; end loop; end;