天天看點

Oracle之pl/sql程式設計(一)函數,過程,包

pl/sql是什麼?

pl/sql是oracle在标準sql語言上的擴充。不僅允許嵌入sql語言,還可以定義常量和變量,允許使用條件語句和循環語句,允許使用例外處理各種錯誤。

作用:過程,函數,觸發器是用pl/sql編寫的且存在于在oracle中,可以在java程式中調用,pl/sql強大的資料庫過程語言。

1、建立一個表:

SQL> create table  mytest(name varchar2(30),passwd  varchar2(30));

2、建立過程

SQL> create procedure  sp_prol  is   

begin

--執行部分

insert  into  mytest('hjadsfhas','sdkhfdsj');

end;

/

也可以使用(replace 表示如果有sp_prol就替換)

SQL> create   or  replace procedure  sp_prol  is

  2  begin

  3  --執行部分

  4  insert  into  mytest('hjadsfhas','sdkhfdsj');

  5  end;

  6  /

show  error ————————檢視錯誤

正确的過程建立

SQL> create  or  replace  procedure sp_prol is 
  2  begin
  3  insert  into mytest values('hansjd','2sduf');
  4  end;
  5  /
 
Procedure created           

3、執行過程

exec  過程名;

①exec  過程名 (參數值1,參數值2,。。。)

②call  過程名(參數值1,參數值2,。。。)

4、删除過程

drop procedure  過程名

使用pl/sql編寫子產品時,pl/sql的基礎機關是塊 ,其包括過程(存儲過程),函數,觸發器,包

編寫規範:

①注釋

單行注釋  — —

多行注釋/*     */

②辨別符号的命名規範

1、當定義變量時,建議使用v_為字首,

2、定義常量時,建議使用c_為字首

3、當定義遊标時,使用_cursor作為字尾

4、定義例外時,使用e_為 字首  e_error

圖1

執行個體1—之包括執行部分的pl/sql塊

  set  serveroutput  on  ——打開輸出選項

begin 

dbms_output.put_line('hello');

dbms_output是oracle所提供的包(類似于java的開發包),該包包含一些過程,put_line就是dbms_output包的一個過程。

案例:一

隻包括執行部分的pl/sql塊

SQL> begin
  2  dbms_output.put_line('hello  world!');
  3  end;
  4  /
 
PL/SQL procedure successfully completed           

當打開輸出選項時:(就會在下面輸出内容)

SQL> set serveroutput on;
SQL> begin 
  2  dbms_output.put_line('你好,智障!0_0');
  3  end;
  4  /
 
你好,智障!0_0
 
PL/SQL procedure successfully completed           

案例:二

包含定義部分和執行部分的pl/sql

SQL> declare
  2  v_ename  varchar2(5);
  3  begin
  4  select ename into v_ename  from  emp  where  empno =&no;
  5  dbms_output.put_line('雇員名'||v_ename);
  6  exception 
  7  when  no_data_found  then 
  8  dbms_output.put_line('異常');
  9  end;
 10  /
 
雇員名SCOTT
 
PL/SQL procedure successfully completed           
SQL> declare
  2  v_ename  varchar2(5);--定義字元串常量
  3  begin
  4           select ename into v_ename  from  emp where  empno=&no;--将查詢的值傳給v_ename  
  5           dbms_output.put_line('雇員名'||v_ename);--字元串連接配接||
  6  end;
  7  /           

&:表示要接受從控制台輸入變量

過程

用于執行  特定的操作,當建立過程時,既可以指定輸入參數(in),也可以指定輸出參數(out)。通過在過程中使用輸入參數,可以将資料傳遞到執行部分;通過使用輸出參數,可以将執行部分的資料傳遞到應用環境。

執行個體:①可以輸入雇員名,可以修改雇員的工資,新工資

PL/SQL procedure successfully completed
 
SQL> create procedure sp_pro3(spName  varchar2,newSal  number)  is 
  2  begin
  3  update emp set  sal = newSal  where ename = spName;
  4  end;
  5  /
Warning: connection was lost and re-established
 
Procedure created           
SQL> exec sp_pro3('SCOTT',4768);
 
PL/SQL procedure successfully completed           

函數

用于傳回特定資料,當建立函數時,在函數頭部必須包含return子句,而在函數體内必須包含return語句傳回的資料。

使用create  function  來建立函數,實際案例:

SQL> create  function sp_fun2(spName  varchar2)  return  
  2  number  is  yearSal  number(7,2);
  3  begin
  4  --執行部分
  5  select sal*12+nvl(comm,0)  into yearSal   from emp  where ename = spName;
  6  return yearSal;
  7  end;
  8  /           

建立一個函數名為sp_fun2 ,輸入sp_Name(形參),傳回一個number  叫yearSal  類型為number(7,2);

函數的調用

SQL> var abc number;
SQL> call sp_function('SCOTT')  into:abc;
SQL>print abc
           

包用于在邏輯上組合過程和函數,它由包規範和包體兩部分組成。

①使用create   package 指令來建立包:

SQL> create package sp_package is 
  2  procedure update_sal(name  varchar2,newsal  number);
  3  function annual_income(name  varchar2)  return  number;
  4  end;
  5  /           

包的規範隻包含了過程和函數的說明,但是沒有過程和函數的實作代碼,包體用于實作包規範中的過程和函數,

②建立包體:

使用create  package  body  指令

SQL> 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)
  8   return number  is
  9   annual_salary number;
 10   begin
 11   select  (sal+nvl(comm,0))*12   into annual_salary  from emp  where ename=name;
 12   return annual_salary;
 13    end;
 14    end;
 15   /
 
Package body created
 
SQL>            

包的執行:

SQL> exec sp_package.update_sal('SCOTT',120);
 
PL/SQL procedure successfully completed
 
SQL>