1. 程式人生 > >Oracle數據庫的PLSQL

Oracle數據庫的PLSQL

面向對象 acl 技術分享 spa Language arch ont nbsp span

PLSQL

  一:plsql是procedural language sql:過程化sql語言,是oracle數據庫中可以實現一些復雜的計算和功能。

  其實是在基本的sql語言中,加入了循環。判斷等邏輯的一種數據庫編程方式,運行在oracle數據庫上。

  二:作用

    更高效率的的進行大數據量的運算。

  三:優缺點

    優點:效率高

    缺點:編寫與維護性低,開發測試效率低,非面向對象語言。

  四:格式

    基本格式:

      declare

        --變量的聲明區域

      最簡格式:

      /

      begin

        業務邏輯區域

        --exception

      end

      /

    說明:變量的聲明

        變量名 類型名:=值;

        不賦值時,變量的默認值為null,作運算時,null與任何值運行的結果都是null。

        ==表示判斷是否相等

        */*必須要存在

        plsql只是一個定義好的匿名代碼塊,只能在oracle數據庫中編譯和運行一次,不會存儲在oracle中,如果存儲,需要定義成存儲過程,函數,觸發器。

  五:練習

    -->使用最簡格式,輸出打印"Hello plsql"。

    set serveroutput on; --開啟輸出功能

    begin

      dbms_output.put_line(‘Hello plsql‘);

    end;

    /

    -->顯示 姓名 年齡 出生年月日

      begin

        dbms_output.put_line(‘lyr‘);

        dbms_output.put_line(‘20‘);

        dbms_output.put_line(‘1997-3-6‘);

      end;

      /

  六:plsql的使用

    1.-->註釋,--單行註釋,/*.....*/多行註釋。

    2.

      declare

        變量名 類型

        變量名 類型:=值;

      begin

      end;

        /

  七:練習

    -->定義一個a,b,c,a=5,b=6,c=a+b,輸出c的值。

    declare

      a number:=5;

      b number:=6;

      c number;

    begin

      c:=a+b;

      dbms_output.put_line(c)

    end;

     /    

    -->定義變量name,age,賦值輸出。

    declare

      name varchar2(20);

      age number(2);

    begin

      name:=‘lyr‘;

      age:=20;

      dbms_output.put_line(‘name=‘||name||‘ age=‘||age);

    end;

     /

    

判斷

  1:基本格式

    if 條件 then

      ..

    elsif 條件 then

      ..

    else

      ..

    end if;

  2:練習

    -->定義一個變量gender 賦值,如果為‘M‘,輸出男,如果為‘F‘,輸出女,否則輸出性別不詳。  

    declare

      gender varchar(20);

    begin

      gender:=‘M‘;  

      if gender=‘M‘ then

        dbms_output.put_line(‘男‘);

      elsif gender=‘F‘ then

        dbms_output.put_line(‘女‘);

      else

        dbms_output.put_line(‘性別不詳‘);

      end if;

    end;

     /

loop循環

  1:基本格式

    loop

      循環內容

      exit when 結束條件;  

    end loop;

  2:練習

    -->輸出1-10。

    declare  

      i number:=1;

    begin

      loop

        dbms_output.put_line(i);

        i:=i+1;

        exit when i>10;

      end loop;

    end;

     /

while循環

  1:基本格式

    while 條件 loop

      業務邏輯

      循環變量改變

    end loop;

  2:練習

   -->使用while循環計算100以內奇數的和。

      declare

        i number:=1;

        s number:=0;

      begin

        while i<101

          loop

            s:=s+i;

            i:=i+2;

          end loop;

        dbms_output.put_line(s);

      end;

       /

for循環

  1:基本格式

    for 變量 in 集合 loop

    end loop

    說明:集合必須是數字集合,1..10表示1~10的整數。

  2:練習

    -->使用for循環輸出1-10。

    begin

      for i in 1..10

        loop

          dbms_output.put_line(i);

        end loop;

      end;

       /

PLSQL使用DML和TCL

    

  1:沒有特殊情況,直接使用。

  2:練習

    --> 對表dept,增加一條數據 100,‘qqq‘,‘cc‘,修改40號部門的地址為南關。

      begin

        insert into dept values(100,‘qqq‘,‘cc‘);

        update dept set loc=‘南關‘ where deptno=40;

      end;

      /

PLSQL使用DQL

  1:說明

    plsql中使用DQL語言,不只是為了查詢,因為如果查詢的話,普通的sql語句比較方便,而plsql中使用DQL目的是將查詢的數據封裝到變量中,進行其他的邏輯運算。

    --返回單行數據

      select colName1,colName2 into 變量1,變量2 from ....

  2:練習

    查詢10號部門的名稱和地址封裝到變量a和b進行拼接輸出。

    declare

      a varchar2(20);

      b varchar2(20);

    begin

      select dname,loc into a,b from dept where deptno=10;

      dbms_output.put_line(a||‘ ‘||b);

    end;

    /

    --返回多行數據

      1:使用遊標

        會將多條數據封裝到遊標中,相當於java的ResultSet。

        遊標默認會在第一行,每fetch一次,遊標就會向下行移動,當成功移到下一行時,遊標就有一個狀態:found,當遊標移到最後一行時,再次fetch時,不會移動,但是狀態變為not found。

    2:格式

      declare

        cursor 遊標名 is select 語句....;

        變量 類型

      begin  

        open 遊標名;

          loop

            fetch 遊標名 into 變量1,變量2...

            exit when 結束條件(遊標民%not found)

          end loop;

        close 遊標名;

       end;

        /

    3:練習

      -->輸出顯示10號部門的員工姓名,職位,工資。

      declare

        cursor c is select ename,job,sal from emp where deptno=10;

        na varchar2(20);

        j varchar2(20);

        sal number(20);

      begin

        open c;

        fetch c into na,j,sal;

        while (c%found)

          loop

            dbms_output.put_line(na||‘ ‘||j||‘ ‘||sal);

            fetch c into na,j,sal;

          end loop;

        close c;

      end;

       /

技術分享圖片
--自己練習:
set serveroutput on;
declare 
begin
  dbms_output.put_line(dsada);
end;
/

declare 
  a number;
  b number;
  c number;
begin
  a:=1;
  b:=2;
  c:=a+b;
  dbms_output.put_line(c);
end;
/

declare
  i number;
  j number;
begin
  i:=&請輸入一個數字;
  j:=&請輸入一個數字;
  dbms_output.put_line(i+j);
end;
/

declare
  a number;
  b number;
begin
  a:=&請輸入一個數字;
  b:=&請輸入一個數字;
  if a>b then
    dbms_output.put_line(a>b);
  elsif a<b then
    dbms_output.put_line(a<b);
  else
    dbms_output.put_line(a=b);
  end if;
end;
/

declare
  i number;
  n number;
begin
  i:=1;
  n:=&請輸入一個數字;
  loop 
    dbms_output.put_line(i);
    i:=i+1;
    exit when i>n;
  end loop;
  
end;
/


declare
  i number;
  n number;
  s number;
begin
  i:=1;
  n:=&請輸入最大值N;
  s:=0;
  loop 
    s:=s+i;
    i:=i+1;
    exit when i>n;
  end loop;
  dbms_output.put_line(s);
end;
/

declare
  n number;
  i number;
begin
  i:=1;
  n:=&請輸入上限;
  while i<n loop
    dbms_output.put_line(i);
    i:=i+1;
  end loop;
end;
/

declare 
  i number;
  n number;
begin
  i:=0;
  n:=&請輸入一個數字;
  for i in 1..n loop
    dbms_output.put_line(i);
  end loop;
end;
/

begin
  insert into dept values(90,qqq,cc);
  update dept set loc = dasda;
  rollback;
end;
/
select * from dept;


declare
  a varchar2(20);
  b varchar2(20);
begin
  select dname,loc into a,b from dept where deptno =10;
  dbms_output.put_line(a||  ||b);
end;
/

declare
  a dept.dname%type;
  b dept.loc%type;
begin
  select dname,loc into a,b from dept where deptno=10;
  dbms_output.put_line(a|| ||b);
end;
/

declare
  cursor c is select ename,sal,empno from emp where deptno=10;
  na varchar2(20);
  sa number(20);
  emp number(20);
begin
  open c;
  fetch c into na,sa,emp;
    while (c%found) loop
      dbms_output.put_line(na|| ||sa|| ||emp);
      fetch c into na,sa,emp;
    end loop;
  close c;
end;
/


declare
  cursor c is select ename,job,sal from emp where deptno=10;
  na varchar2(50);
  j varchar2(50);
  sal number(10);
begin
  open c;
   fetch c into na,j,sal;
    while(c%found) loop
      dbms_output.put_line(na|| ||j|| ||sal);
      fetch c into na,j,sal;
    end loop;
  close c;
end;
/

declare 
  cursor c is select ename,sal,mgr from emp;
  name varchar2(74);
  sal number;
  mgr number;
begin
  open c;
  fetch c into name,sal,mgr;
  while c%found loop
    dbms_output.put_line(name|| ||sal|| ||mgr);
    fetch c into name,sal,mgr;
  end loop;
  close c;
end;
/

declare
  cursor c is select deptno from dept;
  d number;
begin
  open c;
  fetch c into d;
  loop 
    dbms_output.put_line(d);
    fetch c into d;
    exit when c%notfound;
  end loop;
end;
/

declare 
  cursor c is select ename from emp;zz  name varchar2(50);;
begin
  open c;
  dbms_output.put_line(c%notfound);
  fetch c into name;
  while c%found loop
    dbms_output.put_line(name);
    fetch c into name;
  end loop;
  close c;
end;
/
練習

  

      

---恢復內容結束---

Oracle數據庫的PLSQL