现在的位置: 首页 > 综合 > 正文

PL/SQL学习(复合数据类型与游标)

2018年05月14日 ⁄ 综合 ⁄ 共 2735字 ⁄ 字号 评论关闭

PL/SQL中复合数据类型与游标


一.复合数据类型

1.定义:

复合变量类型不是数据库中已经存在的数据类型,因此复合变量在声明类型之前,首先要创建复合类型,复合类型创建后可以多次被使用。

2.复合数据类型包括:

--记录:

存储在多个字段中的一组相关的数据项,每个字段都有自己的名字和数据类型。

 把字段的集合当做一个整体的逻辑单元。

主要用于从表中取出查询到的行数据。

DECLARE
TYPE emp_record_type IS RECORD   --创建一个记录类型
(ename  emp.ename%TYPE,
sal     emp.sal%TYPE,
job     VARCHAR2(9));
emp_record   emp_record_type;            --声明一个记录类型的变量emp_record
BEGIN

SELECT ename,sal,job
INTO emp_record
FROM emp
WHERE empno = 7788;
dbms_output.put_line('雇员名:='||emp_record.ename||';薪水='||emp_record.sal);
END;

--表

--嵌套表

--数组

3.%ROWTYPE属性

声明的变量对应于数据库表或视图中列的集合

在%ROWTYPE之前加上数据库表名

记录内字段的名字和数据类型参照表或视图中的列

优点:

可以不必知道数据库中列的数量和类型。

在运行期间,数据库中列的数量和类型可能发生变化。

在select语句中使用该属性可以有效的检索表中的列。

DECLARE 
emp_rec   emp%ROWTYPE;

BEGIN
SELECT * INTO emp_rec
FROM emp
WHERE empno=7739;

INSERT INTO test
VALUES(emp_rec.empno,emp_rec.ename,emp_rec.job,emp_rec.mgr,emp_rec.hiredate,emp_rec.sal,emp_rec.comm.emp_rec.deptno);
COMMIT;
END;

二.游标

1.定义:游标是Oracle系统在内存中开辟的一个工作区,在其中存放select语句返回的查询结果。

2.分类:

隐式游标:PL/SQL隐式建立并自动管理这一游标。

--由Oracle在内部声明

--由Oracle自动管理游标

--可以使用游标属性从最近执行的SQL语句中获取信息

--用于处理DML语句以及返回单行的查询

属性:


例子:

DECLARE
v_deptno NUMBER:=21;
rows_deleted VARCHAR2(30);
BEGIN
DELETE FROM emp
WHERE deptno = v_deptno;
rows_deleted:=(SQL%ROWCOUNT||'rows deleted');
dbms_output.put_line(rows_deleted);
END;

显示游标:由程序员显示说明及控制,用于从表中取出多行数据,并将多行数据一行一行单独处理。

--使用游标时,select语句查询的结果可以是单条记录,多条记录,也可以是零条记录。

--在游标工作区中,存在一个指针,初始状态它指向查询结果的首记录。

--要访问想查询结果的所有记录,可以通过fetch语句,进行指针的移动来实现。

--使用游标进行操作,包括定义游标,打开游标,提取游标,关闭游标。

--游标声明时,select子查询不能使用into语句。

属性:


例子1:

DECLARE
v_empno NUMBER(5);
v_ename VARCHAR2(30);
CURSOR emp_cursor IS
SELECT empno,ename FROM emp;
BEGIN
OPEN emp_cursor;
FOR i IN 1..5 LOOP
FETCH emp_cursor INTO v_empno,v_ename;
dbms_output.put_line(v_empno||' '||v_ename);
END LOOP;
CLOSE emp_cursor;
END;

例子2:

DECLARE 
v_empno NUMBER(5);
v_ename VARCHAR2(40);
CURSOR emp_cursor IS
SELECT empno,ename FROM emp;
BEGIN
IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
LOOP 
FETCH emp_cursor INTO v_empno,v_ename;
EXIT WHEN emp_cursor%NOTFOUND;
dbms_output.put_line(v_empno||' '||v_ename);
END LOOP;
dbms_output.put_line(emp_cursor%ROWCOUNT);
CLOSE emp_cursor;
END;

3.游标式For循环

--隐式的打开,提取和关闭游标

--隐式声明记录类型变量

DECLARE
  CURSOR EMP_CURSOR IS
    SELECT EMPNO, ENAME FROM EMP;
BEGIN
  FOR EMP_RECORD IN EMP_CURSOR LOOP
    IF EMP_RECORD.ENAME = 'scott' THEN
      DBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMPNO);
    END IF;
  END LOOP;
END;

4.使用子查询的游标式For循环(不需声明游标)

BEGIN
  FOR EMP_RECORD IN (SELECT EMPNO, ENAME FROM EMP) LOOP
    IF EMP_RECORD.ENAME = 'scott' THEN
      DBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMPNO);
    END IF;
  END LOOP;
END;

5.带有参数的游标

--在游标处于打开状态时,执行查询语句,将参数的值传递给游标。

--多次打开显示变量,每次活动集都不同。

DECLARE 
CURSOR emp_cursor 
(p_deptno NUMBER,p_sal NUMBER)
IS
SELECT ename FROM emp
WHERE deptno=p_deptno AND sal>p_sal;
BEGIN
OPEN emp_cursor(10,2000);
CLOSE emp_cursor;
...
OPEN emp_cursor(20,4000);
CLOSE emp_cursor;
...
END;

6.FOR UPDATE子句

--在事务执行期间可以显示锁定以拒绝访问

--在更新或删除行时要锁定该行




7.WHERE CURRENT OF子句

--首先要在游标中使用FOR UPDATE子句锁定行

--使用WHERE CURRENT OF 子句从显式游标中引用当前行


抱歉!评论已关闭.