第13章PLSQL程序设计基础.ppt
《第13章PLSQL程序设计基础.ppt》由会员分享,可在线阅读,更多相关《第13章PLSQL程序设计基础.ppt(101页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2022年年5月月30日星期一日星期一1第第1313章章 PL/SQLPL/SQL程序设计程序设计基础基础20222022年年5 5月月3030日星期一日星期一2 2PL/SQL语言基础语言基础一、例子DECLARE N CHAR(8); SAL NUMBER(5); I NUMBER(2);BEGIN SELECT SALARY INTO SAL FROM EMPLOYEES WHERE EMPLOYEE_ID=201; IF SAL 10000 THEN DBMS_OUTPUT.PUT_LINE(TO_CHAR(SAL)| 太少); ELSE DBMS_OUTPUT.PUT_LINE(TO
2、_CHAR(SAL)| 还可以); END IF;END;20222022年年5 5月月3030日星期一日星期一3 3二、PL/SQL简述 1. PL/SQL块及程序 用PL/SQL定义块可将多个SQL编制成程序。程序是由若干块组成。 2. PL/SQL块结构与用途 PL/SQL块由三部分组成:定义部分:定义所处理的变量、常量、游标等。可执行部分:SQL语句及控制结构的PL/SQL语句异常处理部分:对执行过程中的错误进行处理。块可以嵌套。20222022年年5 5月月3030日星期一日星期一4 4块结构:DECLARE 说明部分 BEGIN 语句(SQL或PL/SQL语句) EXCEPTION
3、 错误处理程序 END 3. PL/SQL程序分类 由基本PL/SQL块组成PL/SQL程序。程序有: 无名块:它嵌入在某个应用中的PL/SQL块。 存储过程或函数:命名了的PL/SQL块,可以带20222022年年5 5月月3030日星期一日星期一5 5参数,并重复调用,是数据库对象。 包:是命名PL/SQL块,由一组相关的过程、函数和标识符组成。是数据库对象。 触发器:与表相关联的存储过程。一表最多12个。4. PL/SQL程序运行环境 可以有多个:SQL Plus Worksheet,SQL PLUS等。 在SQL PLUS环境中,第一句是DECLARE或BEGIN就识别为是PL/SQL
4、程序。它只能以“/”表示程序结束。20222022年年5 5月月3030日星期一日星期一6 6三、PL/SQL基础1.标识符 标识符是用户定义的符号串,用来命名变量、常量、过程等。 标识符以字母开头,后跟数字(0-9)或特殊字符$、#和_。长度不超过30,不能是PL/SQL的保留字,不能有空格。 例1:合法标识符:A34、BB#,D_123DF 不合法标识符:5A$、#ABC、END。2. 变量及变量说明 变量是表示要处理数据项的名称。变量名用标识符来表示。 变量在使用之前必须用DECLARE进行说明。20222022年年5 5月月3030日星期一日星期一7 7变量说明: 变量名 CONSTA
5、NT 类型 NOT NULL:=值DEFAULT SQL表达式;例1: DECLARE aa char(5) not null:=TEST; bb number(3) default 5; cc char(4):=THIS; dd constant char(4) :=SWJ; -不能赋值beginDBMS_OUTPUT.PUT_LINE(aa| |to_char(bb)| |cc| |DD);end;说明:非空时要有初始值,NOT NULL在前,缺省值在后;每个变量说明占一行,且以分号“;”结束。变量说明要在DECLARE以后,BEGIN之前。20222022年年5 5月月3030日星期一日
6、星期一8 83.变量或常量类型数值型:NUMBER(p,s),INTEGER,FLOAT,DEC字符型:CHAR(n),VARCHAR2(n),RAW(n)日期型:DATE布尔型:BOOLEAN(TRUE或FALSE)大数据类型:BFILE,BLOB,CLOB,NCLOB4. 数据类型转换显示转换: TO_CHAR(),TO_NUMBER(), RAWTOHEX(),HEXTORAW(),ROWIDTOCHAR(),TO_DATE()20222022年年5 5月月3030日星期一日星期一9 95. 函数20222022年年5 5月月3030日星期一日星期一10106. 表达式表达式是由变量、常
7、量、列名、函数和运算符结合的有意义式子。数值表达式:数值运算符、变量、常量、函数等数值运算符:+、-、/、*、()例2: DECLARE A INT :=4; B FLOAT:=4.324; X FLOAT; BEGIN X:= SIN(3)*10+2*8-A*10*(10-B*2); DBMS_OUTPUT.PUT_LINE(TO_CHAR(X); END;20222022年年5 5月月3030日星期一日星期一1111字符表达式:字符运算符: |(合并)关系表达式:关系表达式的结果是TRUE和FALSE关系运算符: != = = LIKE IN BETWEENAND 例3: ABC 123
8、123345 THIS LIKE T% X BETWEEN 10 AND 20 A IN (SS,DD,AD) FALSE SIN(X)+10 A*2+B20222022年年5 5月月3030日星期一日星期一1212逻辑表达式逻辑运算符:NOT AND OR 例4: NOT (A 10 AND B100 AND CCC LIKE C%例5: DECLARE A INT :=4; B FLOAT:=4.324; X FLOAT; C BOOLEAN; BEGIN X:= SIN(3)*10+2*8-A*10*(10-B*2); C:=A IN (SS,DD,AD); IF C OR A10 TH
9、EN N2:=N1+10; DBMS_OUTPUT.PUT_LINE(TO_CHAR(N2); END IF; END;20222022年年5 5月月3030日星期一日星期一2020例2:嵌套选择结构DECLARE N1 NUMBER:=11; N2 NUMBER DEFAULT 10; BEGIN IF N110 THEN IF N210 THEN N2:=N2+10; ELSE N2:=N1*N1; END IF; DBMS_OUTPUT.PUT_LINE(TO_CHAR(n2);END;20222022年年5 5月月3030日星期一日星期一2222例4: IFTHENELSIFEND I
10、F结构DECLARE N1 NUMBER:=10; N2 NUMBER:=20; CC CHAR(20); C2 DATE:=TO_DATE(1999-1-1,YYYY-MM-DD);BEGIN DBMS_OUTPUT.PUT_LINE(TO_CHAR(C2); IF N110 THEN N2:=N1+10; ELSIF N1 BETWEEN 7 AND 12 THEN N2:=SQRT(N1)*2; ELSIF C2=DATE1998-1-1 THEN CC:=TO_CHAR(SYSDATE); ELSE CC:=NO RESULT; END IF; DBMS_OUTPUT.PUT_LINE
11、(CC| |TO_CHAR(N2);END;20222022年年5 5月月3030日星期一日星期一23233. CASE选择结构CASE 变量WHEN 表达式1 THEN 语句序列1;WHEN 表达式2 THEN 语句序列2;WHEN 表达式N THEN 语句序列N;ELSE 语句序列N+1;END CASE说明:1. 2. 20222022年年5 5月月3030日星期一日星期一2424例1:DECLARE C1 CHAR(1):=F; N1 NUMBER:=2; N2 NUMBER:=35; NC NUMBER;BEGIN NC:=ASCII(C1); CASE NC WHEN N2*N2
12、THEN N1:=N2*N2; DBMS_OUTPUT.PUT_LINE(N1=|TO_CHAR(N1); WHEN N2+N2 THEN N1:=N2+N2; DBMS_OUTPUT.PUT_LINE(N1=|TO_CHAR(N1); ELSE DBMS_OUTPUT.PUT_LINE(N1=|TO_CHAR(N1); DBMS_OUTPUT.PUT_LINE(NC=|TO_CHAR(NC); END CASE; END;20222022年年5 5月月3030日星期一日星期一25254. 循环结构循环结构是指按照指定的逻辑条件循环执行一组命令。有三种循环:LOOP-EXIT-END;LOOP
13、-EXIT-WHEN-END;WHILE-LOOP-END和FOR-IN-LOOP-END。条件条件语句序列语句序列当条件为真时,执行语句序列,直到条件为假。条件是任何合法的逻辑表达式或关系表达式。20222022年年5 5月月3030日星期一日星期一26264.1 LOOP-EXIT-END循环 LOOP 语句序列 EXIT END LOOP说明:执行EXIT时从循环中退出,在条件语句中执行EXIT。该循环中,必须有EXIT,否则就会成为“死循环”。EXIT只能在循环。例1:计算1+2+3+100DECLARE I INT :=1; S INT:=0;BEGIN LOOP S:=S+I; I
14、F I=100 THEN EXIT; END IF; I:=I+1; END LOOP;DBMS_OUTPUT.PUT_LINE(TO_CHAR(S); END; 20222022年年5 5月月3030日星期一日星期一27274.2 LOOP-EXIT WHEN-END循环 LOOP 语句序列 EXIT WITH 条件 -等价IF 条件 THEN EXIT,可用在其它循环 END LOOP例2:计算10!DECLARE I INT :=1; S INT:=1;BEGIN LOOP S:=S*I; EXIT WHEN I=10; I:=I+1; END LOOP; DBMS_OUTPUT.PUT
15、_LINE(TO_CHAR(S); END; 20222022年年5 5月月3030日星期一日星期一28284. 3 WHILE-LOOP-END循环WHILE 条件 LOOP 每次循环前计算条 语句序列; 件,为TRUE,执 END LOOP; 行语句,否则不。例3:计算s=1*2+2*3+N*(N+1),当N=50的值。DECLARE I INT :=1; S INT:=0;BEGIN WHILE I=50 LOOP S:=S+I*(I+1); I:=I+1; END LOOP;DBMS_OUTPUT.PUT_LINE(TO_CHAR(S); END; 20222022年年5 5月月303
16、0日星期一日星期一2929例4:在WHILE循环中使用EXIT或EXIT WHEN计算S=1*2*3+2*3*4+N*(N+1)*(N+2);当N=40DECLARE I INT :=1; S INT:=0;BEGIN WHILE TRUE LOOP S:=S+I*(I+1)*(I+2); EXIT WHEN I=40; I:=I+1; END LOOP;DBMS_OUTPUT.PUT_LINE(TO_CHAR(S); END; 说明:EXIT和EXIT WHEN可用在任何循环内,且只能在循环内。20222022年年5 5月月3030日星期一日星期一30304.4 FOR-IN-LOOP-EN
17、D循环FOR 循环变量 IN REVERSE下界.上界 LOOP 语句序列;END LOOP;说明: 循环变量被隐式说明为BINARY-INTEGER,也可显式说明。 步长1或-1(REVERSE),循环次数:上界-下界+1; EXIT或EXIT WHEN可用在FOR循环中; 已知循环次数时,可用FOR循环,也可用其它 末知循环次数不能用FOR循环 上界或下界可以为表达式。20222022年年5 5月月3030日星期一日星期一3131例5:显示20到50的平方根的值及它们的和。DECLARE S FLOAT :=0;BEGIN FOR I IN 20.50 LOOP DBMS_OUTPUT.P
18、UT_LINE(TO_CHAR(SQRT(I),9.9999); S:=S+SQRT(I); END LOOP; DBMS_OUTPUT.PUT_LINE(S= |TO_CHAR(S);END;说明:循环变量I不用说明。 20222022年年5 5月月3030日星期一日星期一3232例6: 步长-1。加REVERSE。说明:加REVERSE,DECLARE S FLOAT :=0; BEGIN FOR I IN REVERSE 20.50 LOOP DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQRT(I),9.9999); S:=S+SQRT(I); END LOOP; DBM
19、S_OUTPUT.PUT_LINE(S= |TO_CHAR(S); END;上界仍要大于下界。20222022年年5 5月月3030日星期一日星期一3333例7:上下界为表达式的FOR循环DECLARE S FLOAT :=0; N INT :=10;BEGIN FOR I IN REVERSE 2*N-1.N*N LOOP DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQRT(I),9.9999); S:=S+SQRT(I); END LOOP; DBMS_OUTPUT.PUT_LINE(S= |TO_CHAR(S);END;20222022年年5 5月月3030日星期一日星期
20、一3434例8: 生成字符串SWJ001-SWJ120declare n number(1); sn varchar2(8); sn1 char(3); begin for n in 1.120 loop if n10 then sn1:=ltrim(to_char(n,9); sn:=rtrim(swj00|sn1); else if n100 then sn1:=ltrim(to_char(n,99); sn:=rtrim(swj0|sn1); else sn1:=ltrim(to_char(n,999); sn:=rtrim(swj|sn1); end if ; end if; DBMS
21、_OUTPUT.PUT_LINE(SN); end loop; End;20222022年年5 5月月3030日星期一日星期一35354. 5 循环嵌套上面的任何循环都可以互相嵌套,且可以多重嵌套,但必须是完全嵌套。如:LOOP FOR LOOP -可有其它循环(多重循环) END LOOP; WHILE LOOP -可有其它循环(多重循环) END LOOP;END LOOP;20222022年年5 5月月3030日星期一日星期一3636例9: 两重循环,计算S=1!+2!+10!DECLARE S FLOAT :=0; N INT :=10; K INT ;BEGIN FOR I IN 1
22、.N LOOP - 计算阶乘和 K:=1; FOR J IN 1.I LOOP -计算K! K:=K*J; END LOOP; S:=S+K; DBMS_OUTPUT.PUT_LINE(TO_CHAR(K); END LOOP; DBMS_OUTPUT.PUT_LINE(S= |TO_CHAR(S);END;20222022年年5 5月月3030日星期一日星期一37374.6 循环标签循环标签是以用来标示循环,放在循环前。其格式: DECLARE S FLOAT :=0; N INT :=10; K INT ;BEGIN FOR I IN 1.N LOOP - 计算阶乘和 K:=1; FOR
23、J IN 1.I LOOP -计算K! K:=K*J; END LOOP FOR_LOOP2; S:=S+K; DBMS_OUTPUT.PUT_LINE(TO_CHAR(K); END LOOP FOR_LOOP1; DBMS_OUTPUT.PUT_LINE(S= |TO_CHAR(S);END;20222022年年5 5月月3030日星期一日星期一3838循环标签一是提高程序的可读性,二是可以从内循环跳到外层。LOOP. LOOP . EXIT outer WHEN . 退出两重循环。 END LOOP;.END LOOP outer;注意:只能从内循环跳到外循环,反之不行。20222022
24、年年5 5月月3030日星期一日星期一3939五、%TYPE类型PL/SQL变量用来存储表中的数据,但二者要有相同类型。要保证变量与列名类型总是一致,就要用%TYPE类型。 变量名 表名.列名%TYPE;例1:DECLARE J_T JOBS.JOB_TITLE%TYPE; BEGIN SELECT JOB_TITLE INTO J_T FROM JOBS WHERE JOB_ID=AD_VP; DBMS_OUTPUT.PUT_LINE(J_T); END;20222022年年5 5月月3030日星期一日星期一4040六、%ROWTYPE类型用%ROWTYPE说明变量为一个记录类型。 变量名
25、表名%ROWTYPE;引用变量时:变量名.列名例1:DECLARE EMP EMPLOYEES %ROWTYPE;BEGIN SELECT * INTO EMP FROM EMPLOYEES WHERE EMPLOYEE_ID=201; DBMS_OUTPUT.PUT_LINE (EMP.LAST_NAME| |EMP.FIRST_NAME);END;20222022年年5 5月月3030日星期一日星期一4141七、游标(CURSOR)游标是将从表中选择的一组记录,放置在内存的临时表中。游标是数据类型,要先说明后使用。1.说明游标 CURSOR 游标名 IS SELECT语句;例1: DECL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 13 PLSQL 程序设计 基础
限制150内