oracle存儲函數和存儲過程

  1. 存儲過程
    概念:存儲過程(Stored Procedure)是在大型數據庫系統中,一組爲了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象。
    sql語句:
    sql中的存儲過程及相關介紹:
    CREATE PROCEDURE [擁有者.]存儲過程名[;程序編號]
    [(參數#1,…參數#1024)]
    [WITH
    {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
    ]
    [FOR REPLICATION]
    AS 程序行
    其中存儲過程名不能超過128個字。每個存儲過程中最多設定1024個參數
    (SQL Server 7.0以上版本),參數的使用方法如下:
    @參數名數據類型[VARYING] [=內定值] [OUTPUT]
    每個參數名前要有一個“@”符號,每一個存儲過程的參數僅爲該程序內部使用,參數的類型除了IMAGE外,其他SQL Server所支持的數據類型都可使用。
    [內定值]相當於我們在建立數據庫時設定一個字段的默認值,這裏是爲這個參數設定默認值。[OUTPUT]是用來指定該參數是既有輸入又有輸出值的,也就是在調用了這個存儲過程時,如果所指定的參數值是我們需要輸入的參數,同時也需要在結果中輸出的,則該項必須爲OUTPUT,而如果只是做輸出參數用,可以用CURSOR,同時在使用該參數時,必須指定VARYING和OUTPUT這兩個語句。
    實例:
    create or replace procedure add_sal(dept_id number,temp_num out number)
    is
           cursor sal_cursor is select employee_id,salary,hire_date from employees where department_id = dept_id;
           v_1 number(4,2) := 0;       
    begin
           temp_num := 0;
           for c in sal_cursor loop
               if to_char(c.hire_date,'yyyy') < '1995' then v_1 := 0.05;
               elsif to_char(c.hire_date,'yyyy') < '1995' then v_1 := 0.03;
               else v_1 := 0.01;
               end if;
               
               update employees set salary = salary*(1+v_1) where employee_id = c.employee_id;
               temp_num := temp_num + c.salary*v_1;
           end loop;
           dbms_output.put_line(temp_num);
    end;
    調用方法:
    declare
      v_temp number(10) := 0;
    begin
      add_sal(80,v_temp);
    end;
    
  2. 存儲函數:
    概念:有返回值的存儲過程。
    實例: helloworld
  3. create or replace function hello_world(v_log varchar2)
    return varchar2
    is
    begin
    return 'helloworld '||v_log;
    end;
    
    調用:
    declare
    v_hell varchar2 := 'nihao';
    begin
    hello_world(v_hell);
    end;

    實例2:

    create or replace function get_sal(dept_id number,total out number)
    return number
    is
           v_sumsal number(10) := 0;
           cursor salary_cursor is select salary from employees where department_id = dept_id;
    begin
           total := 0;
           for c in salary_cursor loop
               v_sumsal := v_sumsal + c.salary;
               total := total + 1;
           end loop;
           return v_sumsal;
    end;
    
    調用:
    declare
    v_dept number := 80;
    v_num number := 0;
    begin
    
    get_sal(v_dept,v_num);
    end;實例3:
    create or replace function get_sysDate
    return date
    is 
    v_date date;
    begin
    v_date := sysdate;
    return v_date;
    end;

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