您的位置:首页 > 数据库 > Oracle

【初识Oracle】⑥PL/SQL基础基本程序块以及存储类型

2014-08-08 16:42 666 查看
--PL/SQL基础  Procedure Language & Structured Query Language

--PL/SQL的基本组成
--声明部分
DECLARE
--执行部分
BEGIN
--异常处理部分
EXCEPTION
END;

--(匿名块)键盘接收两个数字并打印
DECLARE
num1 NUMBER;
num2 NUMBER;
results NUMBER;
BEGIN
num1:=&num1;
num2:=&num2;
results:=num1+num2;
dbms_output.put_line(num1||'+'||num2||'='||results);
END;
--(匿名块)输出当前部门的人数
DECLARE
num1 NUMBER;
BEGIN
SELECT COUNT(*) INTO num1 FROM emp WHERE deptno=&deptno;
dbms_output.put_line('总人数:'||num1);
END;
SELECT * FROM emp;
--对表格数据进行设置
DECLARE
BEGIN
UPDATE emp SET sal=sal*1.2 WHERE deptno=10;
END;
--设置函数
CREATE OR REPLACE PROCEDURE update_emp(dno NUMBER) IS
BEGIN
UPDATE emp SET sal=sal/1.2 WHERE deptno=dno;
END;

DECLARE
dno NUMBER;
BEGIN
dno:=&dno;
update_emp(dno);
END;

--查询并打印指定的员工信息
DECLARE
v_name VARCHAR2(10);
v_salary NUMBER;
v_hiredate DATE;
BEGIN
SELECT ename,sal,hiredate INTO v_name,v_salary,v_hiredate FROM emp WHERE empno=&empno;
dbms_output.put_line('雇员名称:'||v_name);
dbms_output.put_line('薪水:'||v_salary);
dbms_output.put_line('入职时间:'||v_hiredate);
END;
--%TYPE可以自动根据列或者其他变量的类型和长度定义新变量
DECLARE
v_name emp.ename%TYPE;
v_salary emp.sal%TYPE;
v_hiredate emp.hiredate%TYPE;
BEGIN
SELECT ename,sal,hiredate INTO v_name,v_salary,v_hiredate FROM emp WHERE empno=&empno;
dbms_output.put_line('雇员名称:'||v_name);
dbms_output.put_line('薪水:'||v_salary);
dbms_output.put_line('入职时间:'||v_hiredate);
END;

--记录类型
--%ROWTYPE(变量的类型与表中整行记录完全相同)
DECLARE
emp_record emp%ROWTYPE;
BEGIN
SELECT * INTO emp_record  FROM emp WHERE empno=&empno;
dbms_output.put_line('雇员名称:'||emp_record.ename);
dbms_output.put_line('薪水:'||emp_record.sal);
dbms_output.put_line('入职时间:'||emp_record.hiredate);
END;
--自定义类型
DECLARE
--类型的定义
TYPE emp_record_type IS RECORD(
v_name emp.ename%TYPE,
v_salary emp.sal%TYPE,
v_hiredate emp.hiredate%TYPE
);
--变量的声明
emp_record emp_record_type;
BEGIN
SELECT ename,sal,hiredate INTO emp_record  FROM emp WHERE empno=&empno;
dbms_output.put_line('雇员名称:'||emp_record.v_name);
dbms_output.put_line('薪水:'||emp_record.v_salary);
dbms_output.put_line('入职时间:'||emp_record.v_hiredate);
EXCEPTION
WHEN NO_DATA_FOUND THEN dbms_output.put_line('该员工不存在');
END;
--集合类型
--一维表
DECLARE
TYPE empno_table_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
empno_table empno_table_type;

TYPE dname_table_type IS TABLE OF dept.dname%TYPE INDEX BY BINARY_INTEGER;
dname_table dname_table_type;
BEGIN
empno_table(1):=3;
empno_table(2):=4;
empno_table(200):=4;
empno_table(-200):=4;

dbms_output.put_line('1:'||empno_table(1));
dbms_output.put_line('2:'||empno_table(2));
dbms_output.put_line('200:'||empno_table(200));
dbms_output.put_line('-200:'||empno_table(-200));

SELECT dname INTO dname_table(-1) FROM dept WHERE deptno=&deptno;
dbms_output.put_line('dname_table(-1):'||dname_table(-1));
END;
--二维表
DECLARE
TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;
dept_table dept_table_type;
BEGIN
SELECT * INTO dept_table(10) FROM dept WHERE deptno=&deptno;
dbms_output.put_line('dept_table(10).dname:'||dept_table(10).dname);
dbms_output.put_line('dept_table(10).loc:'||dept_table(10).loc);
dbms_output.put_line('dept_table(10).deptno:'||dept_table(10).deptno);
END;

--可变数组
DECLARE
TYPE dept_varray_type IS VARRAY(10) OF dept.dname%TYPE NOT NULL;
dept_varray dept_varray_type:=dept_varray_type('1','2','3','4','5');
BEGIN
dbms_output.put_line('dept_varray(1):'||dept_varray(1));
SELECT dname INTO dept_varray(2) FROM dept WHERE deptno=20;
dbms_output.put_line('dept_varray(2):'||dept_varray(2));
--集合里面常用的方法
dbms_output.put_line(dept_varray.count);
dbms_output.put_line(dept_varray.limit);
dbms_output.put_line(dept_varray.first);
dbms_output.put_line(dept_varray.last);
dbms_output.put_line(dept_varray.prior(2));
dbms_output.put_line(dept_varray.next(2));
END;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: