中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

Oracle系列:(28)PLSQL

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的八公山網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

準(zhǔn)備篇

col empno for 9999;

col ename for a10;

col job for a10;

col mgr for 9999;

col hiredate for a12;

col sal for 9999;

col comm for 9999;

col deptno for 99;

col tname for a40;

set pagesize 80;

1、SQL對(duì)比PLSQL

SQL99是什么

(1)是操作所有關(guān)系型數(shù)據(jù)庫的規(guī)則

(2)是第四代語言

(3)是一種結(jié)構(gòu)化查詢語言

(4)只需發(fā)出合法合理的命令,就有對(duì)應(yīng)的結(jié)果顯示

SQL的特點(diǎn)

(1)交互性強(qiáng),非過程化

(2)數(shù)據(jù)庫操縱能力強(qiáng),只需發(fā)送命令,無需關(guān)注如何實(shí)現(xiàn)

(3)多表操作時(shí),自動(dòng)導(dǎo)航簡單,例如:

     select emp.empno,emp.sal,dept.dname
     from emp,dept
     where emp.deptno = dept.deptno

(4)容易調(diào)試,錯(cuò)誤提示,直接了當(dāng)

(5)SQL強(qiáng)調(diào)結(jié)果 

PLSQL是什么

     是專用于Oracle服務(wù)器,在SQL基礎(chǔ)之上,添加了一些過程化控制語句,叫PLSQL

     過程化包括有:類型定義,判斷,循環(huán),游標(biāo),異?;蚶馓幚?。。。

     PLSQL強(qiáng)調(diào)過程

為什么要用PLSQL

     因?yàn)镾QL是第四代命令式語言,無法顯示處理過程化的業(yè)務(wù),所以得用一個(gè)過程化程序設(shè)計(jì)語言來彌補(bǔ)SQL的不足之處,

     SQL和PLSQL不是替代關(guān)系,是彌補(bǔ)關(guān)系

PLSQL程序的完整組成結(jié)構(gòu)如下:

[declare]
    變量聲明;
    變量聲明;
begin
    DML/TCL操作;
    DML/TCL操作;
[exception]
    例外處理;
    例外處理;
end;
/

注意:在PLSQL程序中,;號(hào)表示每條語句的結(jié)束,/表示整個(gè)PLSQL程序結(jié)束

書寫PLSQL的工具有:

(1)SQLPLUS工具

(2)SQLDeveloper工具

(3)第三方工具(PLSQL & 其它)

PLSQL與SQL執(zhí)行有什么不同

(1)SQL是單條執(zhí)行的

(2)PLSQL是整體執(zhí)行的,不能單條執(zhí)行,整個(gè)PLSQL結(jié)束用/,其中每條語句結(jié)束用;號(hào)

2、PLSQL類型

寫一個(gè)PLSQL程序,輸出"hello world"字符串,語法:dbms_output.put_line('需要輸出的字符串');

begin
    --向SQLPLUS客戶端工具輸出字符串
    dbms_output.put_line('hello 你好');
end;
/

注意:

dbms_output是oracle中的一個(gè)輸出對(duì)象

put_line是上述對(duì)象的一個(gè)方法,用于輸出一個(gè)字符串自動(dòng)換行 

設(shè)置顯示PLSQL程序的執(zhí)行結(jié)果,默認(rèn)情況下,不顯示PLSQL程序的執(zhí)行結(jié)果,語法:set serveroutput on/off;

set serveroutput on;

Oracle系列:(28)PLSQL

使用基本類型變量,常量和注釋,求10+100的和

declare
    --定義變量
    mysum number(3) := 0;
    tip varchar2(10) := '結(jié)果是';
begin
    /*業(yè)務(wù)算法*/   
    mysum := 10 + 100;
    /*輸出到控制器*/
    dbms_output.put_line(tip || mysum);
end;
/

Oracle系列:(28)PLSQL

輸出7369號(hào)員工姓名和工資,格式如下:7369號(hào)員工的姓名是SMITH,薪水是800,語法:使用表名.字段%type

declare
    --定義二個(gè)變量,分別裝姓名和工資
    pename emp.ename%type;
    psal   emp.sal%type;
begin  
    --SQL語句
    --select ename,sal from emp where empno = 7369;
    --PLSQL語句,將ename的值放入pename變量中,sal的值放入psal變量中    
    select ename,sal into pename,psal from emp where empno = 7369;
    --輸出
    dbms_output.put_line('7369號(hào)員工的姓名是'||pename||',薪水是'||psal);    
end;
/

Oracle系列:(28)PLSQL

輸出7788號(hào)員工姓名和工資,格式如下:7788號(hào)員工的姓名是SMITH,薪水是3000,語法:使用表名%rowtype

declare
    emp_record emp%rowtype;
begin
    select * into emp_record from emp where empno = 7788;
    dbms_output.put_line('7788號(hào)員工的姓名是'||emp_record.ename||',薪水是'||emp_record.sal);
end;
/

Oracle系列:(28)PLSQL

何時(shí)使用%type,何時(shí)使用%rowtype?

當(dāng)定義變量時(shí),該變量的類型與表中某字段的類型相同時(shí),可以使用%type

當(dāng)定義變量時(shí),該變量與整個(gè)表結(jié)構(gòu)完全相同時(shí),可以使用%rowtype,此時(shí)通過變量名.字段名,可以取值變量中對(duì)應(yīng)的值

項(xiàng)目中,常用%type

3、PLSQL判斷

使用if-else-end if顯示今天星期幾,是"工作日"還是"休息日"

declare
    pday varchar2(10);
begin
    select to_char(sysdate,'day') into pday from dual;
    dbms_output.put_line('今天是'||pday);
    if pday in ('星期六','星期日') then
            dbms_output.put_line('休息日');
    else
            dbms_output.put_line('工作日');
    end if;
end;
/

Oracle系列:(28)PLSQL

從鍵盤接收值,使用if-elsif-else-end if顯示"age<16","age<30","age<60","age<80"

declare
    age number(3) := &age;
begin
    if age < 16 then
       dbms_output.put_line('你未成人');
    elsif age < 30 then
       dbms_output.put_line('你青年人');
    elsif age < 60 then
       dbms_output.put_line('你奮斗人');
    elsif age < 80 then 
       dbms_output.put_line('你享受人');
    else
       dbms_output.put_line('未完再繼');
    end if;
end;
/

Oracle系列:(28)PLSQL

4、PLSQL循環(huán)

使用loop循環(huán)顯示1-10

declare
    i number(2) := 1;
begin
    loop
        --當(dāng)i>10時(shí),退出循環(huán)
        exit when i>10;
        --輸出i的值
        dbms_output.put_line(i);
        --變量自加
        i := i + 1;  
    end loop;
end;
/

Oracle系列:(28)PLSQL

使用while循環(huán)顯示1-10

declare
    i number(2) := 1;
begin
    while i<11 
    loop
        dbms_output.put_line(i);
        i := i + 1;
    end loop;
end;
/

Oracle系列:(28)PLSQL

使用while循環(huán),向emp表中插入999條記錄

declare
    i number(4) := 1;
begin 
    while( i < 1000 )
    loop
        insert into emp(empno,ename) values(i,'哈哈');
        i := i + 1;
    end loop;   
end;
/

Oracle系列:(28)PLSQL

使用while循環(huán),從emp表中刪除999條記錄

declare
    i number(4) := 1;
begin 
    while i<1000
    loop
        delete from emp where empno = i;
        i := i + 1;
    end loop;
end;
/

使用for循環(huán)顯示20-30

declare
    i number(2) := 20;
begin
    for i in 20 .. 30
    loop
        dbms_output.put_line(i);
    end loop;
end;
/

5、PLSQL游標(biāo)

什么是光標(biāo)/游標(biāo)/cursor

類似于JDBC中的ResultSet對(duì)象的功能,從上向下依次獲取每一記錄的內(nèi)容

使用無參光標(biāo)cursor,查詢所有員工的姓名和工資【如果需要遍歷多條記錄時(shí),使用光標(biāo)cursor,無記錄找到使用cemp%notfound】

declare
    --定義游標(biāo)
    cursor cemp is select ename,sal from emp;
    --定義變量
    vename emp.ename%type;
    vsal   emp.sal%type;
begin
    --打開游標(biāo),這時(shí)游標(biāo)位于第一條記錄之前
    open cemp;
    --循環(huán)
    loop
       --向下移動(dòng)游標(biāo)一次
       fetch cemp into vename,vsal; 
       --退出循環(huán),當(dāng)游標(biāo)下移一次后,找不到記錄時(shí),則退出循環(huán)
       exit when cemp%notfound;
       --輸出結(jié)果
       dbms_output.put_line(vename||'--------'||vsal);
    end loop;
    --關(guān)閉游標(biāo)
    close cemp;
end;
/

Oracle系列:(28)PLSQL

使用帶參光標(biāo)cursor,查詢10號(hào)部門的員工姓名和工資

declare
    cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
    pename emp.ename%type;
    psal emp.sal%type; 
begin 
    open cemp(&deptno);
    loop
        fetch cemp into pename,psal; 
        exit when cemp%notfound;
        dbms_output.put_line(pename||'的薪水是'||psal);
    end loop;
    close cemp;
end;
/

Oracle系列:(28)PLSQL

動(dòng)態(tài)圖如下:

Oracle系列:(28)PLSQL

使用無參光標(biāo)cursor,真正給員工漲工資,ANALYST漲1000,MANAGER漲800,其它漲400,要求顯示編號(hào),姓名,職位,薪水

declare
    cursor cemp is select empno,ename,job,sal from emp;
    pempno emp.empno%type;
    pename emp.ename%type;
    pjob   emp.job%type;
    psal   emp.sal%type;
begin
    open cemp;
    loop
        fetch cemp into pempno,pename,pjob,psal;
        --循環(huán)退出條件一定要寫
        exit when cemp%notfound;
        if pjob='ANALYST' then
            update emp set sal = sal + 1000 where empno = pempno;
        elsif pjob='MANAGER' then
            update emp set sal = sal + 800 where empno = pempno;
        else 
    update emp set sal = sal + 400 where empno = pempno;
        end if;
    end loop;
    commit;
    close cemp;
end;
/

6、PLSQL例外

使用oracle系統(tǒng)內(nèi)置例外,演示除0例外【zero_divide】

declare
    myresult number;
begin
    myresult := 1/0;
    dbms_output.put_line(myresult);
exception
    when zero_divide then 
         dbms_output.put_line('除數(shù)不能為0');
         delete from emp;  
end;
/

使用oracle系統(tǒng)內(nèi)置例外,查詢100號(hào)部門的員工姓名,演示沒有找到數(shù)據(jù)【no_data_found】

declare
    pename varchar2(20);
begin
    select ename into pename from emp where deptno = 100;
    dbms_output.put_line(pename);
exception
    when NO_DATA_FOUND then 
         dbms_output.put_line('查無該部門員工');
         insert into emp(empno,ename) values(1111,'ERROR');
end;
/

使用用戶自定義例外,使用光標(biāo)cursor,查詢10/20/30/100號(hào)部門的員工姓名,演示沒有找到數(shù)據(jù)【nohave_emp_found】

declare
  cursor cemp(pdeptno number) is select ename from emp where deptno=pdeptno;
  nohave_emp_found exception;
  pename emp.ename%type;
begin
  --打開游標(biāo),這時(shí)游標(biāo)位于第一條記錄之前
  open cemp(&xx);
  -- 向下移動(dòng)游標(biāo),指向第一條記錄
  fetch cemp into pename;
  -- 判斷 
  if cemp%notfound then
     -- 拋異常
     raise nohave_emp_found;
  else
     -- 輸出變量pename的值 
     dbms_output.put_line(pename);
     -- 循環(huán)
     loop
       -- 向下移動(dòng)游標(biāo)一次,指向第二條記錄
       fetch cemp into pename;
       -- 如果找不到記錄的話,就退出
       exit when cemp%notfound;
       dbms_output.put_line(pename);
     end loop;
  end if;
  
  close cemp;
exception
  when nohave_emp_found then
    dbms_output.put_line('查無此部門員工');
end;
/

Oracle系列:(28)PLSQL

文章標(biāo)題:Oracle系列:(28)PLSQL
新聞來源:http://www.rwnh.cn/article16/jishgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、關(guān)鍵詞優(yōu)化、、品牌網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
恭城| 化德县| 铜陵市| 兴宁市| 怀柔区| 靖宇县| 大理市| 弥渡县| 青铜峡市| 新巴尔虎左旗| 潜江市| 武威市| 馆陶县| 临湘市| 且末县| 云霄县| 太仓市| 达孜县| 江源县| 全椒县| 扶绥县| 焉耆| 凤城市| 博兴县| 德安县| 澄迈县| 四子王旗| 嘉荫县| 嘉鱼县| 迭部县| 建湖县| 饶阳县| 保靖县| 临潭县| 禄丰县| 荆门市| 太仓市| 通海县| 舟山市| 丽江市| 玉门市|