------------------------分頁----------------------------
create table book(
bookId number(3),
bookName varchar2(50),
publishHourse VARCHAR2(50)
);
--編寫過程額
--in;表示這是一個輸入參數,不寫默認就是in
--out;表示一個輸出參數
create or replace procedure sp_book(spBookId in number,spBookName in varchar2,spPublishHour varchar2) is
begin
insert into book values(spBookId,spBookName,spPublishHour);
end;
alter table book
add constraint uq_bookId unique(bookId);
--有輸入和輸出的存儲過程
create or replace procedure sp_book1(spBookId in number,spBookName out varchar2) is
begin
select bookName into spBookName from book where bookId=spBookId;
end;
--返回兩個值的存儲過程
create or replace procedure sp_book2(spBookId in number,spBookName out varchar2,spBookPublisher out varchar2) is
begin
select bookName,PUBLISHHOUR into spBookName,spBookPublisher from book where bookId=spBookId;
end;
----返回值的存儲過程(列表[結果集])--
--編寫一個過程,輸入部門號,返回該部門所有僱員信息
--由於oracle存儲過程沒有返回值,他的所有返回值都是通過out
--參數來替代的,列表也不例外,但由於是集合,所以不能用一般的參數
--必須要用packageg了,所以要分兩部分
--<1建一個包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--<2.創建過程
create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is
begin
open p_cursor for select * from emp where deptno=spNo;
end;
-----if語句;if--then-----
create or replace procedure sp_pro6(spName varchar2) is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename=spName;
if v_sal<2000
then update emp set sal=sal*1.1 where ename=spName;
end if; --不能掉了這裏
end;
-------二重if語句-if--then--else---
create or replace procedure sp_pro6(spName varchar2) is
v_comm emp.comm%type;
begin
select comm into v_comm from emp where ename=spName;
if(v_comm<>0)then
update emp set comm=comm+100 where ename=spName;
else
update emp set comm=comm+200 where ename=spName;
end if;
end;
----------多重條件分支-if--then--elsif---else---
create or replace procedure sp_pro7(spEmpno number) is
v_job emp.job%type;
begin
select job into v_job from emp where empno=spEmpno;
if v_job='PRESIDENT'then
update emp set sal=sal+1000 where empno=spEmpno;
elsif v_job='MANAGER'then
update emp set sal=sal+500 where empno=spEmpno;
else
update emp set sal=sal+200 where empno=spEmpno;
end if;
end;
-----------循環語句loop 至少執行一回--相當與while-----
create table Users(
uno number(3),
uname varchar2(10)
);
create or replace procedure sp_user(spUname varchar2) is
v_num Users.Uno%type:=1;
begin
loop
insert into Users values(v_num,spUname);
v_num:=v_num+1;
exit when v_num=11; --退出時的判斷語句
end loop;
end;
-------------while循環--先判斷再循環---相當於do-while-------------
create or replace procedure sp_user(spUname varchar2) is
v_num Users.Uno%type:=11;
begin
while v_num<=20 loop
--執行
insert into Users values(v_num,spUname);
v_num:=v_num+1;
end loop;
end;
---------------for 循環-------------
create or replace procedure sp_user(spUname varchar2) is
begin
for i in 21..30 loop --如果想從30到20反過來插入則在in後面加關鍵字 reverse
--執行
insert into Users values(i,spUname);
end loop;
end;
---------------goto語句-------一般不常用-----------
---------------null語句---null語句不會執行任何操作,並且會直接將控制傳遞到下一條語句-,使用null語句主要是爲了提高代碼的可讀性-----------------
create or replace procedure sp_pro6(spName varchar2) is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where ename=spName;
if v_sal<2000
then update emp set sal=sal*1.1 where ename=spName;
else
null;
end if; --不能掉了這裏
end;
------------------------分頁----------------------------
create table book(
bookId number(3),
bookName varchar2(50),
publishHourse VARCHAR2(50)
);
--編寫過程額
--in;表示這是一個輸入參數,不寫默認就是in
--out;表示一個輸出參數
create or replace procedure sp_book(spBookId in number,spBookName in varchar2,spPublishHour varchar2) is
begin
insert into book values(spBookId,spBookName,spPublishHour);
end;
alter table book
add constraint uq_bookId unique(bookId);
--有輸入和輸出的存儲過程
create or replace procedure sp_book1(spBookId in number,spBookName out varchar2) is
begin
select bookName into spBookName from book where bookId=spBookId;
end;
--返回兩個值的存儲過程
create or replace procedure sp_book2(spBookId in number,spBookName out varchar2,spBookPublisher out varchar2) is
begin
select bookName,PUBLISHHOUR into spBookName,spBookPublisher from book where bookId=spBookId;
end;
----返回值的存儲過程(列表[結果集])--
--編寫一個過程,輸入部門號,返回該部門所有僱員信息
--由於oracle存儲過程沒有返回值,他的所有返回值都是通過out
--參數來替代的,列表也不例外,但由於是集合,所以不能用一般的參數
--必須要用packageg了,所以要分兩部分
--<1建一個包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--<2.創建過程
create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is
begin
open p_cursor for select * from emp where deptno=spNo;
end;
--平常的分頁代碼
select * from emp;
select e.*,rownum rn from (select * from emp)e;
select e.*,rownum rn from (select * from emp)e where rownum<10;
select * from (select e.*,rownum rn from (select * from emp)e where rownum<10) where rn>6;
create or replace package fengyepackage as
type fengye_cursor is ref cursor;
end fengyepackage;
create or replace procedure sp_fengye(pageNow in number,pageSise in number,tableName in varchar2,sortOrder in varchar2,pageCount out number,fengye_cursor out fengyepackage.fengye_cursor) is
v_rowCount number(2); --總記錄數目
v_pageCount number(2); --總頁數
v_fromline number(2);
v_toline number(2);
v_sql varchar2(1000);
begin
v_sql:='select count(*) from '||tableName; --組織一個sql
execute immediate v_sql into v_rowCount; --執行sql,並且把返回值賦給v_rowCount
if mod(v_rowCount,pageSise)=0 then --v_rowCount%pageSise=0的取餘數的方式是錯誤的
v_pageCount:=v_rowCount/pageSise;
else
v_pageCount:=ceil(v_rowCount/pageSise); --ceil相當於加了1
end if;
v_toline:=pageNow*pageSise;
v_fromline:=(pageNow-1)*pageSise;
pageCount:=v_pageCount;
v_sql:='select * from (select e.*,rownum rn from (select * from '||tableName||' '||sortOrder||')e where rownum<='||v_toline||') where rn>'||v_fromline;--兩個連接符號之間要用空格隔開,否則java程序無法識別
open fengye_cursor for v_sql;
--close fengye_cursor; --關閉遊標,不能關閉否則java程序調用不到數據
--把遊標的結果集傳給JAVA的resultset之是不需要我們來手動的關閉遊標的,因爲JAVA把這個結果集接收過來的之後,如果JAVA對這個結果集操作完畢的話,JAVA會把這個結果集關閉掉的,不需要我們手動的去作任何操作!
end;
------遊標測試
set serveroutput on;
declare
--定義遊標類型sp_emp_cursor
type sp_emp_cursor is ref cursor;
--定義一個遊標變量test_cursor
test_cursor sp_emp_cursor;
--定義變量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--把teset_cursor和一個select結合
open test_cursor for select ename ,sal from emp where deptno=&no;
--循環取出
loop
fetch test_cursor into v_ename,v_sal;
exit when test_cursor%notfound;
dbms_output.put_line('僱員姓名是:'||v_ename||'薪資是:'||v_sal);
end loop;
close test_cursor;
end;