ORACLE STUDY NOTES 04
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE STUDY NOTES 04相关的知识,希望对你有一定的参考价值。
?
【JSU】LJDragon‘s Oracle course notes In the first semester, junior year
?
PL/SQL游标(declare .. begin .. end)
--游标:指向查询结果集的指针,指针指向哪一行,提取的就是哪一行的数据
--PLSQL的游标默认指向结果集的第1行
--显示游标的四大步骤:
1.定义游标 cursor 游标变量名 is 查询语句;
2.打开游标 open 游标变量名;(可以重复打开)
3.提取游标 fetch 游标变量名 into 变量名;
4.关闭游标 close 游标变量名;
--游标的四大属性:
1.游标变量名%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为TRUE;
2.游标变量名%NOTFOUND 和%found相反
3.游标变量名%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;
4.游标变量名%ROWCOUNT 数字型属性,返回已从游标中读取的记录数
?
--查询输出10号部门的所有员工(编号,姓名,工资)
- ???????v_empno emp.empno%type;
- ???????v_ename emp.ename%type;
- ???????v_sal emp.sal%type;
- ???????open emp_cursor; --2.打开游标
- ????????dbms_output.put_line(emp_cursor%ROWCOUNT);
- ???????dbms_output.put_line(emp_cursor%ROWCOUNT);
- ?
- ??????????dbms_output.put_line(‘true‘);
- ???????else
- ?????????dbms_output.put_line(‘false‘);
- ???????dbms_output.put_line(v_empno||‘,‘||v_ename||‘,‘||v_sal);
- ???????close emp_cursor; --4.关闭游标
- end;
--方法2:loop循环
- ???????v_empno emp.empno%type; --参照表的列的数据类型 表名.列名%type
- ???????v_ename emp.ename%type;
- ???????v_sal emp.sal%type;
- ???????open emp_cursor;
- ??????loop
- ????????????dbms_output.put_line(v_empno||‘,‘||v_ename||‘,‘||v_sal);
- ??????end loop;
- ??????close emp_cursor;
- end;
--方法3:--while loop循环
- ???????v_empno emp.empno%type;
- ???????v_ename emp.ename%type;
- ???????v_sal emp.sal%type;
- ???????open emp_cursor;
- ????????????dbms_output.put_line(v_empno||‘,‘||v_ename||‘,‘||v_sal);
- ???????end loop;
- ??????close emp_cursor;
- end;
--改成参照类型(?)
- ???????e emp%rowtype;
- ???????open emp_cursor;
- ??????loop
- ????????????dbms_output.put_line(e.empno||‘,‘||e.ename||‘,‘||e.sal);
- ??????end loop;
- ??????close emp_cursor;
- end;
--游标提取的值赋给表类型(动态数组)
- ?
- ???????e emp_table_type;
- ??????open emp_cursor;
- ??????close emp_cursor;
- ?
- ??????????dbms_output.put_line(e(i).ename);
- ??????end loop;
- end;
--循环取出所有的记录
- ?
- ???????e emp_table_type;
- ??????open emp_cursor;
- ??????loop
- ???????????????????dbms_output.put_line(e(i).ename);
- ???????????????end loop;
- ??????end loop;
- ??????close emp_cursor;
- end;
--带参数游标,根据部门编号查询员工信息
- ???????e emp%rowtype;
- ???????open emp_cursor(10);
- ??????loop
- ????????????dbms_output.put_line(e.empno||‘,‘||e.ename||‘,‘||e.sal);
- ??????end loop;
- ??????close emp_cursor;
- ??????dbms_output.put_line(‘-----------------‘);
- ???????open emp_cursor(20);
- ??????loop
- ????????????dbms_output.put_line(e.empno||‘,‘||e.ename||‘,‘||e.sal);
- ??????end loop;
- ??????close emp_cursor;
- end;
--游标for循环
--最精简版
--根据部门表循环输出员工信息
--部门编号:10,部门名称
--员工编号:xxx ,姓名:xxx,职位:xxx,入职日期:xxx
--员工编号:xxx ,姓名:xxx,职位:xxx,入职日期:xxx
--员工编号:xxx ,姓名:xxx,职位:xxx,入职日期:xxx
--部门编号:20,部门名称
--员工编号:xxx ,姓名:xxx,职位:xxx,入职日期:xxx
--员工编号:xxx ,姓名:xxx,职位:xxx,入职日期:xxx
--员工编号:xxx ,姓名:xxx,职位:xxx,入职日期:xxx
--游标for循环带参数写法
- ?
- ??????????dbms_output.put_line(d.deptno||‘,‘||d.dname);
- ????????????dbms_output.put_line(‘ ‘||e.job||‘,‘||e.ename||‘,‘||e.hiredate);
- ????????????end loop;
- ???????end loop;
- end;
--精简写法
- dbms_output.put_line(d.deptno||‘,‘||d.dname);
- dbms_output.put_line(‘ ‘||e.job||‘,‘||e.ename||‘,‘||e.hiredate);
- ??????????end loop;
- ???????end loop;
- end;
--隐式游标
隐式游标:固定名称SQL
游标四个属性:
SQL%FOUND:如果操作有影响的行,就为TRUE,否则为FALSE
SQL%NOTFOUND:求反
SQL%ISOPEN:在隐式游标中,取值永远为FALSE
SQL%ROWCOUNT:操作影响的行数
1.在事务提交之前获取游标属性;
2.只取最近的一条DML操作状态;
- ???????--delete emp where 1=2;
- ?????????dbms_output.put_line(‘TRUE‘);
- ???????ELSE
- ?????????dbms_output.put_line(‘FALSE‘);
- ???????commit;
- end;
--游标更新(current of 游标变量名)
--更改所有员工工资<1000,加1000;
--动态游标
--根据用户的输入选择输出不同的表记录
--E,查询输出emp的姓名
--D,查询输出dept的部门名称
- ???????v_cmd CHAR(1) := ‘&input‘;
- ???????v_name VARCHAR2(50);
- ?
- ???????--声明自定义的游标变量类型
- ???????--TYPE c_type IS REF CURSOR;
- ???????--声明游标变量
- ????????--c c_type;
- ?
- ???????c SYS_REFCURSOR;--代替TYPE c_type IS REF CURSOR
- ??????????dbms_output.put_line(‘员工姓名‘);
- ???????ELSIF v_cmd=‘D‘ THEN
- ??????????dbms_output.put_line(‘部门名称‘);
- ???????ELSE
- ??????????dbms_output.put_line(‘输入无效‘);
- ??????????RETURN;
- ?
- ???????LOOP
- ???????????dbms_output.put_line(v_name);
- ???????END LOOP;
- ?
- ???????CLOSE c;
- END;
【JSU】LJDragon‘s Oracle course over in 5th.
以上是关于ORACLE STUDY NOTES 04的主要内容,如果未能解决你的问题,请参考以下文章