亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle存儲過程及調用

2024-08-29 14:00:13
字體:
來源:轉載
供稿:網友

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_1isbegin    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)isbegin    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 = 10procedure_3.......2 - 8 = -610

java調用存儲過程

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

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

/*存儲過程*/create procedure procedure_4(v_empno emp.empno%type,v_ename emp.ename%type,v_job emp.job%type )isbegin    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)isbegin    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)isbegin    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 astype 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)isbegin    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-177566 JONES 1981-04-027788 SCOTT 1987-04-197876 ADAMS 1987-05-237902 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 astype 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 empSu219 empSave27369 SMITH7499 ALLEN共 17 條記錄共 4 頁當前頁: 1每頁顯示 5 條--------------------------第二頁數據。。。。。。。。。7521 WARD7566 JONES7654 MARTIN7698 BLAKE7782 CLARK共 17 條記錄共 4 頁當前頁: 2每頁顯示 5 條

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


注:相關教程知識閱讀請移步到oracle教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲无亚洲人成网站77777| 91tv亚洲精品香蕉国产一区7ujn| 亚洲成人精品久久| 欧美日韩国产丝袜另类| 国产一区二区三区三区在线观看| 国产精品一区二区性色av| 91欧美精品午夜性色福利在线| 亚洲成在人线av| 亚洲国产日韩欧美在线99| 日韩美女在线看| 最近2019免费中文字幕视频三| 美女撒尿一区二区三区| 亚洲一区二区三区视频| 亚洲欧美中文日韩在线v日本| 久久99国产综合精品女同| 色综合伊人色综合网站| 成人免费淫片视频软件| 亚洲女人天堂成人av在线| 成人国产精品久久久| 久操成人在线视频| 国产精品久久久久7777婷婷| 久久91亚洲人成电影网站| 国产一区二区三区毛片| 欧美大片在线免费观看| 日韩精品999| 久久久久在线观看| 成人黄色av网站| 一区二区三欧美| 色综久久综合桃花网| 久久久99久久精品女同性| 亚洲欧美中文字幕在线一区| 欧美精品国产精品日韩精品| 国产婷婷色综合av蜜臀av| 欧美成人激情在线| 国产91成人video| 国产成人高潮免费观看精品| 亚洲精品在线不卡| 91欧美日韩一区| 欧美寡妇偷汉性猛交| 国产精品视频xxx| 欧美日韩亚洲91| 日韩欧美中文第一页| 国产精品综合网站| 不卡av电影院| 欧美资源在线观看| 92看片淫黄大片看国产片| 欧美高清性猛交| 欧美一级淫片丝袜脚交| www.xxxx欧美| 日韩欧美国产黄色| 国产精品免费一区二区三区都可以| 亚洲天堂免费观看| 亚洲美女又黄又爽在线观看| 91精品国产高清| www.午夜精品| 成人av在线网址| 91av在线网站| 欧美大片免费观看| 欧美日韩国产中文精品字幕自在自线| 久久久久久亚洲精品| 欧美一区二区三区四区在线| 欧美区二区三区| 91日韩在线播放| 日本精品中文字幕| 亚洲国产精品福利| 国产欧美婷婷中文| 社区色欧美激情 | 国产精品自拍小视频| 欧美另类暴力丝袜| 97久久精品人人澡人人爽缅北| 日韩亚洲在线观看| 97色在线观看| 中文国产成人精品久久一| 日韩中文字在线| 精品久久久久久电影| 欧美在线视频免费播放| 国产三级精品网站| 91精品国产91久久久久福利| 久久久久久久久久国产精品| 国产成人高清激情视频在线观看| 一本一本久久a久久精品牛牛影视| 久久99精品久久久久久噜噜| 91在线直播亚洲| 91久久精品日日躁夜夜躁国产| 亚洲国产精品嫩草影院久久| www.欧美三级电影.com| 欧美成人午夜免费视在线看片| 91久久精品国产91久久性色| 国产精品久久久久久超碰| 亚洲欧美国产精品va在线观看| 91sao在线观看国产| 国产中文欧美精品| 亚洲一品av免费观看| 欧美日韩第一视频| 国产综合久久久久| 91精品视频免费看| 日韩精品视频三区| 浅井舞香一区二区| 亚洲国产91精品在线观看| 日韩视频在线一区| 91精品综合久久久久久五月天| 亚洲资源在线看| 中文字幕在线亚洲| 18一19gay欧美视频网站| 色妞一区二区三区| 欧美韩日一区二区| 91久热免费在线视频| 中文字幕日韩在线播放| 在线视频精品一| 91精品视频免费观看| 欧美成人免费全部观看天天性色| 亚洲精品日产aⅴ| 91精品免费看| 亚洲人av在线影院| 国产精品一区二区三| 亚洲free性xxxx护士hd| 一区二区三区四区精品| 成人免费黄色网| 亚洲成人免费在线视频| 欧美精品在线免费| 欧美激情videoshd| 国产热re99久久6国产精品| 日韩国产欧美精品在线| www.亚洲成人| 国产va免费精品高清在线| 国产精品99久久久久久久久久久久| 日韩av在线免费播放| 国产日韩欧美在线视频观看| 韩国精品美女www爽爽爽视频| 色偷偷偷亚洲综合网另类| 国产主播精品在线| 亚洲第一区第二区| 久久久精品国产一区二区| 国内精品久久久久久久| 按摩亚洲人久久| 国产精品女视频| 久久色免费在线视频| 国产精品一区二区三区成人| 欧美区在线播放| 欧美视频国产精品| 97精品一区二区三区| 欧美成人激情图片网| 亚洲自拍偷拍区| 97精品一区二区视频在线观看| 欧美精品激情在线观看| 成人国产精品av| 久久精品一偷一偷国产| 国产精品久久久久999| 一本色道久久88亚洲综合88| 亚洲视频电影图片偷拍一区| 亚洲视频综合网| 欧洲精品在线视频| 亚洲人成在线观看网站高清| 国产色综合天天综合网| 亚洲人精品午夜在线观看| 136fldh精品导航福利| 久久精品国产亚洲7777| 国产在线视频91| 青草成人免费视频| 精品国产欧美成人夜夜嗨| 日韩在线视频网站| 国产精品男人爽免费视频1| 成人h视频在线观看播放| 久久视频这里只有精品|