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;
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;