您的位置:首页 > 数据库

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

2014-04-28 22:38 726 查看
变量类型
标量类型(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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: