oracle12 pl/sql
生活随笔
收集整理的這篇文章主要介紹了
oracle12 pl/sql
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
pl/sql塊介紹 介紹 塊(block)是pl/sql的基本程序單元,編寫pl/sql程序實際上就是編寫pl/sql塊,要完成相對簡單的應用功能,可能只需要編寫一個pl/sql塊,但是如果想要實現復雜的功能,可能需要在一個pl/sql塊中嵌套其它的pl/sql塊。 塊結構示意圖
pl/sql塊由三個部分構成:定義部分,執行部分,例外處理部分。
如下所示:
declare
/*定義部分——定義常量、變量、游標、例外、復雜數據類型*/ begin /*執行部分——要執行的pl/sql語句和sql語句*/ exception /*例外處理部分——處理運行的各種錯誤*/ end; 定義部分是從declare開始的,該部分是可選的; 執行部分是從begin開始的,該部分是必須的; 例外處理部分是從exception開始的,該部分是可選的。 可以和java編程結構做一個簡單的比較。 pl/sql塊的實例(1) 實例1-只包括執行部分的pl/sql塊
Sql代碼
1.set?serveroutput?on?--打開輸出選項 ?? 2.begin? ?? 3.????dbms_output.put_line('hello'); ?? 4.end;?? 相關說明: dbms_output是oracle所提供的包(類似java的開發包,put_line是函數),該包包含一些過程,put_line就是dbms_output包的一個過程(包下面就是函數或者過程了)。 pl/sql塊的實例(2) 實例2-包含定義部分和執行部分的pl/sql塊 Sql代碼 1.declare?? 2.????v_ename?varchar2(5);?--定義字符串變量 ?? 3.begin?? 4.????select?ename?into?v_ename?from?emp?where?empno=&aa; ?? 5.????dbms_output.put_line('雇員名:'||v_ename); ?? 6.end; ?? 7./?? ? 如果要把薪水也顯示出來,那么執行部分就應該這么寫:
Sql代碼
declare??
v_ename?varchar2(5);
v_sal number(7,2) select?ename,sal?into?v_ename,v_sal?from?emp?where?empno=&aa; 相關說明: & 表示要接收從控制臺輸入的變量。看圖: pl/sql塊的實例(3) 實例3-包含定義部分,執行部分和例外處理部分 為了避免pl/sql程序的運行錯誤,提高pl/sql的健壯性,應該對可能的錯誤進行處理,這個很有必要。
1.比如在實例2中,如果輸入了不存在的雇員號,應當做例外處理。 2.有時出現異常,希望用另外的邏輯處理,[網示] 我們看看如何完成1的要求。 相關說明: oracle事先預定義了一些例外,no_data_found就是找不到數據的例外。 Sql代碼 1.declare?? 2.????--定義變量 ?? 3.????v_ename?varchar2(5); ?? 4.????v_sal??number(7,2); ?? 5.begin?? 6.????--執行部分 ?? 7.????select?ename,sal?into?v_ename,v_sal?from?emp?where?empno=&aa; ?? 8.????--在控制臺顯示用戶名 ?? 9.dbms_output.put_line('用戶名是:'||v_ename||'?工資:'||v_sal); ?? 10.????--異常處理 ?? 11.exception ?? 12.when?no_data_found?then?? 13.????dbms_output.put_line('朋友,你的編號輸入有誤!'); ?? 14.end; ?? 15./?? 十七:pl/sql分類 -- 過程,函數,包,觸發器
過程
過程用于執行特定的操作,當建立過程時,既可以指定輸入參數(in),也可以指定輸出參數(out), 通過在過程中使用輸入參數,可以將數據傳遞到執行部分;通過使用輸出參數,可以將執行部分的數據傳遞到應用環境(java程序)。在sqlplus中可以使用create procedure命令來建立過程。
實例如下:
1.請考慮編寫一個過程,可以輸入雇員名,新工資,可修改雇員的工資 2.如何調用過程有兩種方法; exec? call 3.如何在java程序中調用一個存儲過程 問題:如何使用過程返回值? 特別說明: 對于過程我們會在以后給大家詳細具體的介紹,現在請大家先有一個概念。 1.編寫一個過程: create procedure sp_pro3(spName varchar2, newSal number) is --不要寫成number(3,2),表明類型就可以了,不需要大小。就好像Java寫方法時的參數一樣 Sql代碼 1.begin?? 2.??--執行部分,根據用戶名去修改工資 ?? 3.update?emp?set?sal=newSal?where?ename=spName; ?? 4.end; ?? 5./?? 2.調用過程:exec sp_pro3(‘scoot’4678); 3.java程序中調用一個存儲過程
//演示java程序去調用oracle的存儲過程案例
Java代碼
1.import?java.sql.*; ?? 2.public?class?TestOraclePro{ ?? 3.????public?static?void?main(String[]?args){ ??5.????????try{ ?? 6.????????????//1.加載驅動 ?? 7.????????????Class.forName("oracle.jdbc.driver.OracleDriver"); ?? 8.????????????//2.得到連接 ?? 9.????????????Connection?ct?=?DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123"); ??11.????????????//3.創建CallableStatement ?? 12.????????????CallableStatement?cs?=?ct.prepareCall("{call?sp_pro3(?,?)}"); ?? 13.????????????//4.給?賦值 ?? 14.????????????cs.setString(1,"SMITH"); ?? 15.????????????cs.setInt(2,10); ?? 16.????????????//5.執行 ?? 17.????????????cs.execute(); ?? 18.????????????//關閉 ?? 19.????????????cs.close(); ?? 20.????????????ct.close(); ?? 21.????????}?catch(Exception?e){ ?? 22.????????????e.printStackTrace(); ?? 23.????????} ?? 24.????} ?? }? 函數 函數和存儲過程差不多,但是函數只能返回一個值,函數用于返回特定的數據,當建立函數時,在函數頭部必須包含return子句。而在函數體內必須包含return語句返回的數據。我們可以使用create function來建立函數,實際案例:
Sql代碼
1.--輸入雇員的姓名,返回該雇員的年薪 ??
2.create?function?annual_incomec(name?varchar2) ??
3.return?number?is?? 4.annual_salazy?number(7,2); ?? 5.begin?? 6.????--執行部分 ?? 7.????select?sal*12+nvl(comm,?0)?into?annual_salazy?from?emp?where?ename=name; ?? 8.????return?annual_salazy; ?? 9.end; ?? 10./?? 如果函數創建過程有編譯錯誤,可以使用show error;命令顯示錯誤 在sqlplus中調用函數 Sql代碼 1.SQL>?var?income?number ?? 2.SQL>?call?annual_incomec('scott')?into:?income; ?? 3.SQL>?print?income??
同樣我們可以在java程序中調用該函數 select annual_income('SCOTT') from dual; 這樣可以通過rs.getInt(l)得到返回的結果。 包用于在邏輯上組合過程和函數,它由包規范和包體兩部分組成。 1.我們可以使用create package命令來創建包。 實例: --創建一個包sp_package --聲明該包有一個過程update_sal --聲明該包有一個函數annual_income Sql代碼 1.create?package?sp_package?is(包里面是過程的聲明和函數的聲明) 2.??procedure?update_sal(name?varchar2,?newsal?number); ?? 3.??function?annual_income(name?varchar2)?return?number; ?? 4.end;?? 包的規范只包含了過程和函數的說明,但是沒有過程和函數的實現代碼。包體用于實現包規范中的過程和函數。 2.建立包體可以使用create package body命令 --給包sp_package實現包體 Sql代碼 1.create?or?replace?package?body?sp_package?is?? 2.??procedure?update_sal(name?varchar2,?newsal?number)? ?? 3.??is?? 4.??begin? ?? 5.????update?emp?set?sal?=?newsal?where?ename?=?name; ?? 6.??end; ?? 7.??function?annual_income(name?varchar2)?return?number?is?? 8.????annual_salary?number; ?? 9.??begin?? 10.????select?sal?*?12?+?nvl(comm,?0)?into?annual_salary?from?emp ?? 11.?????where?ename?=?name; ?? 12.????return?annual_salary; ?? 13.??end; ?? 14.end; ?? 15./?? 3.如何調用包的過程或是函數 當調用包的過程或是函數時,在過程和函數前需要帶有包名,如果要訪問其它方案的包,還需要在包名前加方案名。 如: SQL> call sp_package.update_sal('SCOTT', 1500); 特別說明: 包是pl/sql中非常重要的部分,我們在使用過程分頁時,將會再次體驗它的威力呵呵。
同樣我們可以在java程序中調用該函數 select annual_income('SCOTT') from dual; 這樣可以通過rs.getInt(l)得到返回的結果。 包用于在邏輯上組合過程和函數,它由包規范和包體兩部分組成。 1.我們可以使用create package命令來創建包。 實例: --創建一個包sp_package --聲明該包有一個過程update_sal --聲明該包有一個函數annual_income Sql代碼 1.create?package?sp_package?is(包里面是過程的聲明和函數的聲明) 2.??procedure?update_sal(name?varchar2,?newsal?number); ?? 3.??function?annual_income(name?varchar2)?return?number; ?? 4.end;?? 包的規范只包含了過程和函數的說明,但是沒有過程和函數的實現代碼。包體用于實現包規范中的過程和函數。 2.建立包體可以使用create package body命令 --給包sp_package實現包體 Sql代碼 1.create?or?replace?package?body?sp_package?is?? 2.??procedure?update_sal(name?varchar2,?newsal?number)? ?? 3.??is?? 4.??begin? ?? 5.????update?emp?set?sal?=?newsal?where?ename?=?name; ?? 6.??end; ?? 7.??function?annual_income(name?varchar2)?return?number?is?? 8.????annual_salary?number; ?? 9.??begin?? 10.????select?sal?*?12?+?nvl(comm,?0)?into?annual_salary?from?emp ?? 11.?????where?ename?=?name; ?? 12.????return?annual_salary; ?? 13.??end; ?? 14.end; ?? 15./?? 3.如何調用包的過程或是函數 當調用包的過程或是函數時,在過程和函數前需要帶有包名,如果要訪問其它方案的包,還需要在包名前加方案名。 如: SQL> call sp_package.update_sal('SCOTT', 1500); 特別說明: 包是pl/sql中非常重要的部分,我們在使用過程分頁時,將會再次體驗它的威力呵呵。
轉載于:https://www.cnblogs.com/wanghuaijun/p/8244607.html
總結
以上是生活随笔為你收集整理的oracle12 pl/sql的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨时钟域电路设计——多bit信号FIFO
- 下一篇: imx8qm HDMI-TX调试