PLSQL基本控制语句

--根据员工号,查询员工薪水

DECLARE
V_EMPNO EMP.EMPNO%TYPE;
V_SAL EMP.SAL%TYPE;
BEGIN
V_EMPNO := '7369';
SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO = V_EMPNO;
DBMS_OUTPUT.PUT_LINE(V_SAL);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('员工编号有误');
END;

--基础for循环

BEGIN
FOR V_I IN 1 .. 10 LOOP
DBMS_OUTPUT.PUT_LINE(V_I);
EXIT WHEN V_I = 5;
END LOOP;
END;
--在FOR循环中使用子查询
BEGIN
FOR v_emp_record IN (SELECT * FROM emp)LOOP
dbms_output.put_line(v_emp_record.ename);
END LOOP;
END;

--游标FOR循环

DECLARE
--定义一个游标
CURSOR EMP_CURSOR(V_EMPNO EMP.EMPNO%TYPE, V_ENAME EMP.ENAME%TYPE) IS
SELECT *
FROM EMP E
WHERE E.EMPNO = V_EMPNO
AND E.ENAME = V_ENAME;
BEGIN
FOR V_EMP_RECORD IN EMP_CURSOR(7788, UPPER('scott')) LOOP
DBMS_OUTPUT.PUT_LINE(V_EMP_RECORD.ENAME);
END LOOP;
END;

--GOTO语句的使用

BEGIN 
FOR v_i IN 1..10 LOOP
dbms_output.put_line(v_i);
GOTO caodan;
END LOOP;
<<caodan>>
dbms_output.put_line('caodan');
END;

--游标使用! 游标分为隐式游标和显示游标

--显示游标分为4个阶段,定义游标,打开游标,提取数据和关闭游标4个阶段。

 

DECLARE
--定义游标
CURSOR EMP_CURSOR IS
SELECT EMPNO, ENAME FROM EMP;
--定义游标
V_EMPNO EMP.EMPNO%TYPE;
V_ENAME EMP.ENAME%TYPE;
BEGIN
--打开游标
IF NOT EMP_CURSOR%ISOPEN THEN --等同于 IF EMP_CURSOR%ISOPEN = false 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_ENAME || ':' || V_EMPNO);
END LOOP;
--关闭游标
IF EMP_CURSOR%ISOPEN THEN
CLOSE EMP_CURSOR;
END IF;
END;

--请给出EMP表中的第5条记录

declare cursor emp_cursor
is
select * from emp ;
v_emp_rec emp%rowtype;
begin

--打开游标
if(not emp_cursor%isopen) then
open emp_cursor;
end if;
--从游标中提取信息
fetch emp_cursor into v_emp_rec;
while(emp_cursor%found) loop
--判断是否是第5条数据
--通过游标属性——游标计数器统计
if(emp_cursor%rowcount=5) then
dbms_output.put_line('雇员编号: '||v_emp_rec.empno);
dbms_output.put_line('雇员姓名: '||v_emp_rec.ename);
dbms_output.put_line('雇员工资: '||v_emp_rec.sal);
end if;
--为了避免形成死循环
fetch emp_cursor into v_emp_rec;
end loop;
--关闭游标
if(emp_cursor%isopen) then
close emp_cursor;
end if;
end;

--使用游标for循环如何控制

declare cursor emp_cursor
is
select * from emp;
begin
for idx in emp_cursor loop
if(emp_cursor%rowcount=5) then
dbms_output.put_line('雇员编号: '||idx.empno);
dbms_output.put_line('雇员姓名: '||idx.ename);
dbms_output.put_line('雇员工资: '||idx.sal);
end if;
end loop;
end;

--使用PL/SQL表

DECLARE
CURSOR EMP_CURSOR IS
SELECT * FROM EMP WHERE EMPNO = &EMPNO;
--定义一个PL/SQL表类型的变量(数组),进行类似集合操作
TYPE EMP_TABLE_TYPE IS TABLE OF EMP%ROWTYPE;
EMP_TABLE EMP_TABLE_TYPE;
BEGIN
OPEN EMP_CURSOR;
FETCH EMP_CURSOR BULK COLLECT
INTO EMP_TABLE;
CLOSE EMP_CURSOR;
--通过循环来处理PL/SQL表中的内容
FOR I IN 1 .. EMP_TABLE.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(EMP_TABLE(I).ENAME);
END LOOP;
END;

 

 

 

 

 

 

posted @ 2011-12-13 23:36  Hard-齐  阅读(584)  评论(0编辑  收藏  举报