PL/SQL——编程——变量定义(标量、复合变量、游标变量)

变量类型
标量类型(scalar)
复合类型(composite)
参照类型(reference)
lob(large object)

1、标量类型(scalar)

--定义一个变长字符串
v_ename VARCHAR2(10)
--定义一个小数,范围-9999.99~9999.99
v_sal NUMBER(6,2)
--定义一个小数,并给初始值5.4,:=是plsql的赋值符
v_sal2 NUMBER(6,2):=5.4
--定义一个日期类型
v_hiredate date
--定义一个布尔量,不能为空,初始值为false
v_valid BOOLEAN NOT NULL default FALSE

 例子

DECLARE
  c_tax_rate NUMBER(3,2):=0.03;
  v_ename varchar2(30); //v_ename emp.ename%type; v_ename的类型同emp.ename类型一致
  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;

2、复合类型(composite)
用于存放多个值的变量
(1)pl/sql记录
类似于高级语言的结构体,当引用pl/sql记录的成员时,必需要加记录变量作为前缀
DECLARE
TYPE emp_record_type IS RECORD(
empname   emp.ename%TYPE,
salary    emp.sal%TYPE,
title     emp.job%TYPE);
sp_record emp_record_type;--变量sp_record的类型为emp_record_type
BEGIN
  SELECT ename,sal,job INTO sp_record FROM emp WHERE empno=7654;
  dbms_output.put_line('姓名:'||sp_record.empname||' 工资:'||sp_record.salary||' 工作:'||sp_record.title);
END;

(2)pl/sql表
类似于高级语言的数组,但是在高级语言中数组下标不能为负数,而pl/sql表的下标可以是任意值
--PL/SQL表类型实例1 一行数据如果返回多行数据则需要使用参照变量
DECLARE
--定义一个表类型sp_table_type,该类型用于存放emp.ename%TYPE
--INDEX BY Binary_Integer表示下标由整数表示
TYPE sp_table_type IS TABLE OF emp.ename%TYPE INDEX BY Binary_Integer;
sp_table sp_table_type;--变量sp_table的类型为sp_table_type
BEGIN
  SELECT ename INTO sp_table(0) FROM emp WHERE empno=7654;
  dbms_output.put_line('姓名:'||sp_table(0));
END;

3、参照类型(reference)
是用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享相同的对象,从而降低占用的内存。
游标变量ref cursor
在使用游标时,当定义游标时不需要制定相应的select语句,但是当使用游标open时需要指定select语句
--PL/SQL游标变量ref cursor实例 输入部门编号显示该部门的所有员工的姓名和工资
DECLARE
--定义一个游标
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语句结合
  OPEN test_cursor FOR SELECT ename,sal FROM emp WHERE emp.deptno=&NO;
--循环取出数据
  LOOP
    FETCH test_cursor INTO v_ename,v_sal;
    --判断test_cursor是否为空
    EXIT WHEN test_cursor%NOTFOUND;
    dbms_output.put_line('姓名:'||v_ename||' 工资:'||v_sal);
  END LOOP;
END;

posted on 2014-04-28 22:38  Sunny_NUAA  阅读(635)  评论(0编辑  收藏  举报

导航