PL/SQL数据类型

2015-07-16 12:08:49 · 作者: · 浏览: 0

1、变量和常量
变量语法: variable_name data_type [[NOT NULL] [:=VALUE]]
? ? 说明:NOT NULL对变量定义非空约束,必须为变量赋非空的初始值,并且不允许在任何时候将其值修改为NULL。
--变量样例:
SQL>SERVEROUT ON
SQL>DECLARE
? v_num NUMBER(4);
?BEGIN
? v_num:=20;
? DBMS_OUTPUT.PUT_LINE('变量名v_num的值为:'||v_num);
?END;
?/


常量语法: constant_name CONSTANT data_type [:=VALUE]
--常量样例:
DECLARE
? c_num CONSTANT NUMBER(4):=100;
BEGIN?
? DBMS_OUTPUT.PUT_LINE('常量名c_num的值为:'||c_num);
END;


?
2、复合数据类型
2.1 %TYPE类型
? ? 引用某个变量或者数据库的列的类型作为某变量的数据类型。
SET SERVEROUT ON
DECLARE
? ? v_ename scott.emp.ename%TYPE;
? ? v_sal1 number(11);
? ? v_sal2 v_sal1%TYPE;
BEGIN
? ? SELECT ename,sal INTO v_ename,v_sal1 FROM scott.emp WHERE empno=7369;
? ? v_sal2:=v_sal1;
? ? DBMS_OUTPUT.PUT_LINE(v_ename||'的工资是'||v_sal2);
END;


2.2 %ROWTYPE
? ? 引用数据库表中的一行作为数据类型,即RECORD类型(记录类型),是PL/SQL的附加类型。表示一条记录,相当于JAVA中的对象。可以使用“.”来访问记录中的属性。


12345678910111213 DECLARE
?
? ? v_emp scott.emp%ROWTYPE;? ? ?
?
BEGIN
?
? ? SELECT * INTO v_emp FROM scott.emp WHERE empno=7654;? ? ?
?
? ? DBMS_OUTPUT.PUT_LINE('姓名:'||v_emp.ename);
?
? ? DBMS_OUTPUT.PUT_LINE('部门编号:'||v_emp.deptno);
?
END;


?
2.3 记录类型
语法:TYPE record_type IS RECORD(
? ? ? ? ? ? ? ? field1_name data_type_and_size [NOT NULL][:=default_value],
? ? ? ? ? ? ? ? ...
? ? ? ? ? ? ? ? fieldn_name data_type_and_size [NOT NULL][:=default_value]
? ? ? ? ? ? );
? ? 将逻辑相关的数据作为一个单元存储起来,使用TYPE关键字来定义,是显示记录类型,使用%ROWTYPE是隐式记录类型。
--样例一:
DECLARE
?
?TYPE emp_record_type IS RECORD(
?
? ? ? ename VARCHAR2(10),
?
? ? ? deptno NUMBER(2)
?
?);? ?
?
? ? emp_record emp_record_type;? ? ?
?
BEGIN? ?
?
? ? SELECT ename,deptno INTO emp_record FROM scott.emp WHERE empno=7654;? ? ? ? ?
?
? ? DBMS_OUTPUT.PUT_LINE('姓名:'||emp_record.ename);? ?
?
? ? DBMS_OUTPUT.PUT_LINE('部门编号:'||emp_record.deptno);
?
END;


?--样例二:
DECLARE
?
? TYPE emp_record_type IS RECORD(
?
? ? ? name scott.emp.ename%TYPE,
?
? ? ? salary scott.emp.sal%TYPE,
?
? ? ? deptno scott.emp.deptno%TYPE
?
? );
?
? emp_record emp_record_type;
?
BEGIN
?
? select ename,sal,deptno into emp_record from scott.emp where empno=&no;? ? ? ?
?
? DBMS_OUTPUT.PUT_LINE('姓名:'||emp_record.name);? ?
?
? DBMS_OUTPUT.PUT_LINE('部门编号:'||emp_record.deptno);
?
END;


或:
1234567891011121314151617181920212223 DECLARE
?
? TYPE emp_record_type IS RECORD(
?
? ? ? name scott.emp.ename%TYPE,
?
? ? ? salary scott.emp.sal%TYPE,
?
? ? ? deptno scott.emp.deptno%TYPE
?
? );
?
? emp_record emp_record_type;
?
BEGIN
?
? ? ? ? select ename,sal,deptno into emp_record.name,emp_record.salary,emp_record.deptno from scott.emp where empno=&no;
?
? ? ? ? DBMS_OUTPUT.PUT_LINE('姓名:'||emp_record.name);? ?
?
? ? ? ? DBMS_OUTPUT.PUT_LINE('部门编号:'||emp_record.deptno);
?
END;


?--样例三:
--检索数据
DECLARE
? ? ? ? dept_record scott.dept%ROWTYPE;
BEGIN
? ? ? ? dept_record.deptno:=1;
? ? ? ? dept_record.dname:='administrator';
? ? ? ? dept_record.loc:='NC';
? ? ? ? insert into scott.dept values dept_record;
END;
--插入数据
DECLARE
? ? ? ? dept_record scott.dept%ROWTYPE;
BEGIN
? ? ? ? dept_record.deptno:=2;
? ? ? ? dept_record.dname:='administrator';
? ? ? ? insert into scott.dept(deptno,dname) values(dept_record.deptno,dept_record.dname);
END;?
--更新数据
DECLARE
? ? ? ? dept_record scott.dept%ROWTYPE;
BEGIN
? ? ? ? dept_record.deptno:=1;
? ? ? ? dept_record.dname:='HZY';
? ? ? ? update scott.dept set row=dept_record where deptno=dept_record.deptno;
END;
--删除数据
DECLARE
? ? ? ? dept_record scott.dept%ROWTYPE;
BEGIN
? ? ? ? dept_record.deptno:=1;
? ? ? ? delete from scott.dept where deptno=dept_record.deptno;
END;