語法
塊定義語法
--定義部分--定義常量、變量、複雜數據類型、遊標
BEGIN
--執行部分--PL/SQL語句和SQL語句
EXCEPTION
--異常處理部分——處理運行錯誤 異常中可以插入邏輯代碼
END;
注:PL/SQL中結束輸入使用‘/’字符
dbms_output是oracle提供的系統包;put_line是該包中的過程,用於輸出字符串信息。當使用dbms_output包時必須要先激活服務器輸出
dbms_output.put_line(“輸出的字符串內容”);
激活服務器輸出語句: set serveroutput on(默認是關閉的)
DECLARE
str varchar(5) --變量的定義
BEGIN
Select name INTO str FROM emp --INTO是將name的值賦值給str
where empno=$no; --$no是替代變量
EXCEPTION
When NO_DATA_FOUND then --PL/SQL預定義的異常類型
dbms_output.put_line(“輸出的字符串內容”);
END;
變量定義語法
--CONSTANT表示常量;
--:=設置默認值
%TYPE屬性
示例:
Name emp.ename%TYPE --name與emp表中ename列的類型和長度相同
Sex Name%TYPE --sex與name類型和長度相同
%ROWTYPE屬性
語法:
變量名 表名%ROWTYPE
示例:
Str T1%ROWTYPE
--str變量對應T1表中所有列,並且該表中的所有列的類型與長度相同
PL/SQL中使用的操作符
:= --賦值操作符
=> --關聯操作符
|| --連接操作符
PL/SQL遊標
遊標定義語法:
CURSOR 遊標名 IS SQL語句
遊標名%ISOPEN 判斷遊標是否已經打開
遊標名%FOUND SQL語句有作用行市,其屬性值爲TRUE;
遊標名%NOTFOUND SQL語句沒有作用行市,其屬性值爲TRUE;
遊標名%ROWCOUNT 返回SQL語句所作用的總行數
注:遊標名默認爲‘SQL’
PL/SQL控制語句
IF 條件 THEN 執行操作
ELSEIF 條件THEN 執行操作
ELSE 執行操作
END IF;
2、多重分支語句
CASE 表達式
WHEN 要判斷的值 THEN 執行操作
WHEN 要判斷的值 THEN 執行操作
ELSE 執行操作
END CASE;
3、循環語句一
WHILE 條件 LOOP
執行操作···
END LOOP;
4、循環語句二
FOR 變量 IN [REVERSE] 起點值 ..終點值 LOOP
執行操作
END LOOP;
注:REVERSE表示由終點值到起點值循環; ..是固定格式;
過程
調用過程有兩種方法: exec call
exec是sqlplus的命令,只能在sqlplus中使用。call是sql命令,任何工具都可以使用。
create procedure sp_pro3(spName varchar2, newSal number) is
--不要寫成number(3,2),表明類型就可以了,不需要大小。就好像Java寫方法時的參數一樣
begin
--執行部分,根據用戶名去修改工資
update emp set sal=newSal where ename=spName;
end;
/
begin
--執行部分,根據用戶名去修改工資
update emp set sal=newSal where ename=spName;
end;
說明:參數列表裏的IN表示向存儲過程傳遞參數,OUT表示從存儲過程返回參數。而IN OUT 表示傳遞參數和返回參數;在聲明變量的時候,IN變量不可以賦常量,OUT可以賦常量,不可以賦變量.
//演示java程序去調用oracle的存儲過程案例
Java代碼
import java.sql.*;
public class TestOraclePro{
public static void main(String[] args){
try{
//1.加載驅動
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到連接
Connection ct = DriverManager.getConnection("jdbc:oracle:[email protected]:1521:MYORA1","scott","m123");
//3.創建CallableStatement
CallableStatement cs = ct.prepareCall("{call sp_pro3(?,?)}");
//4.給?賦值
cs.setString(1,"SMITH");
cs.setInt(2,10);
//5.執行
cs.execute();
//關閉
cs.close();
ct.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
函數
--輸入僱員的姓名,返回該僱員的年薪
create function annual_incomec(name varchar2)
return number is
annual_salazy number(7,2);
begin
--執行部分
select sal*12+nvl(comm, 0) into annual_salazy from emp where ename=name;
return annual_salazy;
end;
如果函數創建過程有編譯錯誤,可以使用show error;命令顯示錯誤.
2.函數和過程的主要區別不在於返回值,而在於他們的調用方式。函數可以在查詢語句中直接調用,而存儲過程必須單獨調用.
函數一般情況下是用來計算並返回一個計算結果而存儲過程一般是用來完成特定的數據操作(比如修改、插入數據庫表或執行某些DDL語句等等)
包
create [or replace] package 程序包名
is | as
procedure 過程名(過程參數列表);
function 函數名(函數參數列表);
……
end 程序包名;
2、 包體創建語法
create [or replace] package body 程序包名
is | as
之前定義的函數、過程的具體實現部分
end 程序包名;
3、包的調用