隨筆-9  評論-168  文章-266  trackbacks-0
          存儲過程
          注 : 
          (1)在procedure中想用ddl,就必須用execute   immediat 'create table text1(id int not null primary key)';
          且必須顯授權(grant create any table to 用戶名),否則報'insufficient privileges',無權限.
          (2)每條語句都需以';'結尾.
          1.基本語法 : 創建一個存儲過程,如果存在就覆蓋.  (注:as/is沒區別,只是兼容別的SQL而已)
          create or replace procedure  過程名(參數1 in number ,參數2 in number) is
          變量1 integer:=0;
          變量2 date;
          exp   exception;  --定義異常
          begin
              --存儲過程中調用DDL,必須用動態SQL方法
              execute  immediate ' create table testtable (testid int not null primary key,testname varchar2(10) ) ';
              execute   immediate   'insert   into   testtable values(1,110) '; 
             raise   exp;    --拋出異常
          exception        --異常處理
              when   exp   then 
              dbms_output.put_line( '執行成功1 ');    --控制臺打印
              when   others   then 
              dbms_output.put_line( '執行失敗0 '); 
          end;
          2.基本語句:
          (1)變量賦值
          <1>變量初始化賦值:=值;
          <2>變量賦值: select ....into... from ....;     --select ... from ... 方法在存儲過程中時的格式
          select name1,name2 into var1,var2 from table1 
          (2)For 循環
          For ... in ... LOOP
          --執行語句
          end LOOP;
          <1>循環遍歷游標
          create or replace procedure test() as
              Cursor cursor is select name from student; name varchar(20);
          begin
              for name in cursor LOOP
              begin
                  dbms_output.putline(name); 
              end;
              end LOOP;
          end test;
          <2>循環遍歷數組
           create or replace procedure test(varArray in myPackage.TestArray) as
          --(輸入參數varArray 是自定義的數組類型,定義方式見標題6)
          i number;
          begin
          i := 1;  --存儲過程數組是起始位置是從1開始的,與java、C、C++等語言不同。因為在Oracle中本是沒有數組
          的概念的,數組其實就是一張
          --表(Table),每個數組元素就是表中的一個記錄,所以遍歷數組時就相當于從表中的第一條記錄開始遍歷
          for i in 1..varArray.count LOOP     
          dbms_output.putline(&apos;The No.&apos;|| i || &apos;record in varArray is:&apos;||varArray(i));   
           end LOOP;
          end test;
          3.代碼拋出異常用raise (異常名);
          4.游標 : 
          (1)系統級游標:cursor SYS_REFCURSOR;只能通過open方法打開和賦值
          OPEN cursor FOR select name1,name2 from table1 where a='1';  --sql語法
          LOOP
              FETCH cursor INTO name1,name2;    --只能通過fetch into 打開和遍歷
              exit when cursor%NOTFOUND;         --可用三個狀態:%NOTFOUND(未找到記錄);%FOUND(找到記
          錄);%ROWCOUNT(當前游標指向的行位置)
               dbms_output.putline(name1||name2);
          END LOOP;
          5.連接運算符 : || ,即'ABC'||'123' : ABC123
          6.單行注釋: --;多行:/**/;
          posted on 2011-06-20 17:12 紫蝶∏飛揚↗ 閱讀(998) 評論(0)  編輯  收藏 所屬分類: 數據庫
          主站蜘蛛池模板: 南陵县| 林州市| 天门市| 沙河市| 遵义市| 金湖县| 仁化县| 望都县| 陆河县| 崇州市| 阜康市| 宝鸡市| 绵竹市| 平昌县| 宜城市| 修水县| 大安市| 北安市| 宾川县| 两当县| 宁远县| 湖口县| 米泉市| 钟祥市| 黄骅市| 榕江县| 大洼县| 元谋县| 漳平市| 定安县| 高邮市| 紫金县| 库伦旗| 平邑县| 宁蒗| 闽清县| 靖安县| 孝昌县| 江陵县| 册亨县| 曲水县|