变量包括有:

1)        标量类型(scalar)

2)        复合类型(composite)

3)        参照类型(reference)

4)        Lob(large object)

1.1.1   标量类型– 常用类型

pl/sql定义变量和常量的语法如下:

identifier [constant] datatype [not null] [:=| default expr]

identifier:名称

constant:指定常量

datatype:数据类型

not null:指定变量值不能为null

:= 给变量或是常量指定初始值

Default 用于指定初始值

Expr:指定初始值的pl/sql表达式,可是文本值、其它变量、函数等

案例:

1、  定义一个变长字符串

v_ename varchar2(10)

2、  定义一个小数 范围-9999.99 ~9999.99

V_sal number(6,2) := 5.4

3、  定义一个日期类型

V_hiredate date

4、  定义一个布尔变量,不能为空,初始值为false

V_valid Boolean not null default false;

 

使用%type属性定义变量按照数据库列来确定你定义的变量的类型和长度。

Declare

     V_ename emp.ename%type;

Begin

     Select ename into v_ename from emp where empno = &no;

End

 

1.1.2   复合类型

用于存放多个值的变量,主要包括这几种:

1、  pl/sql记录

类似于高级语言中的结构体,例如:

Declare

     --定义一个pl/sql记录类型emp_record,包含两个数据name,salary

     Type emp_record is record(name emp.ename%type,salary emp.sal%type);

     -- 定义了一个类型为emp_record的sp_record变量

     sp_record emp_record;

begin

     select ename,sal into sp_record from emp where empno=&empno;

     dbms_output.put_line(‘员工名:’|| sp_record.name );

end

%ROWTYPE

Record_name [schema.]table_name%ROWTYPE

将记录声明为数据库的相同结构。

 

 

2、  pl/sql表

类似于高级语言中的数组,并且pl/sql中可以下标为负数,而且表元素的下标没有限制,例如:

Declare

     -- 定义了一个pl/sql表类型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_type的Sp_table变量

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

 

3、  嵌套表

4、  Varray

 

1.1.3   参照变量

是指用于存放数值指针的变量,通过使用参照变量,可以使得应用程序共享相同对象,从而降低占用的空间,在编写pl/sql程序时,可以使用游标变量(ref cursor)和对象类型变量(ref obj_type)两种参照变量类型。

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

      Open test_cursor for select ename,sal from emp where deptno=&no;

      Loop

           Fetch test_cursor into v_ename,v_sal;

           Exit when test_cursor%notfound;

           Dbms_output.put_line(‘员工名:’||v_ename||’ 工资:’v_sal);

      End loop

End