-- 存儲過程:過程是用於完成特定任務的子程序(代碼的集合)
/*
子程序的優點: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;