标签:str else otf 动态数组 员工信息 phrase soft char dev
?
【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.打开游标
???????fetch emp_cursor into v_empno,v_ename,v_sal; --3.提取游标
????????dbms_output.put_line(emp_cursor%ROWCOUNT);
???????fetch emp_cursor into v_empno,v_ename,v_sal;
???????fetch emp_cursor into v_empno,v_ename,v_sal;
???????dbms_output.put_line(emp_cursor%ROWCOUNT);
?
????????if emp_cursor%notfound then
??????????dbms_output.put_line(‘true‘);
?????????dbms_output.put_line(‘false‘);
???????dbms_output.put_line(v_empno||‘,‘||v_ename||‘,‘||v_sal);
???????close emp_cursor; --4.关闭游标
--方法2:loop循环
???????v_empno emp.empno%type; --参照表的列的数据类型 表名.列名%type
???????v_ename emp.ename%type;
???????v_sal emp.sal%type;
??????loop
????????????fetch emp_cursor into v_empno,v_ename,v_sal;
????????????exit
when emp_cursor%notfound;
????????????dbms_output.put_line(v_empno||‘,‘||v_ename||‘,‘||v_sal);
--方法3:--while loop循环
???????v_empno emp.empno%type;
???????v_ename emp.ename%type;
???????v_sal emp.sal%type;
???????fetch emp_cursor into v_empno,v_ename,v_sal;
????????????dbms_output.put_line(v_empno||‘,‘||v_ename||‘,‘||v_sal);
????????????fetch emp_cursor into v_empno,v_ename,v_sal;
--改成参照类型(?)
???????e emp%rowtype;
??????loop
????????????exit
when emp_cursor%notfound;
????????????dbms_output.put_line(e.empno||‘,‘||e.ename||‘,‘||e.sal);
--游标提取的值赋给表类型(动态数组)
???????type emp_table_type is
table
of emp%rowtype
?
???????e emp_table_type;
????????????fetch emp_cursor bulk collect into e limit 5;--限制取的条数
?
??????????dbms_output.put_line(e(i).ename);
--循环取出所有的记录
???????type emp_table_type is
table
of emp%rowtype
?
???????e emp_table_type;
??????loop
????????????fetch emp_cursor bulk collect into e limit 5;--限制取的条数
???????????????????dbms_output.put_line(e(i).ename);
????????????exit
when emp_cursor%notfound;
--带参数游标,根据部门编号查询员工信息
???????cursor emp_cursor(p_deptno emp.deptno%type) is
???????e emp%rowtype;
???????open emp_cursor(10);
??????loop
????????????exit
when emp_cursor%notfound;
????????????dbms_output.put_line(e.empno||‘,‘||e.ename||‘,‘||e.sal);
??????dbms_output.put_line(‘-----------------‘);
???????open emp_cursor(20);
??????loop
????????????exit
when emp_cursor%notfound;
????????????dbms_output.put_line(e.empno||‘,‘||e.ename||‘,‘||e.sal);
--游标for循环
???????for e in emp_cursor loop
?????????dbms_output.put_line(e.ename);
--最精简版
?????????dbms_output.put_line(e.ename);
--根据部门表循环输出员工信息
--部门编号: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循环带参数写法
?
???????cursor emp_cursor(v_deptno emp.deptno%type) is
???????for d in dept_cursor loop
??????????dbms_output.put_line(d.deptno||‘,‘||d.dname);
??????????for e in emp_cursor(d.deptno) loop
????????????dbms_output.put_line(‘
‘||e.job||‘,‘||e.ename||‘,‘||e.hiredate);
--精简写法
dbms_output.put_line(d.deptno||‘,‘||d.dname);
dbms_output.put_line(‘
‘||e.job||‘,‘||e.ename||‘,‘||e.hiredate);
--隐式游标
隐式游标:固定名称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‘);
?????????dbms_output.put_line(‘FALSE‘);
--游标更新(current of 游标变量名)
--更改所有员工工资<1000,加1000;
???????for e in emp_c loop
??????-- dbms_output.put_line(SQL%ROWCOUNT);
--动态游标
--根据用户的输入选择输出不同的表记录
--E,查询输出emp的姓名
--D,查询输出dept的部门名称
???????v_cmd CHAR(1) := ‘&input‘;
?
???????--声明自定义的游标变量类型
???????--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(‘部门名称‘);
??????????dbms_output.put_line(‘输入无效‘);
?
???????LOOP
???????????dbms_output.put_line(v_name);
?
【JSU】LJDragon‘s Oracle course over in 5th.
ORACLE STUDY NOTES 04
标签:str else otf 动态数组 员工信息 phrase soft char dev
原文地址:http://www.cnblogs.com/anstoner/p/6224470.html