存儲過程與存儲函數(shù)

根據(jù)慕課網(wǎng)課程Oracle存儲過程和自定義函數(shù)整理

1.概念

(1)定義:存儲在數(shù)據(jù)庫中供所有用戶程序調(diào)用的子程序
(2)相同點(diǎn):完成特定功能
(3)區(qū)別:存儲函數(shù)可以return一個值
(4)使用場景:

  • 當(dāng)沒有返回值時用存儲過程
  • 需要一個返回值時用存儲函數(shù)
  • 需要多個返回值時用存儲過程(多個out參數(shù))

2(1).存儲過程(示例1:打印helloworld)(無參)

create or replace procedure sayHelloworld
as
declare
begin
    dbms_oupput.put_line("Hello World");
end
/

2(2).存儲過程(示例2:給一個員工號,給他漲薪水)(帶參數(shù))

create or replace procedure raisesalary(eno in number)
as
psal emp.sal%type;
begin
    select sal into psal from emp where empno = eno;
    update emp.sal set sal = sal + 100 where empno = eno;
    dbms_oupput_put_line(psal||(pasl + 100));
--不用commit 由調(diào)用這個過程的程序來commit
end;

/

3.調(diào)用存儲過程方式

(1) exec sayHelloworld() (命令行)
(2)其他處處過程過程或PL/SQL語句中調(diào)。

begin
  sayHelloworld();
    sayHelloworld();
end

4.調(diào)試存儲過程

(1)右擊存儲過程 --> 調(diào)試 --> 紅色調(diào)試按鈕 --> 會生成調(diào)用程序
(2)用sys登陸給scott用戶授權(quán)

grant debug connect session, debug any procedure to scott;

5.存儲函數(shù)

  • 必須有返回值

  • 示例:給定一個員工號,返回他的年薪(月薪乘12加獎金)

    create or replace function querysal(eno in number)
    return number (返回值類型)
    as
    psal emp.sal%type;
    pcomm emp.comm%type;
    begin
    select sal, comm into psal, pcomm from emp where empno = eno;
    return psal * 12 + pcomm;
    end;
    

6.需要返回多個值時用存儲過程

create or replace procedure quarya(eno in number,
                              pname out varchar2,
                              psal out number,
                              pjob out varchar2)
as
begin
select ename, sal, empjob into pname, psal, pjob from emp where     empno = eno;
end;

7.java調(diào)用存儲過程核心代碼

  • //這個存儲過程第一個參數(shù)用于接受員工號,后三個用于存返回的結(jié)果

  • //quarya(eno in number, pname out varchar2, psal out number, pjob out varchar2)

    String sql = "{call quarya(?,?,?,?)}";
    Connection connection = null;
    CallableStatement statement = null;
    connection = JDBCUtils.getConn();
    statement = connection.prepareCall(sql);
    
    statement.setInt(1, 7839); 
    statement.registerOutParameter(2, OracleTypes.VARCHAR);
    statement.registerOutParameter(3, OracleTypes.NUMBER);
    statement.registerOutParameter(4, OracleTypes.VARCHAR);
    
    statement.execute();
    
    String name = statement.getString(2);
    String job = statement.getString(4);
    double sal = statement.getDouble(3);
    
    System.out.println(name);
    System.out.println(job);
    System.out.println(sal);
    

8.java調(diào)用存儲函數(shù)核心代碼

  • //傳入員工號

  • //querysal(eno in number)

  • //return number

    String sql = "{?= call querysal(?)";
    Connection connection = null;
    CallableStatement statement = null;
    connection = JDBCUtils.getConn();
    statement = connection.prepareCall(sql);
    
    statement.registerOutParameter(1, OracleTypes.NUMBER);
    statement.setInt(2, 7839);
    
    statement.execute();
    
    double salary = statement.getDouble(1);
    System.out.print(salary);
    

9.包(包住了存儲過程)

(1)包頭

 create or replace package mypackage as
    type empcursor is ref cursor;(定義一種類型)
    procedure queryEmpList(dno in number, empList out empcursor)
end mypackage;

(2)包體

  create or replace package body mypackage as
    procedure queryEmpList(dno in number, empList out empcursor)
    begin
        open empList for select * from emp where deptno = dno;
    end queryEmpList;
  end mypackage;

10.java調(diào)用包中的存儲過程核心代碼

 Connection connection = null;
CallableStatement statement = null;
ResultSet resultSet = null;

String sql = "{call mypackage.queryEmpList(?, ?)";

connection = JDBCUtils.getConn();
statement = connection.prepareCall(sql);

statement.setInt(1, 20);
statement.registerOutParameter(2, OracleTypes.CURSOR);

statement.execute();

resultSet = ((OracleCallableStatement)statement).getCursor(2);
while(resultSet.next())
{
    int empno = resultSet.getInt("empno");
    String empname = resultSet.getString("ename");
    System.out.println(empno + "\t" + empname);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一. 存儲過程和存儲函數(shù)的定義 定義:存儲在數(shù)據(jù)庫中,供所有用戶程序調(diào)用的子程序叫做存儲過程/存儲函數(shù)。復(fù)雜點(diǎn)的解...
    GuangHui閱讀 10,556評論 0 22
  • 1.簡介 數(shù)據(jù)存儲有哪些方式?電子表格,紙質(zhì)文件,數(shù)據(jù)庫。 那么究竟什么是關(guān)系型數(shù)據(jù)庫? 目前對數(shù)據(jù)庫的分類主要是...
    喬震閱讀 1,776評論 0 2
  • 1.PLSQL入門 Oracle數(shù)據(jù)庫對SQL進(jìn)行了擴(kuò)展,然后加入了一些編程語言的特點(diǎn),可以對SQL的執(zhí)行過程進(jìn)行...
    隨手點(diǎn)燈閱讀 608評論 0 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 韓玫父母家地方不夠睡,又有老媽搭把手,所以放了阿姨幾天帶薪假。阿姨眉開眼笑地連聲道謝,隨后就電話小姐妹相約出去玩了...
    猜不中的尾聲閱讀 591評論 11 5