流程控制--=======================類似于高級(jí)語(yǔ)言,流程控制語(yǔ)句是PL/SQL語(yǔ)言的重要組成部分。這些流程控制語(yǔ)句使得PL/SQL加大了代碼的靈活性和多樣性,大大簡(jiǎn)化了程序的編寫。下面將列出流程控制語(yǔ)句并給出具體事例。一、順序結(jié)構(gòu)按代碼的書寫順序依次執(zhí)行--在下面的示例中將逐步執(zhí)行代碼scott@ORCL>declarev_enamevarchar2(20);2v" />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

PL/SQL --> 流程控制

系統(tǒng) 2084 0

--=======================

-- ? PL/SQL --> 流程控制

--=======================

?

??? 類似于高級(jí)語(yǔ)言,流程控制語(yǔ)句是 PL / SQL 語(yǔ)言的重要組成部分。這些流程控制語(yǔ)句使得 PL / SQL 加大了代碼的靈活性和多樣性,大大簡(jiǎn)化了

程序的編寫。下面將列出流程控制語(yǔ)句并給出具體事例。

???

一、順序結(jié)構(gòu)

??? 按代碼的書寫順序依次執(zhí)行

??? -- 在下面的示例中將逐步執(zhí)行代碼

??????? scott@ORCL > declare v_ename varchar2 ( 20 );

??????? ? 2 ? v_job emp . job % type ;

??????? ? 3 ? v_no ? emp . empno % type ;

??????? ? 4 ? begin

??????? ? 5 ??? v_no :=& inputno ;

??????? ? 6 ??? select ename , job into v_ename , v_job from emp where empno = v_no ;

??????? ? 7 ??? dbms_output . put_line ( 'Employee Name: ' || v_ename );

??????? ? 8 ??? dbms_output . put_line ( 'Employee Job : ' || v_job );

??????? ? 9 ? end ;

??????? ? 10 ? /

??????? Enter value for inputno : 7788

??????? old ?? 5 : ?? v_no :=& inputno ;

??????? new ?? 5 : ?? v_no := 7788 ;

??????? Employee Name : SCOTT

??????? Employee Job : ANALYST

?

??????? PL / SQL procedure successfully completed . ???

二、條件分支結(jié)構(gòu)

??? 1. IF ... THEN ... END IF

??????? IF condition THEN

??????????? statement

??????? END IF ;

?

??????? 判斷 condition 是否成立,成立就執(zhí)行 IF END IF 之間的語(yǔ)句。

???

??????? -- 例:輸入員工編號(hào),查詢其工資,如果他們的職位是 CLERK ,則工資增加 % ,再顯示修改前后的工資數(shù)。

?

??????????? DECLARE

??????????????? v_empid emp . empno % TYPE ;

??????????????? v_job emp . job % TYPE ;

??????????????? v_old_sal emp . sal % TYPE ;

??????????????? v_new_sal emp . sal % TYPE ;

??????????? BEGIN

??????????????? v_empid :=& inputid ;

??????????????? SELECT job , sal INTO v_job , v_old_sal FROM emp WHERE empno = v_empid ;

??????????????? IF v_job = 'CLERK' THEN

??????????????????? v_new_sal := v_old_sal * 1.1 ;

??????????????????? UPDATE emp SET sal = v_new_sal WHERE empno = v_empid ;

??????????????????? DBMS_OUTPUT . PUT_LINE ( 'Old sal:' || v_old_sal );

??????????????????? DBMS_OUTPUT . PUT_LINE ( 'New sal:' || v_new_sal );

??????????????? END IF ;

??????????? EXCEPTION

??????????????? WHEN NO_DATA_FOUND THEN

??????????????????? DBMS_OUTPUT . PUT_LINE ( 'Not FOUND RECORD' );

??????????? END ;

??????????? /

?

??? 2. IF ... THEN ... ELSE ... END IF

??????? IF condition THEN

??????????? statements1 ;

??????? ELSE

??????????? statements2 ;

??????? END IF ;

?

??????? 判斷 condition 是否成立,成立就執(zhí)行 IF ELSE 之間的語(yǔ)句,

??????? 否則執(zhí)行 ELSE END IF 之間的語(yǔ)句。

?

??????? -- 例:輸入員工編號(hào) , 查詢其工資 , 如果他們的職位是 CLERK, 則工資增加 %, 如果不是 CLERK, 工資增加 8%, 再顯示修改前后的工資數(shù)。

?

??????????? DECLARE

??????????????? v_empid emp . empno % TYPE ;

??????????????? v_job emp . job % TYPE ;

??????????????? v_old_sal emp . sal % TYPE ;

??????????????? v_new_sal emp . sal % TYPE ;

??????????? BEGIN

??????????????? v_empid :=& inputid ;

??????????????? SELECT job , sal INTO v_job , v_old_sal FROM emp WHERE empno = v_empid ;

??????????????? IF v_job = 'CLERK' THEN

??????????????????? v_new_sal := v_old_sal * 1.1 ;

??????????????? ELSE

??????????????????? v_new_sal := v_old_sal * 1.08 ;

??????????????? END IF ;

?

??????????????? UPDATE emp SET sal = v_new_sal WHERE empno = v_empid ;

??????????????? DBMS_OUTPUT . PUT_LINE ( 'Old sal:' || v_old_sal );

??????????????? DBMS_OUTPUT . PUT_LINE ( 'New sal:' || v_new_sal );

?

??????????? EXCEPTION

??????????????? WHEN NO_DATA_FOUND THEN

??????????????????? DBMS_OUTPUT . PUT_LINE ( 'Not FOUND RECORD' );

??????????? END ;

??????????? /

?

??? 3. IF ... THEN ... ELSIF ... THEN ... ELSE ... END IF

??????? IF condition1 THEN

??????????? statements1 ;

??????? ELSIF condition2 THEN

??????????? statements2 ;

??????? ELSE

??????????? else_statements ;

??????? END IF ;

?

??????? -- : 輸入員工編號(hào) , 查詢其工資 , 如果其職位是 CLERK, 則工資增加 %, 如果是 SALESMAN 工資增加 %, 其它的加 %, 顯示修改前后的工資數(shù)。

?

??????????? DECLARE

??????????????? v_empid emp . empno % TYPE ;

??????????????? v_job emp . job % TYPE ;

??????????????? v_old_sal emp . sal % TYPE ;

??????????????? v_new_sal emp . sal % TYPE ;

??????????? BEGIN

??????????????? v_empid :=& inputid ;

??????????????? SELECT job , sal INTO v_job , v_old_sal FROM emp WHERE empno = v_empid ;

??????????????? IF v_job = 'CLERK' THEN

??????????????????? v_new_sal := v_old_sal * 1.1 ;

??????????????? ELSIF v_job = 'SALESMAN' THEN

??????????????????? v_new_sal := v_old_sal * 1.08 ;

??????????????? ELSE

??????????????????? v_new_sal := v_old_sal * 1.05 ;

??????????????? END IF ;

?

??????????????? UPDATE emp SET sal = v_new_sal WHERE empno = v_empid ;

??????????????? DBMS_OUTPUT . PUT_LINE ( 'Old sal:' || v_old_sal );

??????????????? DBMS_OUTPUT . PUT_LINE ( 'New sal:' || v_new_sal );

?

??????????? EXCEPTION

??????????????? WHEN NO_DATA_FOUND THEN

??????????????????? DBMS_OUTPUT . PUT_LINE ( 'Not FOUND RECORD' );

??????????? END ;

??????????? /

???????

??? 4. 等值比較的 CASE 多分支

???????

??????? CASE expression

??????? ??? WHEN result_1 THEN

??????????? statements1 ;

??????? ??? WHEN result_2 THEN

??????????? statemnts2 ;

??????? ????? ......

??????? ??? [ELSE

??????????? else_statements;]

??????? END CASE ;

???????

??????? -- 使用 case 分支完成前面的示例

??????? -- : 輸入員工編號(hào) , 查詢其工資 , 如果其職位是 CLERK, 則工資增加 %, 如果是 SALESMAN 工資增加 %, 其它的加 %, 顯示修改前后的工資數(shù)。

??????????? DECLARE

??????????????? v_empid emp . empno % TYPE ;

??????????????? v_job emp . job % TYPE ;

??????????????? v_old_sal emp . sal % TYPE ;

??????????????? v_new_sal emp . sal % TYPE ;

??????????? BEGIN

??????????????? v_empid :=& inputid ;

??????????????? SELECT job , sal INTO v_job , v_old_sal FROM emp WHERE empno = v_empid ;

??????????????? CASE v_job

??????????????????? WHEN 'CLERK' THEN

??????????????????? v_new_sal := v_old_sal * 1.1 ;

??????????????????? WHEN 'SALESMAN' THEN

??????????????????? v_new_sal := v_old_sal * 1.08 ;

??????????????????? ELSE

??????????????????? v_new_sal := v_old_sal * 1.05 ;

??????????????? END CASE ;

?

??????????????? UPDATE emp SET sal = v_new_sal WHERE empno = v_empid ;

??????????????? DBMS_OUTPUT . PUT_LINE ( 'Old sal:' || v_old_sal );

??????????????? DBMS_OUTPUT . PUT_LINE ( 'New sal:' || v_new_sal );

?

??????????? EXCEPTION

??????????????? WHEN NO_DATA_FOUND THEN

??????????????????? DBMS_OUTPUT . PUT_LINE ( 'Not FOUND RECORD' );

??????????? END ;

??????????? /

?

??? 5. 條件比較的 CASE 語(yǔ)句

??????? CASE

??????????? WHEN expression_1 THEN

??????????????? statements1 ;

??????????? WHEN expression_2 THEN

??????????????? statements2 ;

??????????? WHEN expression_3 THEN

??????????????? statements3 ;

? ?????????????? ......

??????????? [ELSE

??????????????? else_statements ]

??????? END CASE

???????

??????? -- 使用 case 分支完成前面的示例,僅僅列出 case 部分

??????????? CASE

??????????????? WHEN v_job = 'CLERK' THEN

??????????????? v_new_sal := v_old_sal * 1.1 ;

??????????????? WHEN v_job = 'SALESMAN' THEN

??????????????? v_new_sal := v_old_sal * 1.08 ;

??????????????? ELSE

??????????????? v_new_sal := v_old_sal * 1.05 ;

??????????? END CASE ;

?

三、循環(huán)結(jié)構(gòu)

??? 1.LOOP 循環(huán)

???????

??????? LOOP

??????????? statement ;

??? ??????? EXIT [WHEN condition];

??????? END LOOP;

?

??????? -- 例:用 LOOP 寫一個(gè)程序求 1 ++++ . . . +10 之和

?

??????????? DECLARE

??????????????? v_n INT := 1 ;

??????????????? v_s INT := 0 ;

??????????? BEGIN

??????????????? LOOP

??????????????????? v_s := v_s + v_n ;

??????????????????? v_n := v_n + 1 ;

??????????????????? EXIT WHEN v_n > 10 ;

??????????????? END LOOP ; ??

??????????????? DBMS_OUTPUT . PUT_LINE ( '1+2+3+...+10=' || v_s );

??????????? END ;

??????????? /

?

??? 2.WHILE 循環(huán)

???

??????? WHIEL condition LOOP

??????????? statement;

??????? END LOOP;

?

??????? -- 下面使用 while 循環(huán)完成 loop 循環(huán)中的示例

???????????

??????????? DECLARE

??????????????? v_s NUMBER := 0 ;

??????????????? v_n NUMBER := 1 ;

??????????? BEGIN

??????????????? WHILE v_n <= 10 LOOP

??????????????????? v_s := v_s + v_n ;

??????????????????? v_n := v_n + 1 ;

??????????????? END LOOP ;

??????????????? DBMS_OUTPUT . PUT_LINE ( '1+2+3+...+10=' || v_s );

??????????? END ;

??????????? /

?

??? 3.FOR 循環(huán)

???????

??????? FOR loop_index IN [reverse] lowest_number .. highest_number LOOP

??????????? statements ;

??????? END LOOP ;

???????

??????? -- 下面使用 for 循環(huán)完成 loop 循環(huán)中的示例

??????????? DECLARE

??????????????? v_s NUMBER := 0 ;

??????????? BEGIN

??????????????? FOR v_n IN 1 . .10 LOOP

??????????????????? v_s := v_s + v_n ;

??????????????????? DBMS_OUTPUT . PUT_LINE ( v_n );

??????????????? END LOOP ;

??????????? DBMS_OUTPUT . PUT_LINE ( '1+2+3+...+10=' || v_s );

??????????? END ;

??????????? / ??

?

??????????? DECLARE

??????????????? v_s NUMBER := 0 ;

??????????? BEGIN

??????????????? FOR v_n IN REVERSE 1 . .10 LOOP ??? -- 注意 reverse 是反向循環(huán),即從到

??????????????????? v_s := v_s + v_n ;

??????????????????? DBMS_OUTPUT . PUT_LINE ( v_n );

??????????????? END LOOP ;

??????????? DBMS_OUTPUT . PUT_LINE ( '1+2+3+...+10=' || v_s );

??????????? END ;

??????????? /

?

四、 GOTO 語(yǔ)句

??? GOTO label_name

?

??????? -- 下面使用 goto 語(yǔ)句完成 loop 循環(huán)中的示例

??????????? DECLARE

??????????????? v_n NUMBER := 1 ;

??????? ??????? v_s NUMBER := 0 ;

??????????? BEGIN

??????????????? LOOP

??????????????????? v_s := v_s + v_n ;

??????????????????? v_n := v_n + 1 ;

??????????????????? IF v_n > 10 THEN

??????????????????????? GOTO out ;

??????????????????? END IF ;

??????????????? END LOOP ;

??????????????? << out >>

??????????????? DBMS_OUTPUT . PUT_LINE ( '1+2+3+...+10=' || v_s );

??????????????? END ;

??????????????? /

?

??? 使用 GOTO 語(yǔ)句應(yīng)注意:

??????? 標(biāo)號(hào)后至少要有一條語(yǔ)句

??????? PL/SQL 塊內(nèi)可以相互跳轉(zhuǎn),內(nèi)層塊可以跳到外層塊,但外層塊不能跳到內(nèi)層塊

??????? 不能從某一 IF 語(yǔ)句外部跳到其內(nèi)部

??????? 不能從某一循環(huán)外跳到其內(nèi)部

??????? 不能從某一子程序外跳到其內(nèi)

?

五、 NULL

??? NULL 語(yǔ)句不會(huì)執(zhí)行任何操作,并且會(huì)直接將控制傳遞到下一條語(yǔ)句,使用 NULL 語(yǔ)句主要是提高程序的可閱讀性

??????? -- 如下面的示例

??????????? DECLARE

??????????????? v_sal emp . sal % TYPE ;

??????????????? v_ename emp . ename % TYPE ;

??????????? BEGIN

??????????????? SELECT ename , sal into v_ename , v_sal

??????????????? FROM emp WHERE empno =& inputno ;

??????????????? IF v_sal < 3000 then

??????????????????? UPDATE emp SET comm = sal * 1.2 WHERE ename = v_ename ;

??????????????? ELSE

??????????????????? NULL;

??????????????? END IF ;

??????????? END ;

??????????? /

???????????

六、更多參考

? ??? ?

有關(guān) SQL 請(qǐng)參考

??????? SQL 基礎(chǔ)--> 子查詢

??????? SQL 基礎(chǔ)--> 多表查詢

SQL 基礎(chǔ)--> 分組與分組函數(shù)

SQL 基礎(chǔ)--> 常用函數(shù)

SQL 基礎(chǔ)--> ROLLUP 與CUBE 運(yùn)算符實(shí)現(xiàn)數(shù)據(jù)匯總

SQL 基礎(chǔ)--> 層次化查詢(START BY ... CONNECT BY PRIOR)

?

??? 有關(guān) PL/SQL 請(qǐng)參考

??????? PL/SQL --> 語(yǔ)言基礎(chǔ)

PL/SQL --> 流程控制

PL/SQL --> 存儲(chǔ)過(guò)程

PL/SQL --> 函數(shù)

PL/SQL --> 游標(biāo)

PL/SQL --> 隱式游標(biāo)(SQL%FOUND)

PL/SQL --> 異常處理(Exception)

PL/SQL --> PL/SQL 記錄

PL/SQL --> 包的創(chuàng)建與管理

PL/SQL --> 包重載、初始化

PL/SQL --> DBMS_DDL 包的使用

PL/SQL --> DML 觸發(fā)器

PL/SQL --> INSTEAD OF 觸發(fā)器

?

?

?

?

?

?

?

?

PL/SQL --> 流程控制


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 承德县| 剑河县| 唐河县| 措勤县| 弋阳县| 嘉鱼县| 海原县| 铁岭市| 周宁县| 永吉县| 阿图什市| 五寨县| 西林县| 南乐县| 汽车| 邛崃市| 盱眙县| 嘉鱼县| 贞丰县| 左云县| 陆河县| 景泰县| 武宁县| 余干县| 瑞昌市| 鞍山市| 烟台市| 辰溪县| 仁布县| 莱芜市| 宜州市| 灌南县| 滦南县| 巨鹿县| 油尖旺区| 英吉沙县| 湘潭市| 宁陕县| 渝北区| 同江市| 固原市|