<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kxbin
    成功留給有準(zhǔn)備的人
    posts - 10,  comments - 35,  trackbacks - 0

    使用變量可以保存計(jì)算機(jī)需要處理的數(shù)據(jù),為了給該變量分配適當(dāng)?shù)膬?nèi)存空間,還需要指定數(shù)據(jù)類型,有的數(shù)據(jù)類型還需要指定長(zhǎng)度,如字符串。
    有些類型可以用于建表(如char),有些則不能(如boolean,rowtype)。
    同樣是字符串,建表時(shí)的限制為4000,在腳本中則為3萬多。

    簡(jiǎn)單語法:變量名 數(shù)據(jù)類型; 
    完整語法:變量名 [constant] 變量類型 [not null] [default 值 | :=值]

    其中“[ ]”表示可以不寫,“|”表示任選其一。

    下面給出變量定義及解釋,數(shù)據(jù)類型先用建表時(shí)所用的數(shù)據(jù)類型:
    v1 char:
    說明:沒有給出長(zhǎng)度,所以v1只能保存一個(gè)字符。超過了則會(huì)出錯(cuò):數(shù)字或值錯(cuò)誤 : 字符串緩沖區(qū)太小。

    v2 varchar2(10); 
    說明:v2最多只能保存10個(gè)字符。如果不寫長(zhǎng)度,會(huì)出錯(cuò):字符串長(zhǎng)度限制在范圍(1...32767)

    v3 number; 
    說明:v3保存的數(shù)字范圍非常大,幾乎可以認(rèn)為是沒有限制的。

    v4 number(5);
    說明:v4最多能夠保存5位整數(shù)。如果有小數(shù),Oracle會(huì)自動(dòng)四舍五入。如果整數(shù)部分超過5位,則會(huì)報(bào)錯(cuò):數(shù)字或值錯(cuò)誤 : 數(shù)值精度太高。

    v5 number(5,2);
    說明:v5最多能夠保存3位整數(shù),2位小數(shù)。如果小數(shù)位不止2位,則Oracle會(huì)自動(dòng)四舍五入。整數(shù)位超過3位會(huì)報(bào)錯(cuò),同上。

    v6 date;
    說明:可以直接保存sysdate的值;如果是指定日期,則要用to_date來轉(zhuǎn)化。否則報(bào)錯(cuò):文字與格式字符串不匹配。

    定義了變量,變量的默認(rèn)值為空,此時(shí)進(jìn)行計(jì)算,結(jié)果一定為NULL。所以變量必須初始化。
    初始化有三種方式:

    v7 constant number := 100;
    說明:定義v7為常量,定義時(shí)就必須給定值。然后在程序中就不能再對(duì)v7進(jìn)行賦值了,否則會(huì)報(bào)錯(cuò):表達(dá)式 'V7' 不能用作賦值目標(biāo)。

    v8 number default 10;
    說明:定義v8時(shí)就給定默認(rèn)值10。注意,number類型變量的默認(rèn)值不是0,而是NULL。

    v9 number not null := 1000.50;
    說明:定義v9變量不能為空,此時(shí)必須給出一個(gè)不為NULL的值。在運(yùn)行時(shí)發(fā)現(xiàn)v9為NULL,則報(bào)錯(cuò):說明為 NOT NULL 的變量必須有初始化賦值。

    預(yù)測(cè)各打印結(jié)果,如果代碼有錯(cuò)誤請(qǐng)先改正:
    declare 
    v1 char;
    v2 varchar2(10);
    v3 number;
    v4 number(5);
    v5 number(5,2);
    v6 date;
    v7 number default 10;
    begin 
    v1:='ab'; 
    v2:='abcd';
    v4:=9998.99;
    v5:=1000.5555555;
    v6:=to_date('2002-10-2','yyyy-mm-dd');
    dbms_output.put_line(v1);
    dbms_output.put_line(v2);
    dbms_output.put_line(v3+100);
    dbms_output.put_line(v4);
    dbms_output.put_line(v5);
    dbms_output.put_line(v6);
    dbms_output.put_line(v7+100);
    end;

    只能在腳本中使用的變量類型:
    上面的數(shù)據(jù)類型,同時(shí)在建表時(shí)也能使用。而下面的數(shù)據(jù)類型只能在PL/SQL腳本中使用。
    即:boolean,type,rowtype,record,替代變量、table類型。
    其中:
    ·一個(gè)變量只能保存一個(gè)值,叫做“標(biāo)量變量”。如:char、type。
    ·一個(gè)變量只能保存多個(gè)值,叫做“復(fù)合變量”。如:rowtype、record,table。

    1、布爾類型 boolean 
    boolean類型主要表達(dá)真或假。可以為boolean類型變量賦值true或false。
    主要用于PL/SQL腳本的流程控制。

    示例:
    declare 
    v1 boolean;
    begin 
    v1:=1>2;
    dbms_output.put_line(v1);
    end;

    問題:打印的結(jié)果是什么,是true、false、1、0?
    回答:
    都不對(duì)。運(yùn)行時(shí)得到錯(cuò)誤信息:調(diào)用 'PUT_LINE' 時(shí)參數(shù)個(gè)數(shù)或類型錯(cuò)誤。
    這是因?yàn)樵谀_本中不能直接打印boolean類型的值,所以只能在腳本中使用if語句來判斷。

    修改示例:
    declare 
    v1 boolean;
    begin 
    v1:=1>2;
    if(v1)then 
         dbms_output.put_line('真');
    else 
        dbms_output.put_line('假');
    end if;
    end; 
    打印:

    2、type類型。
    語法:表.字段%TYPE
    返回:某個(gè)表的字段的實(shí)際類型。
    作用:
    PL/SQL腳本中,有時(shí)定義的變量就是存取表中數(shù)據(jù)的。此時(shí)數(shù)據(jù)類型及長(zhǎng)度就需要與字段的定義一致。可以去查看該字段的具體類型,但這樣做很麻煩;并且當(dāng)字段定義改變時(shí),腳本也需要修改。
    所以使用type類型來引用該字段的類型,更方便,維護(hù)性更好。


    示例:根據(jù)工號(hào)查詢員工姓名。
    分析:要從emp表中獲取姓名,必須要用查詢語句。而要從查詢語句中獲取返回的值,要加上“into 變量”。

    declare
        v_empno emp.empno%type;
        v_ename emp.ename%type;
    begin
        v_empno:=7900;
        select ename into v_ename from emp where empno=7900;
        dbms_output.put_line(v_ename);
    end;


    3、rowtype類型
    語法: 表%rowtype
    作用: 保存了某一行記錄的所有字段的值。


    示例:根據(jù)工號(hào)為7900的員工的以下信息:ename,job,sal,comm,hiredate。
    第一種:如果用type類型,定義5個(gè)變量保存查詢結(jié)果。代碼略。
    第二種:如果用rowtype類型,只需要定義一個(gè)rowtype類型的變量。

    代碼:
    declare
        v_empno emp.empno%type;
        v_row emp%rowtype;
    begin
        v_empno:=7900;
        select * into v_row from emp where empno=7900;
        dbms_output.put_line('ename='||v_row.ename);
        dbms_output.put_line('job='||v_row.job);
        dbms_output.put_line('sal='||v_row.sal);    
        dbms_output.put_line('comm='||v_row.comm);
        dbms_output.put_line('hiredate='||v_row.hiredate);    
    end;
    打印:
    ename=JAMES
    job=CLERK
    sal=950
    comm=
    hiredate=03-12月-81

    說明
    ·必須select *,或者根據(jù)表結(jié)構(gòu)的順序?qū)懗鏊凶侄蚊?br />·使用rowtype類型最主要的限制在于表中不能有大對(duì)象字段如:CLOB、BLOB。

    4、record類型
    record的意思是“記錄”。
    有時(shí),用type類型會(huì)定義太多的變量,用rowtype又會(huì)取到自己不關(guān)心的數(shù)據(jù)。
    如何只取自己關(guān)心的字段的值呢?此時(shí)就用record類型來自定義有多少個(gè)列。
    語法:
    type 類型名 is record(
       屬性名1 屬性類型,
       屬性名2 屬性類型
    );
    注意
    1、屬性之間定義用的是逗號(hào)(,),不是分號(hào)(;)。
    2、最后一個(gè)屬性名不需要再用“,”。

    使用步驟有兩個(gè):
    1、先用type自定義一個(gè)新的類型,這個(gè)類型的變量能夠的變量與定義有關(guān)。
    2、再用這個(gè)新的類型來定義一個(gè)變量,這個(gè)變量才能保存實(shí)際的數(shù)據(jù)。

    示例:需求同上。
    declare
    --自定義一個(gè)類型
    type myType is record(
        xm emp.ename%type, --姓名
        gzuo emp.job%type, --工作
        gzi emp.sal%type --工資
    );
    --使用自定義類型來定義變量
    myValue myType;
    begin
        select ename,job,sal into myValue from emp where empno=7844;
        dbms_output.put_line('ename='||myValue.xm);
        dbms_output.put_line('job='||myValue.gzuo);
        dbms_output.put_line('sal='||myValue.gzi);
    end;

    說明:
    · 在查詢時(shí)必須與自定義類型的屬性順序一一對(duì)應(yīng)。
    ·myValue中的屬性名也是自定義的,不是字段名。

    問題:上面的代碼比直接用type類型還多些,看不出優(yōu)勢(shì)在什么地方。為什么還要用record?
    回答:
    在項(xiàng)目中,自定義類型通常會(huì)放到在包(package,后面會(huì)專門學(xué)習(xí))中,這樣就可以在其它地方直接引用了。

    示例:
    先在包中自定義類型:
    create or replace package my_bao
    as
    type myType is record(
        xm emp.ename%type, --姓名
        gzuo emp.job%type, --工作
        gzi emp.sal%type --工資
    );
    end;
    然后就可以在塊中直接使用該類型,只不過在類型前要加上包名:“my_bao”。
    declare
    --使用包中自定義類型來定義變量
    myValue 
    my_bao.myType;
    begin
        select ename,job,sal into myValue from emp where empno=7844;
        dbms_output.put_line('ename='||myValue.xm);
        dbms_output.put_line('job='||myValue.gzuo);
        dbms_output.put_line('sal='||myValue.gzi);
    end;

    5、替代變量
    語法: &替換內(nèi)容
    作用:提供用戶輸入的界面,在用戶輸入數(shù)據(jù)以后,先替換PL/SQL腳本,再編譯執(zhí)行。

    案例一:輸入年齡,然后打印出來
    SQL> declare
    2   v_age number(3);
    3 begin
    4    v_age:=&年齡;
    5    dbms_output.put_line('您的年齡是 = '||v_age);
    6 end;
    7 /
    輸入 年齡 的值: 20
    原值    4:   v_age:=&年齡;
    新值    4:   v_age:=20;

    說明:在用戶輸入“20”以后,將“&年齡”替換為了“20”。于是腳本的源代碼發(fā)生了改變:
    declare
    v_age number(3);
    begin
    v_age:=20;
    dbms_output.put_line('您的年齡是 = '||v_age);
    end;

    所以“&”變量并不是一個(gè)真正的變量,它不能保存任何內(nèi)容,只是提供一個(gè)字符串替換的功能。


    案例二:用戶輸入姓名并打印。
    declare
    v_age varchar2(3);
    begin
    v_age:=&姓名;
    dbms_output.put_line('您的姓名是 = '||v_age);
    end;
    問題:如果用戶輸入“a”,程序是否能夠運(yùn)行,如果能,打印的結(jié)果是什么?
    分析:當(dāng)用戶輸入“a”,上面代碼就是:
    declare
    v_age varchar2(3);
    begin
    v_age:=a;
    dbms_output.put_line('您的姓名是 = '||v_age);
    end;
    由于“a”前后沒有單引號(hào),所以會(huì)被當(dāng)作“標(biāo)識(shí)符”即當(dāng)作變量名。
    但是a這個(gè)變量又沒有定義。所以一定會(huì)提示如下的錯(cuò)誤:
    必須說明標(biāo)識(shí)符 'A'

    解決的方法就是:在“&”前后加上單引號(hào),即:
    declare
    v_age varchar2(3);
    begin
    v_age:='&姓名';
    dbms_output.put_line('您的姓名是 = '||v_age);
    end;
    /

    替代變量小結(jié):
    ·替代變量的作用主要是為匿名塊提供一個(gè)數(shù)據(jù)錄入的界面。
    ·替代變量只是完成字符串替換的功能,不能保存值。
    ·如果替代變量是字符串,則必須加上單引號(hào)。

    說明:如果是命名塊,則通過名稱和參數(shù)進(jìn)行調(diào)用,此時(shí)不會(huì)再用替代變量。

    6、table類型
    table類型叫做“表類型”,又叫“索引表類型”。
    注意:都是指PL/SQL腳本中的table類型,而不是數(shù)據(jù)庫的對(duì)象。

    在學(xué)習(xí)table類型之前,先看一個(gè)任務(wù)。

    需求:用戶輸入10,打印男;輸入20,打印女。
    方法一:用分支語句(if……等)判斷。
    方法二:請(qǐng)思考,能不能不用判斷語句。這個(gè)任務(wù)同樣適用于java學(xué)習(xí)者。

    方法一:
    declare
    v_sex_code number(2);
    v_sex_name char(2);
    begin
    v_sex_code:=&性別編號(hào);
    if(v_sex_code=10)then
         v_sex_name:='男';
    else
        v_sex_name:='女';
    end if;
    dbms_output.put_line('您的性別是 = '||v_sex_name);
    end;

    用戶輸入:10
    打印: 男


    方法二:使用table類型。
    語法:type 類型名 is table of 值類型 index by 索引類型。

    說明:
    ·作用:定義了一個(gè)表格結(jié)構(gòu),這個(gè)表格只有2個(gè)列用于保存“索引(鍵)值對(duì)”,這樣就可以方便地通過索引找到值。
         如:10=男、20=女,其中10,20就叫做索引,通過10,20就能夠找到性別名稱:男和女
    ·值類型:指實(shí)際保存的數(shù)據(jù)的類型。如男和女。
    ·索引類型:通常指定為下面兩種整數(shù)類型之一:binary_integer 或者 pls_integer。區(qū)別是:
              ·Binary_Integer類型變量值計(jì)算是由Oracle來執(zhí)行,不會(huì)出現(xiàn)溢出,但是執(zhí)行速度較慢,因?yàn)樗怯蒓racle模擬執(zhí)行。
             ·Pls_Integer的執(zhí)行是由硬件即直接由CPU來運(yùn)算,因而會(huì)出現(xiàn)溢出,但其執(zhí)行速度較前者快許多。Oracle舊版本不支持。


    需求:用戶輸入10,打印男;輸入20,打印女。
    分析:
    ·根據(jù)上面的需求,值是“男”或者“女”,所以只需要char(2)就可以了。
    ·在數(shù)據(jù)量不是太大時(shí),可以選擇索引的類型為:pls_integer。

    代碼:
    declare
    --1.定義表結(jié)構(gòu)
    type myTabType is table of char(2) index by pls_integer;
    --2.創(chuàng)建表類型變量
    sexTab myTabType;

    v_sex_code number(2);
    v_sex_name char(2);
    begin
    --3.插入數(shù)據(jù):
    sexTab (10):='男';
    sexTab (20):='女';
    --用戶輸入
    v_sex_code:=&性別編號(hào);

    --4. 查詢數(shù)據(jù)(如:sexTab (10) 表示“查詢索引為10的值,得到 男”)
    v_sex_name:=sexTab (v_sex_code);

    dbms_output.put_line('您的性別是 = '||v_sex_name);
    end;

    說明:sexTab在插入數(shù)據(jù)以后,在內(nèi)存結(jié)構(gòu)如下:
    index    值
    10          男
    20          女

    使用table類型也可以查詢多行多列的數(shù)據(jù)。

    需求:查詢所有部門

    declare
    --定義表結(jié)構(gòu)(省略了index by,見說明)

    type myType is table of dept%rowtype;
    --創(chuàng)建表類型變量
    myTab myType;
    begin

    select * bulk collect into myTab from dept;
    for x in 1..myTab.count
    loop
       dbms_output.put_line(myTab(x).deptno);
       dbms_output.put_line(myTab(x).dname);
    end loop;

    end;

    說明:

    ·本列中myTab的索引是由程序?yàn)樗饕x值,所以index by語句可以省略。

    · 將查詢的所有部門放到myTab,索引自動(dòng)設(shè)置為1,2,3…

    打印:

    10
    ACCOUNTING
    20
    RESEARCH
    30
    SALES
    40
    OPERATIONS

    探討:有關(guān)PL/SQL表類型中的理解。
    ·很容易認(rèn)為PL/SQL表類型象c或Java中的數(shù)組類型,因?yàn)槠渲杏袀€(gè)關(guān)鍵字叫做“index”(索引),而數(shù)組的下標(biāo)也叫做“index”。
    ·但是這樣無法解釋PL/SQL表類型的索引可以不連續(xù),甚至可以為負(fù)數(shù)的問題。
    ·我認(rèn)為,PL/SQL表類型更象是java中的map對(duì)象,索引就對(duì)應(yīng)map中的鍵,多個(gè)值之間的鍵可以不連續(xù),可以為負(fù)數(shù),甚至可以是字符串。兩者有異曲同工之妙。

    示例:用字符串做索引。
    declare
    --定義表結(jié)構(gòu)
    type myTabType is table of char(2) index by varchar2(5);
    sexTab myTabType;

    v_sex_code varchar2(5);
    v_sex_name char(2); 
    begin
    --往表中添加內(nèi)容
    sexTab('nan'):='男';
    sexTab('nv'):='女';
    --用戶輸入
    v_sex_code:='&性別編號(hào)';
    v_sex_name:=sexTab(v_sex_code);

    dbms_output.put_line('您的性別是 = '||v_sex_name);
    end;

    輸入:nan
    輸出: 男

    問題:用table類型能夠保存多個(gè)列嗎?
    回答:
    可以。只要將“值類型”換為復(fù)合類型就可以了。如下面的table定義就能夠保存emp表的所有記錄:
    type empTabType is table of emp%rowtype index by pls_integer。
    注意:empTabType的索引可以是empno,也可以不是。

    聯(lián)想一下下:
    ·在PL/SQL表中,利用PL/SQL表類型,在某些場(chǎng)合也能夠避免減少表連接,從而大大提高連接的效率。
    ·在java中map對(duì)象用途非常廣泛,可以緩存很多對(duì)象(如配置文件對(duì)象,常見的查詢結(jié)果對(duì)象等)。兩者的用法真的是異曲同工之妙。

    7、其它類型
    ·嵌套表、數(shù)組:用得少,不學(xué)了。
    ·游標(biāo)類型,引用游標(biāo)類型:在后面學(xué)習(xí)游標(biāo)以后再學(xué)習(xí)。

    主要內(nèi)容小結(jié):
    ·塊結(jié)構(gòu):變量區(qū)、代碼區(qū)、異常區(qū)
    ·塊分類:匿名塊、命名塊(具體的在后面學(xué)習(xí))
    ·標(biāo)量類型:char,varchar2,number,date,boolean,type 
    ·復(fù)合類型:rowtype,record,table

    個(gè)人小結(jié):
    ·保存一個(gè)值的變量,可以用具體的數(shù)據(jù)或者type類型

    ·保存多個(gè)值的變量,可以用rowtype,record。

    ·保存多行2列的變量,可以用table類型。

    ·保存多行多列的變量,仍然用table類型,只是數(shù)據(jù)類型選用rowtype即可。

    posted on 2012-09-05 16:25 kxbin 閱讀(452) 評(píng)論(0)  編輯  收藏 所屬分類: ORACLE轉(zhuǎn)發(fā)
    你恨一個(gè)人是因?yàn)槟銗鬯荒阆矚g一個(gè)人,是因?yàn)樗砩嫌心銢]有的;你討厭一個(gè)人是因?yàn)樗砩嫌心阌械臇|西;你經(jīng)常在別人面前批評(píng)某人,其實(shí)潛意識(shí)中是想接近他。

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(5)

    隨筆檔案

    文章分類

    文章檔案

    相冊(cè)

    收藏夾

    J2EE

    java技術(shù)網(wǎng)站

    Linux

    平時(shí)常去的網(wǎng)站

    數(shù)據(jù)庫

    電影網(wǎng)站

    網(wǎng)站設(shè)計(jì)

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 成人免费一级毛片在线播放视频 | 亚洲精品国产精品乱码不卡| 久久国产精品一区免费下载| 男女猛烈xx00免费视频试看| 久久久亚洲AV波多野结衣| 亚洲精品国产日韩无码AV永久免费网 | 东方aⅴ免费观看久久av | 在线观看免费为成年视频| 中文字幕无码毛片免费看| 美女黄频免费网站| 亚洲乱码av中文一区二区| 亚洲精品456在线播放| 亚洲AV无码乱码在线观看裸奔 | 精品国产日韩亚洲一区在线| 亚洲国产中文在线二区三区免| 国产亚洲精品无码成人| 亚洲精品天堂成人片?V在线播放| 午夜影视在线免费观看| 青青青国产在线观看免费网站| 亚洲免费视频网站| 国产一级淫片a免费播放口| 一级午夜a毛片免费视频| 国产精品亚洲一区二区三区 | 毛片在线全部免费观看| 久久国产乱子伦精品免费午夜 | 亚洲区日韩区无码区| 国产乱子伦精品免费无码专区| 岛国大片免费在线观看| 日韩吃奶摸下AA片免费观看| 国产a视频精品免费观看| 4399影视免费观看高清直播| 免费人成视频在线观看网站| 久久免费动漫品精老司机| 久草免费手机视频| 亚洲一区免费观看| 日韩精品无码免费一区二区三区| 久久免费动漫品精老司机 | 亚洲AV午夜福利精品一区二区| 亚洲欧洲日产国码av系列天堂| 亚洲女久久久噜噜噜熟女| 国产亚洲A∨片在线观看|