一、引言 • PL/SQL 程式可通過條件或迴圈結構來控制命令執行的流程。 • PL/SQL 提供了豐富的流程式控制制語句,與 Java 一樣也有三種控制結構: • 順序結構 • 選擇結構 • 迴圈結構 二、選擇結構 2.1、IF-THEN 1)IF-THEN 該結構先判斷一個條件是否為 TRUE,條件 ...
一、引言
• PL/SQL 程式可通過條件或迴圈結構來控制命令執行的流程。
• PL/SQL 提供了豐富的流程式控制制語句,與 Java 一樣也有三種控制結構:
• 順序結構
• 選擇結構
• 迴圈結構
二、選擇結構
2.1、IF-THEN
1)IF-THEN
該結構先判斷一個條件是否為 TRUE,條件成立則執行對應的語句塊,與 Java 中的 if 語句很相似。
declare newsal emp.sal%type; begin select sal into newsal from emp where ename='James'; if newsal>=1500 then update emp set comm=1000 where ename='James'; end if; commit; end;
2)IF-THEN-ELSE
declare newsal emp.sal%type; begin select sal into newsal from emp where ename='James'; if newsal>=1500 then update emp set comm=1000 where ename='James'; else update emp set comm=100 where ename='James'; end if; commit; end;
3)IF-THEN-ELSIF
declare newsal emp.sal%type; begin select sal into newsal from emp where ename='James'; if newsal>=1500 then update emp set comm=1000 where ename='James'; elsif newsal>=1000 then update emp set comm=800 where ename='James'; else update emp set comm=400 where ename='James'; end if; commit; end;
2.2、CASE
CASE 是一種選擇結構的控制語句,可以根據條件從多個執行分支中選擇相應的執行動作。也可以作為表達式使用,返回一個值。類似 Java 中的 switch 語句:
declare v_grade char(1) := upper('&p_grade'); begin case v_grade when 'A' then dbms_output.put_line('A'); when 'B' then dbms_output.put_line('B'); when 'C' then dbms_output.put_line('C'); else dbms_output.put_line('not found char!'); end case; end;
三、迴圈結構
Oracle PL/SQL提供的迴圈類型有:
• 無條件迴圈 LOOP-END LOOP 語句
• WHILE 迴圈語句
• FOR 迴圈語句
除了以上迴圈結構外,PL/SQL中還提供了EXIT用於強制退出迴圈,類似於 Java 中的 break 語句。
3.1、LOOP
LOOP 迴圈是最簡單的迴圈,也稱為無限迴圈,LOOP 和 END LOOP 是關鍵字。
declare v_sum number(10) :=0; i number(10) :=1; begin loop v_sum:=v_sum+i; i:=i+1; if i>100 then exit; end if; end loop; dbms_output.put_line(v_sum); end;
3.2、WHILE
WHILE 迴圈與 Java 中的 while 迴圈很類似。先判斷條件,條件成立再執行迴圈體。
declare v_sum number(10) :=0; i number(10) :=1; begin while i<=100 loop v_sum:=v_sum+i; i:=i+1; end loop; dbms_output.put_line(v_sum); end;
3.3、FOR
FOR 迴圈需要預先確定的迴圈次數,可通過給迴圈變數指定下限和上限來確定迴圈的次數,然後迴圈變數在每次迴圈中遞增(或者遞減)。
declare v_sum number(10) :=0; i number(10) :=1; begin for i in 1..100 loop v_sum:=v_sum+i; end loop; dbms_output.put_line(v_sum); end;
四、動態SQL
• 在 PL/SQL 程式開發中,可以使用 DML 語句和事務控制語句,但是還有很多語句(比如 DDL 語句)不能直接在 PL/SQL 中執行,這些語句可以使用動態 SQL 來實現。
• PL/SQL 塊先編譯然後執行,動態 SQL 語句在編譯時不能確定,只有在程式執行時把 SQL 語句作為字元串的形式由動態 SQL 命令來執行。
• 在編譯階段 SQL 語句作為字元串存在,程式不會對字元串中的內容進行編譯,在運行階段再對字元串中的 SQL 語句進行編譯和執行。
• 語法格式:動態 SQL
EXECUTE IMMEDIATE 動態語句字元串
[INTO 變數列表]
[USING 參數列表]
• 如果動態語句是 SELECT 語句,可以把查詢的結果保存到 INTO 後面的變數中。如果動態語句中存在參數,USING 為語句中的參數傳值。
• 動態 SQL 中的參數格式是:[:參數名],參數在運行時需要使用 USING 傳值。
declare v_sql varchar2(128); v_sal emp.sal%type; v_empno emp.empno%type := '1001'; begin --執行動態查詢 execute immediate 'create table loginuser (id varchar2(10) primary key,name varchar2(20) not null)'; v_sql:='select sal from emp where empno=''1001'''; execute immediate v_sql into v_sal; dbms_output.put_line(v_sal); --執行帶參查詢 v_sql:='select sal from emp where empno=:1'; execute immediate v_sql into v_sal using v_empno; dbms_output.put_line(v_sal); end;