PL/SQL基礎篇6(Procedure)

 -- 存儲過程:過程是用於完成特定任務的子程序(代碼的集合)

/*

   子程序的優點:1.模塊化,將程序分解爲邏輯模塊;

                 2.可重用性,可以被任意數目的程序調用;

                 3,可維護性,簡化維護操作;

                 4.安全性:通過設置權限,是數據

*/

-- 存儲過程1,打印HelloWorld

create or replace procedure my_pro

is    -- 用於聲明一些變量,可以用as,在oracle中不能省略,在Mysql中不能有

  v_string varchar2(20) := 'helloworld!';

begin

  dbms_output.put_line(v_string);

end;

-- 調用1

begin

  my_pro; -- 這種方式調用無參的存儲過程,括號可以省略

  my_pro();

end;

--調用2

call my_pro(); --無參的也必須帶括號

--調用3,在command中輸入 set serveroutput on  execute my_pro();

 

-- 存儲過程2,帶參數的,默認是輸入參數

create or replace procedure my_pro2(v_sal  number) -- 參數,要制定類型,varchar不能指定長度

is

   v_sql varchar2(200);

   v_emp emp%rowtype;

begin

  v_sql := 'select * from emp where sal =: s';

  execute immediate v_sql into v_emp

  using v_sal;

  dbms_output.put_line(v_emp.ename);

  exception

    when no_data_found then

      dbms_output.put_line('沒有找到!');

end;

 

select * from emp;

call my_pro2(820);

 

-- 存儲過程3,帶參數,輸入(in)和輸出(out)參數,關鍵字:in out,不寫默認是in

create or replace procedure my_pro3(v_sal number, v_name out emp.ename%type) --out

is

  v_sql varchar2(200);

begin

  v_sql := 'select ename from emp where sal =: s';

  execute immediate v_sql into v_name

  using v_sal;

end;

-- 調用

declare

  v_sal number := '&輸入薪水:';

  v_name varchar2(20);

begin

  my_pro3(v_sal,v_name);

  dbms_output.put_line(v_name);

end;

--存儲過程4,輸入輸出類型,in out,交換兩個數

create or replace procedure swap(v_num1 in out number, v_num2 in out number)-- in out 順序不能顛倒

as

  v_temp number;

begin

  v_temp := v_num1;

  v_num1 := v_num2;

  v_num2 := v_temp;

end;

-- 調用

declare

  v_num1 number := '&num1';

  v_num2 number := '&num2';

begin

  dbms_output.put_line('交換前:num1 = '||v_num1||'-----num2 = '||v_num2);

  swap(v_num1,v_num2);

  dbms_output.put_line('交換後:num1 = '||v_num1||'-----num2 = '||v_num2);

end;

 

--存儲過程5,計算總頁數和總記錄數

create or replace procedure countPageAndRecords

       (tableName varchar2, pageSize number,totalRecord out number,totalPage out number)

as

  v_sql varchar2(200);

begin

  v_sql := 'select count(*) from '||tableName;

  execute immediate v_sql into totalRecord;

  totalPage := ceil(totalRecord/pageSize);

  -- 計算方式二

  if mod(totalRecord,pageSize) = 0 then

    totalPage := totalRecord/pageSize;

  else

    totalPage := floor(totalRecord/pageSize)+1;

  end if;

end;

--測試

declare

  tableName varchar2(50) := '&表名:';

  pageSize number := '&分頁單位:';

  totalRecord number;

  totalPage number;

begin

  countPageAndRecords(tableName,pageSize,totalRecord,totalPage);

  dbms_output.put_line('總數爲:'||totalRecord);

  dbms_output.put_line('總頁數爲:'||totalPage);

end;

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