Decode360's Blog

          業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          <2008年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          公告

          話到七分,酒至微醺,筆墨疏宕,言詞婉約,古樸殘破,含蓄醞籍,就是不完而美之最高境界。

          常用鏈接

          留言簿(13)

          隨筆分類(397)

          隨筆檔案(397)

          文章分類(33)

          新聞分類(15)

          收藏夾(74)

          Blog_List

          IT_Web

          My_Link

          最新隨筆

          最新評論

          PLSQL學習(一) 基礎知識
          ?
          ??? 很久以前自己整理的PLSQL一些基礎知識,翻出來看看都是比較基礎的內容,還是放上來好了。參考的資料是《PL/SQL用戶指南與參考》中譯版,覺得這是一部很不錯的入門書,感謝把這本書翻譯出來的網友。
          ?
          ?
          1、乘方的不同應用:
          ?
          ??? 在SQL中乘方只能使用函數Power(a,b)來計算
          ??? 但在PLSQL中可直接使用a**b表示
          ?
          2、賦值語句Returning:

          ?

          ?? insert into t1 values ( 90 , 'SERVICE' , 'BEIJING' )

          ?? Returning rowid , name into row_id,info;

          ??? 注:只限insert、update、delete一條記錄時進行賦值
          ?
          3、自定義參數——&:
          ?
          ??? 可SQL和PLSQL中均可使用自定義參數,即需要自己輸入值的參數
          ??? select * from ldcom where comcode=&a andname=&b;
          ??? PLSQL:
          ??? declare i int := &a;?? n int := &b;
          ?
          4、綁定變量的使用:
          ?
          ??? 可使用綁定變量的辦法提高SQL效率

          ?

          ??? SQL> variable x number ;

          ??? SQL> exec :x := 8600 ;

          ??? SQL> select * from ldcom where comcode= :x ;

          ??? 注:PLSQL中的declare即隱士綁定,無需再申明
          ?
          ??? 可用Print查看綁定變量? SQL> print x;
          ??? 也可使用查詢? SQL> select :x from dual;
          ?
          ??? 實際的簡單應用: ???

          ?

          ??? variable x number ;

          ?

          ??? declare

          ????? v_date date ;

          ??? begin

          ????? for i in ? 1 .. 10 loop

          ??? ??? :x := i;

          ??? ??? select sysdate +:x into v_date from dual;

          ??? ??? dbms_output.put_line(v_date);

          ??? ? end loop ;

          ??? end ;

          ??? /

          ?
          ??? 在execute immediate中的應用: ???

          ?

          ??? declare

          ??? v_x t1.num% type ;

          ??? begin

          ??? execute immediate 'update t1 set num=8888 where id=:a returning num into :b'

          ??? using 2 returning into v_x;

          ??? dbms_output.put_line(v_x);

          ??? end ;

          ??? 注意returning的返回值在動態SQL中的操作格式

          ?
          5、%TYPE和%ROWTYPE的區別:
          ?
          ??? %TYPE針對某一字段類型(數組也是單一的類型)
          ??? %ROWTYPE針對某一整表的類型(游標也是整表)
          ?
          6、計數循環的逆序法:

          ?

          ??? for i in reverse 10 .. 100 loop

          ??? 注意reverse的位置不要記錯
          ?
          7、一般的游標使用法:
          ?
          ??? 1、游標的正常使用需要四步
          ?
          ??? ①定義游標

          ??? cursor c2(dept_no number default 10 ) is----注意定義dept_no的方法

          ??? select name ,agentcode from laagent where rownum <= dept_no;

          ??? ②打開游標

          ??? open c3(dept_no => 20 ); ---- 可以重新定義 dept_no

          ??? ③提取游標數據

          ??? fetch c2 into dept_name,dept_loc; ---- 字符類型、個數相等

          ??? fetch c3 into deptrec; ----deptrec rowtype

          ??? exit when c3% notfound ;

          ??? ④關閉游標

          ??? CLOSE c3;

          ??? 游標屬性

          ??? % FOUND ????? -- 布爾型屬性,當最近一次讀記錄時成功返回 , 則值為 TRUE

          ??? % NOTFOUND ?? -- 布爾型屬性,與 %FOUND 相反;

          ??? % ISOPEN ???? -- 布爾型屬性,當游標已打開時返回 TRUE

          ??? % ROWCOUNT ?? -- 數字型屬性,返回已從游標中讀取的記錄數。

          ?
          ??? 2、 使用for自動打開、提取、關閉游標

          ?

          ??? FOR c1_rec IN c1 LOOP

          ??? FOR c1_rec IN ( SELECT dname, loc FROM dept) LOOP

          ?
          ??? 3、注:單一的SQL語句都是一個隱式的游標,屬性為

          ?

          ??? SQL% FOUND ????? -- 布爾型屬性,當最近一次讀記錄時成功返回 , 則值為 TRUE ;

          ??? SQL% NOTFOUND ?? -- 布爾型屬性,與 %FOUND 相反;

          ??? SQL% ISOPEN ???? -- 布爾型屬性,當游標已打開時返回 TRUE

          ??? SQL% ROWCOUNT ?? -- 數字型屬性,返回已從游標中讀取的記錄數。

          ??? 例如:DELETEFROM emp WHERE deptno=v_deptno;

          ????? ?? IF SQL % NOTFOUND THEN ...

          ?
          8、For Update鎖定數據:

          ?

          ??? CURSOR emp_cursor is select empno,sal

          ??? from emp where deptno=v_deptno for update of sal nowait ;

          ??? 注意:其中的of sal,for update可以精確到某一個或幾個字段
          ?
          ??? 在使用了For Update之后可以在delete和update語句中使用current of cursor_name子句

          ??? for emp_record in emp_cursor loop

          ? ??? if emp_record.sal < 1500 then

          ????? ? update emp set sal= 1500 where current of emp_cursor;

          ? ??? end if ;

          ??? end loop ;

          ??? 但需注意:只能針對for update的表進行修改。

          ?
          9、Package中的子程序可以重載
          ?
          ??? 即函數名相同,參數個數不同
          ?
          10、PL/SQL的執行順序
          ?
          ??? 在同一Package中,若要使用自身定義的Function或Procedure,則必須是之前定義過的。
          ??? 同理,即便使用參數,也必須在前面定義過。
          ??? 也就是說:一般最終的執行程序,會放在Package的最后,除非將所有部分都申明成Public。
          ?
          ?
          posted on 2008-08-07 22:17 decode360 閱讀(1521) 評論(0)  編輯  收藏 所屬分類: 06.PLSQL
          主站蜘蛛池模板: 子洲县| 屯昌县| 翁源县| 安新县| 甘谷县| 连云港市| 淳化县| 浏阳市| 井研县| 大方县| 庆阳市| 大兴区| 顺义区| 黔东| 昭苏县| 赞皇县| 嘉义县| 象州县| 兴山县| 永春县| 普兰店市| 化隆| 儋州市| 临颍县| 西乌| 崇义县| 永昌县| 五莲县| 清镇市| 漾濞| 襄樊市| 玉门市| 陈巴尔虎旗| 常山县| 冕宁县| 册亨县| 云龙县| 荥经县| 武功县| 金沙县| 双柏县|