19個實例學會plsql

--p1
begin
dbms_output.put_line('你好 世界');
end;

--p2 引入變量
declare
    age number default 90;
    height number := 175;
begin
    dbms_output.put_line('年齡'||age||'身高'||height);
end;

--p3 變量開始運算
declare
    age number default 90;
    height number := 175;
begin
    dbms_output.put_line('年齡'||age||'身高'||height);
    age := age + 20;
    dbms_output.put_line('20年後年齡'||age||'');
end;


--p4 引入表達式
declare
    age number default 90;
    height number := 175;
begin
    if age>70 then
        dbms_output.put_line('古稀之年');
    else
        dbms_output.put_line('風華正茂');
    end if;
end;

--p5 流程控制
declare
    age number default 90;
    height number := 175;
    gender char(2) := '';
begin
    if gender='' then
        dbms_output.put_line('你能夠和女性結婚');
    end if;

    if height>170 then
        dbms_output.put_line('能夠打籃球');
    else 
        dbms_output.put_line('能夠踢足球');
    end if;

    if age<20 then
        dbms_output.put_line('年輕小夥');
    elsif age <= 50 then
        dbms_output.put_line('年輕有爲');
    elsif age <=70 then
        dbms_output.put_line('安享天倫');
    else  
        dbms_output.put_line('佩服佩服');
    end if;

end;


--p6 計算1-100的和
declare
    i number :=0;
    total number :=0;
begin
    loop
        i := i+1;
        total := total + i;

        if i=100 then
            exit;
        end if;
    end loop;

    dbms_output.put_line('總和'||total);

end;

-- p7: 跳出loop的方法
declare
    i number :=0;
    total number :=0;
begin
    loop
        i := i+1;
        total := total + i;

        exit when i>=100;
    end loop;

    dbms_output.put_line('總和'||total);

end;

--p8 whlie循環
declare
    i number :=0;
    total number :=0;
begin

    while i<100 loop
        
        i := i+1;
        total := total + i;
        
    end loop;

    dbms_output.put_line('總和'||total);

end;



--p9 for 循環
begin

    --for 循環變量 in 起始值..結束值 loop
    --xxxxx
    --end loop;

    for i in 1..9 loop
    
        dbms_output.put_line(i);

    end loop;

    for i in reverse 1..9 loop
    
        dbms_output.put_line(i);

    end loop;

end;



--p10 沒有返回值的"函數"
--作一個求面積的過程
--declare
--    area number;
--    procedure 過程名(參數名 類型,...) is
--    begin
--        主體
--    end;
--begin
--end;

declare 
    area number;
    procedure mian(a number,b number) is
    begin
    
        area := a * b;
        dbms_output.put_line(a||''||b||'的面積是'||area);
    
    end;
begin

    mian(5,4);
    mian(6,7);
    mian(3,7);

end;



--p11 作一個求面積的函數
--declare
--    area number;
--    function 過程名(參數名 類型,...) return 類型 is
--    begin
--        主體
--    end;
--begin
--end;

declare 
    area number;
    function mian(a number,b number) return number is
    begin
    
        area := a * b;
        
        return area;
    
    end;
begin

    dbms_output.put_line(mian(5,4));
    dbms_output.put_line(mian(3,7));
    dbms_output.put_line(mian(6,9));

end;


--p12 自定義變量類型 之記錄類型

declare
    
    type student is record
    (
        sno char(5),
        name varchar2(10),
        age number
    );

    lisi student;

begin

    lisi.sno := 's1008';
    lisi.name := '李四';
    lisi.age := 19;

    dbms_output.put_line('我叫'||lisi.name||',我'||lisi.age||'歲,學號是'||lisi.sno);
end;




--p13 自定義類型之集合類型


declare 
 type answer is table of char(2);
 ans answer := answer('a','b','c','d');

begin

    dbms_output.put_line('共有'||ans.count()||'答案,分別是:');
    dbms_output.put_line(ans(1));
    dbms_output.put_line(ans(2));
    dbms_output.put_line(ans(3));
    dbms_output.put_line(ans(4));

end;

--p14 聲明數據類型的第3個方法

declare
    age number;
    變量名 另外一個變量%type;

    age 表名.列名%type; --聲明和列同樣的類型

    --簡化聲明record類型
    變量名 表名%rowtype;

begin
end;


--p15 測試一下rowtype

declare
    xg student%rowtype;
begin

    xg.sno := 123;
    xg.name := '小剛';

    dbms_output.put_line(xg.sno||xg.name);

end;



--p16 pl/sql操做數據庫中的數據
--查詢部門的名稱及地區,及部門的總薪水與獎金

declare 

    depart dept%rowtype;
    total_sal number;
    total_comm number;

    procedure deptinfo(dno number)
    is
    begin
        select dname,loc into depart.dname,depart.loc from dept where deptno=dno;
        select sum(sal),sum(comm) into total_sal,total_comm from emp where deptno=dno;

        dbms_output.put_line('部門名稱:'||depart.dname||''||depart.loc);
        dbms_output.put_line('這個部門每個月工資及獎金各是'||total_sal||''||total_comm);
    end;

begin

    deptinfo(80);
    deptinfo(30); 
end;



--p17 引入異常處理

declare 

    depart dept%rowtype;
    total_sal number;
    total_comm number;

    procedure deptinfo(dno number)
    is
    begin
        select dname,loc into depart.dname,depart.loc from dept where deptno=dno;
        select sum(sal),sum(comm) into total_sal,total_comm from emp where deptno=dno;

        dbms_output.put_line('部門名稱:'||depart.dname||''||depart.loc);
        dbms_output.put_line('這個部門每個月工資及獎金各是'||total_sal||''||total_comm);
    end;

begin
    deptinfo(80);
    deptinfo(30);
exception
    when NO_DATA_FOUND then
       dbms_output.put_line('沒有數據');
    when others then
       dbms_output.put_line('其餘錯誤');
end;



--p18:遞歸過程或函數
--求1->N的和,N容許輸入

declare
    m number;
    total number;

    function qiuhe(n number) return number
    is
    begin

        if n>1 then
            return n + qiuhe(n-1);
        else 
            return 1;
        end if;

    end;

begin

    dbms_output.put_line(qiuhe(10));

end;

--p19 存儲過程/存儲函數
create function qiuhe(n number) return number
is
begin

    if n>1 then
        return n + qiuhe(n-1);
    else 
        return 1;
    end if;

end;

 

觸發器例子sql

-- g 商品表
create table g
(gid number,
gname varchar2(20),
cnt number
);

insert into g values (seq1.nextval,'',10);
insert into g values (seq1.nextval,'',8);
insert into g values (seq1.nextval,'',7);
insert into g values (seq1.nextval,'',6);


-- o 訂單表
create table o (
oid number,
gid number,
much number
);



監視:o表
動做: insert
觸發: update g
時間:after 


create trigger 觸發器名字
觸發時間
監視的動做 on 表名[監視地點]
begin

    觸發後的動做

end;


create trigger t1
after insert on o
begin
    update g set cnt=cnt-new.much where gid=new.gid;
end;

create trigger t2
after insert on o
for each row
begin
    update g set cnt=cnt-:new.much where gid=:new.gid;
end;


--表級觸發器
create trigger t3
after delete on goods
begin
    dbms_output.put_line('有人觸發我');
end;

--行級觸發器
create trigger t4
after delete on goods
for each row
begin
    dbms_output.put_line('有人觸發我');
end;

--before發生的觸發器,有機會改sql語句的值
create trigger t5
before insert on o
for each row

declare
tmp number;

begin

    select cnt into tmp from g where gid=:new.gid;

    if :new.much > tmp then
    
        :new.much := tmp;
    
    end if;

    update g set cnt=cnt-:new.much where gid=:new.gid;
    
end;
相關文章
相關標籤/搜索