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