PL/SQL入門--基本結構

PL/SQL塊中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)

以及事務控制語句(COMMIT,ROLLBACK,SAVEPOINT),

而不能直接嵌入DDL語句(CREATE,ALTER,DROP)DCL語句(GRANT,REVOKE)

 

1.檢索單行數據

  1.1使用標量變量接受數據

  1. v_ename emp.ename%type; 
  2.  
  3.  v_sal   emp.sal%type; 
  4.  
  5.  select ename,sal into v_ename,v_sal from emp where empno=&no;

  1.2使用記錄變量接受數據

  1. type emp_record_type is record( 
  2.  
  3.  ename emp.ename%type,sal emp.sal%type); 
  4.  
  5.  emp_record emp_record_type; 
  6.  
  7.  select ename,sal into emp_record from emp where empno=&no;

  1.3嵌入SELECT語句注意事項:

  使用SELECT INTO語句時,必須要返回一條數據,並且只能返回一條數據

  no_date_found:

  select into沒有返回數據

  too_many_rows:

  select into返回多條數據

  where子句使用注意事項:

  使用的變量名不能與列名相同,否則觸發TOO_MANY_ROWS例外.

2.操縱數據

  2.1使用VALUES子句插入數據

  1. v_deptno dept.deptno%type; 
  2.  
  3.  v_dname dept.dname%type; 
  4.  
  5.  v_deptno:=no; 
  6.  
  7.  v_dname:='&name'
  8.  
  9.  insert into dept (deptno,dname) values(v_deptno,v_dname);

  2.2使用子查詢插入數據

  1. v_deptno emp.deptno%type:=&no; 
  2.  
  3.  insert into employee select * from emp where deptno=v_deptno;

  2.3更新數據

  使用表達式更新列值

  1. v_deptno dept.deptno%type:=no
  2.  
  3.   v_loc dept.loc%type:='&loc'
  4.  
  5.   update dept set loc=v_loc where deptno=v_deptno;

  2.4使用子查詢更新列值

  1. v_ename emp.ename%type:='&name'
  2.  
  3. update emp set (sal,comm) = (select sal,comm from emp where ename=v_ename) where job = (select job from emp where ename=v_ename) ;

  2.5刪除數據

  使用變量刪除數據

  1. v_deptno dept.deptno%type:=&no; 
  2.  
  3. delete from dept where deptno=v_deptno

  2.6使用子查詢刪除數據

  1. v_ename emp.ename%type:='&name'
  2. delete from emp where deptno=(select deptno from emp where ename=v_ename);

3.SQL遊標

  遊標是指向上下文區的指針,包括隱含遊標(SQL遊標)和顯式遊標兩種類型

  SQL遊標用於處理SELECT INTO ,INSERT,UPDATE以及DELETE語句.

  顯式遊標用於處理多行的SELECT語句

  SQL遊標包括:SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT,SQL%ISOPEN等四種屬性

  3.1 SQL%ISOPEN:執行時,會隱含的打開和關閉遊標.因此該屬性的值永遠都是FALSE

 

  3.2 SQL%FOUND:用於確定SQL語句執行是否成功.SQL有作用行時,TRUE,否則爲FALSE

  1.  v_deptno emp.deptno%type:=&no; 
  2.  
  3. update emp set salsal=sal*1.1 where deptno=v_deptno
  4.  
  5. if sql%found  
  6.        then dbms_output.put_line('執行成功');  
  7. else  
  8.        dbms_output.putline('失敗'); 
  9. endif 

  3.3 sql%notfound:確定SQL語句執行是否成功,SQL有作用行時,false,否則爲true

 

  3.4 sql%rowcount:返回SQL語句所作用的總計行數

  1. v_deptno emp.deptno%type:=&no; 
  2.  
  3. update emp set salsal=sal*1.1 where deptno=v_deptno
  4.  
  5. dbms_output.put_line('修改了'||sql%rowcount||'行'); 

4.事務控制語句(TCL)

  事務控制語句包括COMMIT,ROLLBACK以及SAVEPOINT等三種語句

  1. v_sal emp.sal%type:=&salary; 
  2.  
  3. v_ename emp.ename%type:='&name'
  4.  
  5. update emp set sal=v_sal where ename=v_ename
  6.  
  7. commit; 
  8.  
  9. exception 
  10.  
  11.     when others then 
  12.  
  13.     rollback; 

  1. insert into temp values(1); 
  2.  
  3.   savepoint a1; 
  4.  
  5.   insert into temp values(2); 
  6.  
  7.   savepoint a2; 
  8.  
  9.   insert into temp values(3); 
  10.  
  11.   savepoint a3; 
  12.  
  13.   rollback to a2; 
  14.  
  15.   commit;

5.控制結構

  條件分支語句

  5.1簡單條件判斷

  1. v_sal number(6,2); 
  2.  
  3. select sal into v_sal from emp where 
  4.  
  5. lower(ename)=lowe('&&name'); 
  6.  
  7. if v_sal<2000 then update emp set 
  8.  
  9. sal=v_sal+200 where lower(ename)=lower('&name') 
  10.  
  11. end if;

  5.2二重條件分支

  1. v_comm number(6,2); 
  2.  
  3. select comm into v_comm from emp where empno=&&no; 
  4.  
  5. if v_comm<>0 then update emp set comm=v_comm+100 where empno=&no; 
  6.  
  7. else update emp set comm=200 where empno=&no; 
  8.  
  9. end if 

  5.3多重條件分支

  1. v_job varchar2(10); 
  2.  
  3. v_sal number(6,2); 
  4.  
  5. select job,sal into v_job,v_sal from emp where empno=&&no; 
  6.  
  7. if v_job='president' then  
  8.  
  9. update emp set sal=v_sal+1000 where empno=&no; 
  10.  
  11. else if v_job='manager' then  
  12.  
  13. update emp setsal=v_sal+500 where empno=&no; 
  14.  
  15. else  
  16.  
  17. update emp set sal=v_sal+200 where empno=&no; 
  18.  
  19. end if; 

  5.4 CASE語句:

  CASE語句中使用單一選擇符進行等值比較

  1. declare 
  2.  
  3. v_deptno emp deptno%type; 
  4.  
  5. begin 
  6.  
  7. v_deptno:=&no; 
  8.  
  9. case v_deptno 
  10.  
  11. when 10 then update emp set comm=100 where deptno=v_deptno
  12.  
  13. when 20 then update emp set comm=80  where deptno=v_deptno
  14.  
  15. when 30 then update emp set comm=50  where deptno=v_deptno
  16.  
  17. else 
  18.  
  19.     dbms_output.put_line("不存在'); 
  20.  
  21. end case; 
  22.  
  23. end; 

   5.5 CASE語句中使用多種條件比較

  1. declare 
  2.  
  3. v_sal emp.sal%type; 
  4.  
  5. v_ename emp.ename%type; 
  6.  
  7. begin 
  8.  
  9. select ename,sal into v_ename,v_sal from emp where empno=&no; 
  10.  
  11. case 
  12.  
  13. when v_sal<1000 then update emp set comm=100 where ename=v_ename
  14.  
  15. when v_sal<2000 then update emp set comm=80  where ename=v_ename
  16.  
  17. when v_sal<6000 tehn update emp set comm=50  where ename=v_ename
  18.  
  19. end case; 
  20.  
  21. end; 

   5.6循環語句

   有基本循環,WHILE循環,FOR循環

   基本循環:一定要包含EXIT語句,定義循環控制變量

  1. create table temp(cola int); 
  2.  
  3. eclare 
  4.  
  5.   i int:=1
  6.  
  7.   begin 
  8.  
  9.     loop 
  10.  
  11.       insert into temp values(i); 
  12.  
  13.       exit when i=10
  14.  
  15.        ii:=i+1; 
  16.  
  17.     end loop; 
  18.  
  19.  end; 

  5.7 WHILE循環:定義循環控制變量,並在循環體內改變循環控制變量的值

  1. declare 
  2.  
  3.    i int:=1
  4.  
  5.  begin  
  6.  
  7.    while i<=10 loop 
  8.  
  9.      insert into temp values(i); 
  10.  
  11.      ii:=i+1; 
  12.  
  13.    end loop; 
  14.  
  15.  end; 

  5.8 for循環:使用FOR循環時,ORACLE會隱含定義循環控制變量.

  1. for counter in[reverse] 
  2.  
  3.   lower_bound..upper_bound loop 
  4.  
  5.     statement1; 
  6.  
  7.     statement2; 
  8.  
  9.     ....... 
  10.  
  11.   end loop; 

  5.9 counter是循環控制變量,並且該變量由ORACLE隱含定義,不需要顯示定義;

lower_boundupper_bound分別對應循環控制變量的上下界值.默認情況下,

FOR循環,每次會自動增一,指定REVERSE選項時,每次循環控制變量會減

  1. begin 
  2.  
  3.     for i in reverse 1..10 loop 
  4.  
  5.       insert into temp values(i); 
  6.  
  7.     end loop; 
  8.  
  9.   end; 

  5.10嵌套循環和標號:通過在嵌套循環中使用標號,可以區分內層循環和外層循環

,並且可以在內層循環中直接退出外層循環

  1. declare 
  2.  
  3.    result int; 
  4.  
  5.    begin 
  6.  
  7.    <<outer>> 
  8.  
  9.    for i in 1..100 loop 
  10.  
  11.    <<inter>> 
  12.  
  13.    for j in 1..100 loop 
  14.  
  15.    result:=i*j; 
  16.  
  17.    exit outer when result=1000
  18.  
  19.    exit when result=500
  20.  
  21.    end loop inner; 
  22.  
  23.    dbms_ouput.put_line(result); 
  24.  
  25.    end loop outer; 
  26.  
  27.    dbms_output.put_line(result); 
  28.  
  29.    end;  

6.順序控制語句

  PL/SQL不僅提供了條件分支語句和循環控制語句,而且還提供了順序控制語句GOTO

NULL.一般情況下不使用

  6.1 GOTO:用於跳轉到特定標號處去執行語句

  1. GOTO LABEL_NAME; 

  1. declare 
  2.  
  3.   i int :=1
  4.  
  5.   begin 
  6.  
  7.     loop 
  8.  
  9.       insert into temp values(i); 
  10.  
  11.       if i=10 then 
  12.  
  13.          goto end_loop 
  14.  
  15.       end if; 
  16.  
  17.       ii:=i+1; 
  18.  
  19.    end loop; 
  20.  
  21.    <<end_loop>> 
  22.  
  23.    dbms_output.put_line('循環結束'); 
  24.  
  25.    end; 

   6.2 null:不會執行任何操作,並且會直接將控制傳遞到下一條語句.

  1. declare 
  2.  
  3.      v_sal emp.sal%type; 
  4.  
  5.      v_ename emp.ename%type; 
  6.  
  7.    begin 
  8.  
  9.      select ename,sal into v_ename,v_sal from 
  10. emp where empno=&no; 
  11.  
  12.      if v_sal<3000 then update emp set 
  13. comm=sal*0.1 where ename=v_ename
  14.  
  15.      else  
  16.  
  17.        null; 
  18.  
  19.      end if; 
  20.  
  21.    end; 

感謝April-MyHou指導!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章