子程序和程序包

 

七、子程序和程序包
  總結:
    子程序是命名的PL/SQL塊,可帶參數並可在需要時隨時調用。
    PL/SQL有兩種類型的子程序,即過程和函數。
    過程用於執行特定的任務,函數用於執行任務並返回值。
    程序包是對相關類型、變量、常量、遊標、異常、過程和函數的封裝。
    程序包由包規範和包主體兩部分組成。
    包規範是包的接口,包含公用對象及其類型。
    包主體實現包規範中的遊標和子程序,包主體中的聲明僅限於在包內使用。
    程序包中游標的定義分爲遊標規範和遊標主體兩部分。

  語法及示例:
  1、存儲過程
  創建存儲過程的語法:
  CREATE [OR REPLACE] PROCEDURE procedure_name
    [(parameter_list)]
    {IS|AS}
     [local_declarations]
    BEGIN
      executable_statements
    [EXCEPTION
      exception_handlers]
    END [procedure_name];
  其中:procedure_name是過程的名稱。
        parameter_list是參數列表。
        local_declarations是局部聲明。
        executable_statements是可執行語句。
        exception_handlers是異常處理程序。
  示例1:演示創建過程(參數列表中爲IN參數賦予一個默認值,不能爲OUT、IN OUT參數賦予默認值)
  create or replace procedure find_emp(emp_no in number:=7900)
  as
    empname varchar2(20);
  begin
    select ename into empname from emp where empno=emp_no;
    dbms_output.put_line('僱員姓名是 '||empname);
  exception
    when no_data_found then
      dbms_output.put_line('僱員編號未找到');
  end find_emp;
 
  調用過程:EXECUTE procudure_name(parameters_list);
  也可以在過程裏面調用,直接寫上procudure_name而不必寫EXECUTE。

  示例2:演示創建帶OUT參數的過程
  create or replace procedure test(value1 varchar2,value2 out number)
  is
    identity number;
  begin
    select sal into identity from emp where empno=value1;
    if identity<2000 then
       value2:=1000;
    else
       value2:=500;
    end if;
  end;

  調用帶OUT參數的過程:
  declare
    value2 number;
  begin
    test('7900',value2);
    dbms_output.put_line(value2);
  end;

  示例3:演示創建帶IN OUT參數的過程
  create or replace procedure swap(p1 in out number,p2 in out number)
  is
    v_temp number;
  begin
    v_temp:=p1;
    p1:=p2;
    p2:=v_temp;
  end;

  調用帶IN OUT參數的過程:
  declare
    num1 number:=100;
    num2 number:=200;
  begin
    swap(num1,num2);
    dbms_output.put_line('num1= '||num1);
    dbms_output.put_line('num2= '||num2);
  end;

  示例4:將過程的執行權限授予其他用戶
  GRANT EXECUTE ON find_emp TO scott;
  GRANT EXECUTE ON swap TO PUBLIC;
  將find_emp過程的執行權限授予給用戶scott,將執行swap過程的權限授予所有數據庫用戶。
 
  刪除過程語法:DROP PROCEDURE procudure_name;

  2、函數
  定義函數的語法如下:
  CREATE [OR REPLACE] FUNCTION function_name
    [(parameter_list)]
    RETURN datatype
    {IS|AS}
     [local_declarations]
    BEGIN
      executable_statements
    [EXCEPTION
      exception_handlers]
    END [function_name];
  其中:function_name是函數的名稱。
        parameter_list是參數列表。
        local_declarations是局部聲明。
        executable_statements是可執行語句。
        exception_handlers是異常處理程序。
  使用函數時注意:形式參數必須只使用數據庫類型,不得使用PL/SQL類型。函數的返回類型也必須是數據庫類型。
  函數不能單獨執行,只能通過SQL語句或PL/SQL程序塊來調用。
  示例5:演示如何創建函數
  create or replace function fun_hello
  return varchar2 is
  begin
    return '朋友,您好';
  end;
  調用函數:select fun_hello from dual;

  函數的授權:同過和的授權一樣具體請看示例4。
  刪除函數:DROP FUNCTION function_name

                                         過程和函數的差異
             過程                                                           函數
   作爲PL/SQL語句執行                                             作爲表達式的一部分調用
   在規範中不包含RETURN子句                                       必須在規範中包含RETURN子句
   不返回任何值                                                   必須返回單個值
   可以包含RETURN語句,但是與函數不同,它不能用於返回值  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章