PLSQL程式語言

h294590501發表於2018-08-17

PL/SQL程式語言

PL/SQL(Procedure Language/SQLPL : P 過程化   L 語言
SQL:結構化查詢語言

PLSQL 是 Oracle 對 sql 語言的過程化擴充套件,
指在 SQL 命令語言中增加了過程處理語句(如分支、迴圈等),
使 SQL 語言具有過程處理能力。

把 SQL 語言的資料操縱能力與過程語言的資料處理能力結合起來,
使得 PLSQL 程式導向但比過程語言簡單、高效、靈活和實用。
[declare]
   --宣告變數
begin
   -- 程式體
[exception]
   --例外;異常
end;
--declare和exception部分可以沒有,但是begin部分和end必須要有。
--定義變數
declare
   --變數的賦值
   --方式一:使用:=進行賦值;
   --普通的變數
   i number(10) := 1; 
begin
   --輸出i的值到控制檯中
   dbms_output.put_line('i的值:'||i);
   -- 對i加1 輸出
   i := i+1;
   dbms_output.put_line('i+1的值:'||i);
end;
--定義變數
declare
   --記錄型變數:行型別
   pemp emp%rowtype;   

begin
   --給行型別的變數賦值: 使用關鍵字  into
   --方式二:使用select..into子句進行賦值;
   select * into pemp  from emp where empno=7369;
   --輸出行型別變數到控制檯中
   dbms_output.put_line(pemp.ename||'============='||pemp.job);

end;

--使用select...into子句進行賦值時,變數的資料型別要與表中欄位的資料型別一致.
--變數的特殊型別:
--%rowtype:指定該變數與某個表的結構相同。
--該型別的變數可以用來儲存表的一行資料;
--定義變數
declare
   --引用型變數:引用某張表的某列的型別
   pname emp.ename%type;
   --pname varchar2(1); --普通
begin
   --賦值:給引用型變數賦值
   select ename into pname from emp where empno=7788;
   --輸出
   dbms_output.put_line(pname);
end;

--變數的特殊型別:
--%type:指定該變數的型別與表的某列的資料型別相同;

運算子

--   := 賦值運算子
--普通的變數
i number(10) := 1; 


--   .. 範圍運算子

--我插入100萬條資料到person表
create table person(
       id number(10) primary key,
       name varchar2(200),
       gender number(1) default 1
);

--plsql去插入一百萬條資料到person表中
--介紹oracle的uuid的方法
select sys_guid() from dual;

--建立序列
create sequence seq_test;

--新增100W條記錄 
declare
   pname varchar2(200);
begin
  for i in 1..1000000 loop
    select sys_guid() into pname from dual;
    insert into person values(seq_test.nextval,pname,1);
  end loop;
  commit;
end;

流程控制

if 條件 then
    ….
elsif 條件2 then
    …
…
elseend if;
--在控制檯輸入1,在控制檯列印:我是一
declare
     --定義變數
     i number(10) := &val;
begin
     if i=1 then
       dbms_output.put_line('我是一');
     end if;
end;


declare
     --定義變數
     i number(10) := &val;
begin
     if i=1 then
       dbms_output.put_line('我是1');

     elsif i > 1 and i<10 then
      dbms_output.put_line('我大於1小於10');

     else 
      dbms_output.put_line('我是'||i);
     end if;
end;
while迴圈:
        while 條件  loop
           --迴圈體
        end loop;

loop迴圈:
        loop
            exit when 退出條件;
              --迴圈體
        end loop;

for迴圈:
        for 變數 in [reverse] 開始值..結束值
        loop
            --迴圈體
        end loop;
--&val 即為控制檯輸入
--求1到&val的和
declare   
     i number(10) :=1;
     val number(10):=&val;
     sums number(10):=0;

begin
  while i<=val loop
  sums:= sums+i;
  i :=i+1;
  end loop;

  dbms_output.put_line(sums);

end;



declare
  i number(10):=1;
  val number(10):=&val;
  sums number(10):=0;
begin
 loop 
   exit when i>val;
   sums:=sums+i;
   i:=i+1;
   end loop; 
   dbms_output.put_line(sums);
end;

declare
  val number(10):=&val;
  sums number(10):=0;
begin
  for i in 1..val loop
    sums:=sums+i;
    end loop;
   dbms_output.put_line(sums);

end;

異常

Oracle異常分為兩種:自帶異常、自定義異常。
--捕獲異常的命令格式:
exception
    when 異常名1 thenwhen 異常名2 then
        …
    …
    when others then
        …

系統定義異常
no_data_found (沒有找到資料)
too_many_rows (select …into 語句匹配多個行)
zero_divide ( 被零除)
value_error (算術或轉換錯誤)
timeout_on_resource (在等待資源時發生超時)
declare 
   i number(10);
   --行型別
   pemp emp%rowtype;
begin
   --給i賦值
   --i := 1/0;
   --i := 'abc';

   --模擬異常:找多條資料給行型別賦值會出現異常
   select * into pemp from emp;


exception
   when zero_divide then
      dbms_output.put_line('分母不能為零');
   when value_error then
      dbms_output.put_line('型別轉換異常');
   when too_many_rows then
      dbms_output.put_line('期望一條資料,但是返回多條');
   when others then
      dbms_output.put_line('親,有異常要處理');
end;

自定義異常

語法格式:
異常名 exception;

丟擲異常的方式:
方式一:使用raise關鍵字;
格式: raise 自定義異常名

方式二:使用raise_application_error(code, message)丟擲異常;
code:異常的編號,取值範圍:-20999~-20000之間任意一個數字;
message:異常的資訊;

如果要捕獲raise_application_error丟擲的異常,還需要把異常編號與一個異常的變數進行繫結。
pragma exception_init(異常變數, 異常編號);
--自定義異常
declare
      --定義異常
      feifeiexception exception;
      --定義變數
      i number := 1;
begin 
      if i=1 then
         -- 丟擲一個自定義的異常
         raise feifeiexception;
      end if;
exception 
      when feifeiexception then
         dbms_output.put_line('自定義異常出現了.....');
end;

相關文章