亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Oracle存儲過程及調用

Oracle存儲過程及調用

熱門標簽:區域地圖標注怎么設置 百度地圖標注飯店位置怎么 百度地圖標注注解 南通電銷外呼系統哪家強 電話機器人那種好 地圖標注的坐標點 上海網絡外呼系統 理財產品電銷機器人 外呼系統好點子

Oracle存儲過程語法

Oracle的存儲過程語法如下:

create procedure 存儲過程名稱(隨便取) 
is
    在這里可以定義常量、變量、游標、復雜數據類型這里可以定義變量、常量
begin
    執行部分
end; 

(2)帶參數的存儲過程語法:

create procedure 存儲過程名稱(隨便取) (變量1 數據類型,變量2 數據類型,...,變量n 數據類型)
is
    在這里可以定義常量、變量、游標、復雜數據類型這里可以定義變量、常量
begin
    執行部分
end; 

(3)帶輸入、輸出參數的存儲過程語法:

create procedure 存儲過程名稱(隨便取) (變量1 in(或out) 數據類型,變量2 in(或out) 數據類型,...,變量n in(或out) 數據類型)
is
    在這里可以定義常量、變量、游標、復雜數據類型這里可以定義變量、常量
begin
    執行部分
end;

注意:用上面的語法創建存儲過程時可能會碰到數據庫中已經有了同名的存儲過程,這樣Oracle就會彈框報錯,說名字已被現有對象使用。解決方法有兩種:

   方法一:換個存儲過程名

   方法二:在最開頭的create procedure 之間加上 or replace 關鍵字,例如:create or replace procedure 存儲過程名稱。但是這種方法不建議使用,因為這種方法會把之前同名的存儲過程替換為你當前寫的這個

存儲過程案例一:沒參數的存儲過程

create replace procedure procedure_1
is
begin
    dbms_output.put_line('procedure_1.......');
end;

存儲過程案例二:帶參數的的存儲過程

create procedure procedure_2(v_i number,v_j number)
is
    v_m number(5);
begin
    dbms_output.put_line('procedure_2.......');
    v_m := v_i + v_j;
    dbms_output.put_line(v_i||' + '||v_j||' = '||v_m);
end;

存儲過程案例三:帶輸入、輸出參數的存儲過程

存儲過程的參數分為輸入參數和輸出參數,

輸入參數:輸入參數一般會在變量名和數據類型之間加in來表示該參數是輸入參數

輸出參數:輸出參數一般會在變量名和數據類型之間加out來表示該變量是輸出參數

不寫in和out的話,默認為輸入參數

create procedure procedure_3(v_i in number,v_j in number ,v_m out number)
is
begin
    dbms_output.put_line('procedure_3.......');
    v_m:=v_i - v_j;
    dbms_output.put_line(v_i||' - '||v_j||' = '||v_m);
end;

PL/SQL塊中調用存儲過程

下面以調用上面三個存儲過程為例

declare
    v_param1 number(5):=2;
    v_param2 number(5):=8;
    v_result number(5);
begin
    --調用上面案例一的存儲過程
    procedure_1(); 
    --調用上面案例二的存儲過程
    procedure_2(v_param1,v_param2); 
    --調用上面案例三的存儲過程
    procedure_3(v_param1,v_param2,v_result);
    dbms_output.put_line(v_result);
end;
/*執行結果:*/
procedure_1.......
procedure_2.......
2 + 8 = 10
procedure_3.......
2 - 8 = -6
10

java調用存儲過程

案例一:java調用沒有返回值的存儲過程

要求:編寫一個像數據庫emp表插入一條編號為6666,姓名為張三,職位為MANAGER的記錄

/*存儲過程*/
create procedure procedure_4(v_empno emp.empno%type,v_ename emp.ename%type,v_job emp.job%type )
is
begin
    insert into emp (empno,ename,job) values (v_empno,v_ename,v_job);
end;

//java調用存儲過程
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  //java調用存儲過程
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott", "tiger");
    cs=conn.prepareCall("{call procedure_4(?,?,?)}");
    //給輸入參數賦值
    cs.setInt(1, 6666);
    cs.setString(2, "張三");
    cs.setString(3, "MANAGER");
    cs.execute();//執行
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//關閉資源
  }  
}
//執行后就會向數據庫的emp表中插入一條編號為6666,姓名為張三,職位為MANAGER的記錄

案例二:java調用返回單列單行的存儲過程

要求:編寫一個根據員工編號查找員工姓名的存儲過程,并用java調用該存儲過程

/*存儲過程*/
create procedure procedure_5(v_empno in emp.empno%type,v_ename out emp.ename%type)
is
begin
    select ename into v_ename from emp where empno=v_empno;
end;

//java調用存儲過程
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");
    cs=conn.prepareCall("{call procedure_5(?,?)}");
    cs.setInt(1, 6666);//給輸入參數賦值
    /*指定輸出參數的數據類型
    語法:oracle.jdbc.OracleTypes.輸出參數的數據類型
    此例輸出參數的數據類型是varchar,所以是oracle.jdbc.OracleTypes.VARCHAR*/
    cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
    cs.execute();//執行
    //獲取輸出參數的值,位置要和輸出參數對應?的位置對應起來,該例輸出參數對應第2個問號,而且輸出參數的數據類型為字符型,所以是cs.getString(2)
    String a=cs.getString(2);
    System.out.println("員工姓名:"+a);
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//關閉資源
  }  
}
 
/*執行結果,控制臺打印:*/
結果:員工姓名:張三

案例三:java調用返回單行多列的存儲過程

要求:編寫一個根據員工編號查找員工姓名、職位和工資的存儲過程,并用java調用該存儲過程

/*存儲過程*/
create procedure procedure_6(v_empno in emp.empno%type,v_ename out emp.ename%type,v_job out emp.job%type,v_sal out emp.sal%type)
is
begin
    select ename,job,sal into v_ename,v_job,v_sal from emp where empno=v_empno;
end;

//java調用存儲過程
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");
    cs=conn.prepareCall("{call procedure_6(?,?,?,?)}");
    cs.setInt(1, 7788);
    //指定輸出參數的數據類型,注意:順序要對應起來
    cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
    cs.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);
    cs.registerOutParameter(4, oracle.jdbc.OracleTypes.DOUBLE);
    cs.execute();//執行
    //獲取返回值
    String ename=cs.getString(2);//獲取姓名
    String job=cs.getString(3);//獲取職位
    double sal=cs.getDouble(4);//獲取薪水
    System.out.println("員工編號為7788的姓名為:"+ename+" 職位是:"+job+" 薪水是:"+sal);
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//關閉資源
  }
}
/*執行結果,控制臺打印:*/
員工編號為7788的姓名為:SCOTT 職位是:ANALYST 薪水是:3000.0

案例四:java調用返回多行多列(返回列表)的存儲過程

要求:編寫一個根據部門編號查找部門所有員工信息的存儲過程,并用java調用該存儲過程

/*定義游標*/
create package my_package as
type emp_cursor is ref cursor;
end my_package;
/*存儲過程*/
create procedure procedure_7(v_deptno in emp.deptno%type,emp_cursor out my_package.emp_cursor)
is
begin
    open emp_cursor for select * from emp where deptno=v_deptno;
end;
//java調用存儲過程
public static void main(String[] args) {
  Connection conn=null;
  CallableStatement cs=null;
  ResultSet rs=null;
  try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");
    cs=conn.prepareCall("{call procedure_7(?,?)}");
    cs.setInt(1, 20);//給輸入參數賦值
    cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR );//指定輸出參數的數據類型
    cs.execute();
    rs=(ResultSet) cs.getObject(2);//獲取輸出參數的值
    while(rs.next()){
      //順序為數據庫中字段前后順序,例如數據庫emp表中第5列為hiredate,數據類型為Date,所以獲取第5列值時就應該用rs.getDate(5)
      System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getDate(5));
    }
  } catch (Exception e) {
    e.printStackTrace();
  }finally{
    closeResource(conn,cs,rs);//關閉資源
  }  
}

/*以下就是20號部門所有員工的信息,這里為方便我們只打印了編號、姓名和入職時間

運行結果,控制臺打印:*/

7369 SMITH 1980-12-17
7566 JONES 1981-04-02
7788 SCOTT 1987-04-19
7876 ADAMS 1987-05-23
7902 FORD 1981-12-03 

這是上面java調用存儲過程代碼中關閉資源方法的代碼

public static void closeResource(Connection conn,CallableStatement cs,ResultSet rs){
    if(rs!=null){
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if(cs!=null){
      try {
        cs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if(conn!=null){
      try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }

最后給個應用,分頁的存儲過程

分頁存儲過程:

/*定義游標*/
create package page_package as
type page_cursor is ref cursor;
end page_package;
/*存儲過程*/
create procedure pro_paging (
    v_page_size in number,--每頁顯示多少條
    v_page_count out number,--總頁數
    v_current_page in number,--當前頁
    v_total_count out number,--記錄總條數
    emp_cursor out page_package.page_cursor--返回查詢結果集的游標
    )
is
    v_begin number(5):=v_page_size*(v_current_page-1)+1;--查詢起始位置
    v_end number(5):=v_page_size*v_current_page;--查詢結束位置
    v_sql varchar2(1000):='select empno,ename from
       (select a.empno,a.ename,rownum rn from 
           (select empno,ename from emp) a 
       where rownum='|| v_end ||') b 
    where b.rn>='||v_begin;
    /*不能像下面這么寫,不然調用該存儲過程時會報類型不一致的錯,因為最里面查的只有empno,ename,因此外面也要和里面保持一致
    v_sql varchar2(1000):=\'select * from
       (select a.*,rownum rn from 
           (select empno,ename from emp) a 
       where rownum='|| v_end ||\') b 
    where b.rn>='||v_begin;*/
    v_ename varchar2(10);
    v_empno number(4);
begin
    open emp_cursor for v_sql;
    loop
     fetch emp_cursor into v_empno,v_ename;
     exit when emp_cursor%notfound;
     dbms_output.put_line(v_empno||' '||v_ename);
    end loop;
    v_sql:='select count(empno) from emp';
    execute immediate v_sql into v_total_count;
    if(mod(v_total_count,v_page_size)=0) then
       v_page_count:=v_total_count/v_page_size;
    else
       v_page_count:=trunc(v_total_count/v_page_size)+1;
    end if;
    dbms_output.put_line('共 '||v_total_count||' 條記錄');
    dbms_output.put_line('共 '||v_page_count||' 頁');
    dbms_output.put_line('當前頁: '||v_current_page);
    dbms_output.put_line('每頁顯示 '||v_page_size||' 條');
end;

Java調用的話和上面java調用存儲過程的例子一樣。這里為了方便 ,就直接在pl/sql中調用了

/*調用分頁存儲過程*/
declare
   v_page_count number(5);
   v_cursor page_package.page_cursor;
   v_total_count number(5);
begin
   dbms_output.put_line('第一頁數據。。。。。。。。。');
   pro_paging(5,--每頁顯示5條
   v_page_count,--總頁數
   1,--當前頁
   v_total_count,--記錄總條數
   v_cursor--游標
   );
   dbms_output.put_line('--------------------------');
   dbms_output.put_line('第二頁數據。。。。。。。。。');
   --顯示第二頁數據
   pro_paging(5,--每頁顯示5條
   v_page_count,--總頁數
   2,--當前頁
   v_total_count,--記錄總條數
   v_cursor--游標
   );
end;
/*運行結果:*/
第一頁數據。。。。。。。。。
6666 張三
20 empSu2
19 empSave2
7369 SMITH
7499 ALLEN
共 17 條記錄
共 4 頁
當前頁: 1
每頁顯示 5 條
--------------------------
第二頁數據。。。。。。。。。
7521 WARD
7566 JONES
7654 MARTIN
7698 BLAKE
7782 CLARK
共 17 條記錄
共 4 頁
當前頁: 2
每頁顯示 5 條

以上所述是小編給大家介紹的Oracle存儲過程及調用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

您可能感興趣的文章:
  • oracle 存儲過程、函數和觸發器用法實例詳解
  • windows中oracle存儲過程加密的實例代碼
  • Oracle帶輸入輸出參數存儲過程(包括sql分頁功能)
  • oracle中print_table存儲過程實例介紹
  • Mybatis調用Oracle存儲過程的方法圖文詳解
  • 詳解Oracle調試存儲過程
  • Oracle存儲過程和存儲函數創建方法(詳解)
  • Oracle存儲過程、包、方法使用總結(推薦)
  • Oracle生成單據編號存儲過程的實例代碼
  • Oracle數據庫創建存儲過程的示例詳解

標簽:紹興 中衛 遼源 昭通 百色 寧波 海東 自貢

巨人網絡通訊聲明:本文標題《Oracle存儲過程及調用》,本文關鍵詞  Oracle,存儲,過程,及,調用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Oracle存儲過程及調用》相關的同類信息!
  • 本頁收集關于Oracle存儲過程及調用的相關信息資訊供網民參考!
  • 推薦文章
    欧美激情在线精品video| 人人干人人插| 天天色成人网| 日韩一级精品视频在线观看| 午夜在线影院| 99色视频在线观看| 色综合久久手机在线| 天天做日日爱| 欧美a免费| 日本特黄特色aaa大片免费| 日韩免费在线观看视频| 国产视频一区二区在线观看| 日本在线www| 欧美激情一区二区三区在线| 青青久热| 久久成人性色生活片| 国产成人女人在线视频观看| 国产成人精品综合在线| 青青久热| 精品国产香蕉在线播出| 国产网站麻豆精品视频| 日本乱中文字幕系列| 国产91视频网| 可以免费看污视频的网站| 一a一级片| 成人免费观看网欧美片| 国产网站免费视频| 青草国产在线观看| 日韩欧美一二三区| 精品视频在线观看一区二区| 国产成人精品在线| 亚洲第一色在线| 99久久精品国产片| 国产伦精品一区二区三区无广告| 日本在线www| 毛片高清| 日韩男人天堂| 国产精品1024永久免费视频| 日韩中文字幕一区| 天天做日日干| 日本免费看视频| 91麻豆国产级在线| 日韩男人天堂| 一级毛片视频播放| 欧美a级片视频| 沈樵在线观看福利| 国产麻豆精品免费视频| 国产高清在线精品一区二区| 久久精品大片| 午夜在线影院| 91麻豆精品国产自产在线观看一区 | 日本免费区| 国产极品精频在线观看| 日本特黄特色aaa大片免费| 91麻豆国产级在线| 精品在线免费播放| 久久福利影视| 国产视频一区二区在线观看| 91麻豆精品国产自产在线观看一区 | 天天做日日干| 精品久久久久久综合网| 中文字幕一区二区三区精彩视频| 日韩av东京社区男人的天堂| a级黄色毛片免费播放视频| 毛片高清| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本伦理片网站| 亚欧成人毛片一区二区三区四区| 国产高清视频免费| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 99久久精品国产片| 亚洲第一色在线| 你懂的日韩| 久草免费资源| 成人免费一级毛片在线播放视频| 国产91精品一区| 亚洲精品影院久久久久久| 亚洲爆爽| 日韩字幕在线| 九九精品久久久久久久久| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产欧美精品| 一级毛片视频在线观看| 国产91素人搭讪系列天堂| 超级乱淫黄漫画免费| 九九精品在线播放| 日本免费看视频| 欧美激情一区二区三区在线| 欧美电影免费看大全| 午夜在线亚洲| 九九精品在线播放| 精品视频一区二区| 欧美激情一区二区三区视频| 99色精品| 日韩中文字幕一区| 日韩欧美一二三区| 午夜激情视频在线播放| 国产一区免费观看| 国产麻豆精品| 91麻豆国产级在线| 日韩在线观看视频黄| 国产一区二区精品久| 欧美电影免费看大全| 欧美激情一区二区三区在线| 天天做人人爱夜夜爽2020| 四虎影视久久久免费| 久久国产精品自由自在| 色综合久久天天综线观看| 久久国产精品只做精品| 国产成人精品在线| 日韩avdvd| 青青青草影院| 精品视频在线观看一区二区| 日韩av东京社区男人的天堂| 一级女性大黄生活片免费| 999精品在线| 国产成a人片在线观看视频| 久久久久久久男人的天堂| 午夜久久网| 欧美爱爱动态| 久草免费资源| 日韩专区一区| 精品视频一区二区| 日韩一级精品视频在线观看| 国产激情一区二区三区| 久久福利影视| 精品视频免费看| 久草免费资源| 国产伦精品一区三区视频| 精品国产香蕉在线播出| 午夜欧美福利| 精品视频在线观看一区二区| 国产伦精品一区三区视频| 国产综合成人观看在线| 麻豆系列 在线视频| 久久精品大片| 四虎影视精品永久免费网站| 日本特黄特色aaa大片免费| 日韩中文字幕在线亚洲一区| 国产一区二区精品尤物| 久久精品大片| 国产不卡福利| 国产精品自拍一区| 欧美国产日韩在线| 日韩免费在线观看视频| 日韩字幕在线| 免费国产在线观看| 九九热国产视频| 日韩在线观看免费| 国产一区二区精品久| 成人高清视频在线观看| 欧美激情在线精品video| 91麻豆精品国产自产在线| 欧美国产日韩精品| 国产高清在线精品一区二区| 欧美激情一区二区三区在线| 999久久狠狠免费精品| 高清一级做a爱过程不卡视频| 国产网站在线| 国产高清在线精品一区二区| 久久久久久久男人的天堂| 亚洲精品永久一区| 国产成人精品综合在线| 天天做日日干| 欧美激情一区二区三区在线| 免费国产在线观看| 九九精品久久久久久久久| 97视频免费在线| 黄视频网站免费看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产精品123| 国产不卡福利| 精品国产亚洲人成在线| 青青久热| 久久国产一久久高清| 欧美a级片视频| 国产不卡在线播放| 一本高清在线| 欧美激情一区二区三区中文字幕| 日韩中文字幕在线亚洲一区| 日韩一级精品视频在线观看| 色综合久久天天综合观看| 国产一区二区福利久久| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 青青久久精品| 欧美爱爱动态| 亚洲 欧美 91| 精品久久久久久影院免费| 四虎影视久久久免费| 亚洲精品影院久久久久久| 国产原创视频在线| 青草国产在线观看| 韩国三级香港三级日本三级la| 99色精品| 午夜在线影院| 黄色免费网站在线| 青草国产在线观看| 夜夜操网| 一a一级片| 欧美a级片视频|