------------------------------PL SQL
--1,PL/SQL块
--PL/SQL 块是在SQL 语言之上发展起来的一种应用,可以集中的处理各种复杂的SQL操作。
--组成:
DECLARE:
--声明部分
BEGIN
--编写主题
EXCEPTION
--捕获异常
END ;
/*
看一个简单的PL/SQL 块
DECLARE
i NUMBER ;
BEGIN
i := 30 ;
DBMS_OUTPUT.put_line('I 的内容为:'||i) ;
END ;
*/
--此时,直接执行程序即可。
--执行之后发现没有任何的输出。因为Oracle 在系统设置中默认设置了输出不显示,如果要
--显示的话,输入以下命令:
set serveroutput on
DECLARE
i NUMBER ;
BEGIN
i:= 1/0;
EXCEPTION
when ZERO_DIVIDE then
dbms_output.put_line('error');
END ;
/
--PL/SQL 块还可以接收用户的输入信息,例如:现在要求用户输入一个雇员编号,之后根
--据输入的内容进行查询,查询雇员的姓名。
--用户的输入信息使用“&”完成。
DECLARE
eno NUMBER ;
en VARCHAR2(30) ;
BEGIN
-- 输入的信息保存在eno 里
eno := &no ;
-- 之后根据eno 的值,对数据库进行查询操作
SELECT ename INTO en FROM emp WHERE empno=eno ;
DBMS_OUTPUT.put_line('编号为:'||eno||'雇员的姓名为:'||en) ;
EXCEPTION
WHEN no_data_found THEN
DBMS_OUTPUT.put_line('没有此雇员') ;
END ;
/
DECLARE
eno number;
en varchar2(30);
dn varchar2(20);
BEGIN
--输入的信息保存在eno中
eno := &no;
--根据eno的值查询ename,dname
select ename into en from emp where empno = eno;
select dname into dn from dept where empno = eno and deptno=dept.deptno;
Dbms_Output.put_line('编号为:'||eno||'的雇员的姓名为:'||en||'在'||ed||'部门上班。');
Exception
when no_data_found then
Dbms_Output.put_line('没有此雇员');
END;
/
--在以上的查询中再进一步:可以根据雇员的编号查出姓名及其领导的姓名和所在部门
--并进行显示
DECLARE
eno emp.empno%TYPE;
en emp.ename%TYPE;
mn emp.ename%TYPE;
dn dept.dname%TYPE;
BEGIN
--输入的雇员编号保存在eno中
eno:=&no;
--之后根据输入的固原编号进行查询
SELECT e.ename,m.ename,d.dname INTO en,mn,dn FROM emp e,dept d,emp m
WHERE e.empno=eno AND e.mgr = m.empno AND e.deptno = d.deptno;
Dbms_Output.put_line('编号为'||eno||'的雇员的姓名为:'||en);
Dbms_Output.put_line('编号为'||eno||'的上级的姓名为:'||mn);
Dbms_Output.put_line('编号为'||eno||'的雇员的部门为:'||dn);
EXCEPTION
WHEN no_data_found THEN
Dbms_Output.put_line('没有此雇员!');
END;
/
----------------------------------------Loop循环(do...while)
--PL/SQL中也包含了循环分支等条件控制语句
/*Loop 循环(do…while)
格式:
LOOP
循环的语句 ;
EXIT WHEN 终止条件 ;
循环条件必须更改 ;
END LOOP ;
*/
--循环输出1~10。
DECLARE
cou NUMBER ;
BEGIN
--必须给一个初始值
cou:=1;
Loop
DBMS_OUTPUT.put_line('cou='||cou);
EXIT WHEN cou>=10;
cou:=cou+1;
END LOOP;
END;
/
-----------------------------------while循环
/*
格式:
while(判断循环的条件) loop
循环的语句 ;
循环条件的改变 ;
End loop ;
*/
--使用while修改上面的程序
DECLARE
cou NUMBER;
BEGIN
cou:=1;
WHILE(cou<=10)LOOP
DBMS_OUTPUT.put_line('cou='||cou);
cou:=cou+1;
END LOOP;
END;
/
----------------------------------for循环
/*
格式:
FOR 变量名称in 变量的初始值..结束值LOOP
循环语句 ;
END LOOP ;
*/
DECLARE
cou NUMBER;
BEGIN
for cou in 1..10 LOOP
DBMS_OUTPUT.put_line('cou='||cou);
END LOOP;
END;
-----------------------------------if语句
/*
条件判断
格式:
IF 条件THEN
满足条件时,执行此语句
END IF ;
*/
DECLARE
cou NUMBER;
BEGIN
cou:=11;
if(cou>0)THEN
cou:=cou-1;
DBMS_OUTPUT.put_line('cou='||cou);
END if;
END;
------------------------------if.....else语句
/*
如果if满足了则执行else
*/
DECLARE
cou1 NUMBER;
cou2 NUMBER;
BEGIN
cou2:=&cou1;
IF cou2>10 THEN
DBMS_OUTPUT.put_line('cou2='||cou2||'大于10.');
ELSE
DBMS_OUTPUT.put_line('cou2='||cou2||'小于或等于10.');
END IF;
END;
-----------------------------if....elseif.......else;
DECLARE
cou1 NUMBER;
cou2 NUMBER;
BEGIN
cou2:=&cou1;
IF cou2>10 THEN
DBMS_OUTPUT.put_line('cou2='||cou2||'大于10.');
ELSE IF cou2<10 THEN
DBMS_OUTPUT.put_line('cou2='||cou2||'小于10.');
ELSE
DBMS_OUTPUT.put_line('cou2='||cou2||'等于10.');
END IF;
END IF;
END;
-----------------------------goto语句 无条件跳转语句
DECLARE
eno emp.empno%type;
sal emp.sal%type;
BEGIN
eno:=&en;
SELECT sal INTO sal FROM emp WHERE empno=eno;
IF sal>3500 THEN
goto po1;
ELSIF sal>2000 THEN
goto po2;
else
goto po3;
END IF;
<<po1>>
DBMS_OUTPUT.put_line('高工资。。。。');
<<po2>>
DBMS_OUTPUT.put_line('中工资。。。。');
<<po3>>
DBMS_OUTPUT.put_line('低工资。。。。');
END;
/