oracle 的遊標,經常用的函數,存儲過程,包

--第一個例子
--賦值語句
set serveroutput on;

declare
var_username varchar2(100);
begin
select ename into var_username from scott.emp where empno=7788;
dbms_output.put_line('用戶名:'||var_username);
end;

--第二個例子
--賦值語句
set serveroutput on;

declare
c_databases varchar(50):='10 g';
begin
dbms_output.put_line(c_databases);
end;

--第三個例子
--條件語句if
set serveroutput on;

declare
v_number number:=10;
begin
if v_number<0 then
dbms_output.put_line(v_number||'是個負數');
elsif v_number=0 then
dbms_output.put_line(v_number||'爲零');
else
dbms_output.put_line(v_number||'是個正數');
end if;
end;

--第四個例子
--分支語句case

set serveroutput on;

declare
v_day   integer :=3;
v_data  varchar2(20);

begin

v_data :=case v_day

when 1 then '星期一'
when 2 then '星期二'
when 3 then '星期三'
when 4 then '星期四'
when 5 then '星期五'
when 6 then '星期六'
when 7 then '星期日'
end;
dbms_output.put_line(v_data);
end;

 

--第五個例子
--循環語句loop...exit...end
setserveroutput on;

declare
v_num integer:=1;
v_sum integer:=0;
begin
loop
v_sum:=v_sum+v_num;
dbms_output.put_line(v_num);

if v_num=3 then
exit;
end if;

dbms_output.put_line('+');
v_num:=v_num+1;
end loop;
dbms_output.put_line('=');
dbms_output.put_line(v_sum);
end;

--第六個例子
--循環語句loop...exit when...end
set serveroutput on;
declare
v_num integer:=1;
v_sum  integer:=0;
begin
loop
v_sum:=v_sum+v_num;
dbms_output.put_line(v_num);

exit
when v_num=3;

v_num:=v_num+1;
dbms_output.put_line('+');
end loop;
dbms_output.put_line('=');
dbms_output.put_line(v_sum);
 
end;

--第七個例子
----循環語句 while loop...end loop

set serveroutput on;

declare
v_num integer:=1;
v_sum integer:=0;
begin

while v_num<4

loop
v_sum:=v_sum+v_num;
dbms_output.put_line(v_num);
dbms_output.put_line('+');
v_num:=v_num+1;
end loop;
dbms_output.put_line('=');
dbms_output.put_line(v_sum);
end;

--第八個例子(不主要)
--循環語句loop...in..loop...end loop
set serveroutput on;
declare
v_num integer:=1;
v_sum integer:=0;

begin

for v_num in 1..3
loop
v_sum:=v_sum+v_num;
dbms_output.put_line(v_num);
if v_num<3 then
dbms_output.put_line('+');
end if;
end loop;
dbms_output.put_line('=');
dbms_output.put_line(v_sum);

end;


--異常例子1(value_error)
set serveroutput on;
declare
v_num number;
begin
v_num:='d123';

exception
when value_error then
dbms_output.put_line('數據類型錯誤');

end;

 

--異常例子(綜合例子)
set serveroutput on;
declare
v_username varchar2(200);
begin
select ename into v_username from emp where job='s12';
exception

when no_data_found then
dbms_output.put_line('沒有數據');
when too_many_rows then
dbms_output.put_line('返回多行數據');
when others then
dbms_output.put_line('錯誤情況不明');

end;

--abs 返回表達式的絕對值

set serveroutput on;
begin
dbms_output.put_line(abs(-3333));
end;

--ceil 返回大於或等於所給數字的最小整數


set serveroutput on;

begin
dbms_output.put_line(ceil(3333.55));
end;

--floor 返回小於或等於所給數字的最大整數
set serveroutput on;

begin
dbms_output.put_line(floor(3333.55));
end;
--power 返回表達式給定的次方值

set serveroutput on;
begin
dbms_output.put_line(power(12,2));
end;
--round 返回四捨五入

set serveroutput on;
begin
dbms_output.put_line(round(1.2));
dbms_output.put_line(round(1.9));
end;
 
--ascii  返回ascii碼

set serveroutput on;
begin
dbms_output.put_line(ascii('A'));
end;

--length 返回字符串表達式的字符(而不是字節)個數

set serveroutput on;
begin
dbms_output.put_line(length('d    '));
dbms_output.put_line(length('張山東省'));
end;

--upper 返回將小寫轉化爲大寫
set serveroutput on;
begin
dbms_output.put_line(upper('ffff'));
end;

--輸出當前日期(sysdate)

set serveroutput on;
begin
dbms_output.put_line(sysdate);
end;

--將日期轉化爲字符串(to_char)

set serveroutput on;
begin
dbms_output.put_line(to_char(sysdate)||'字符串');
end;
--返回指定日期月份的最後一天的日期(last_day)
set serveroutput on;
begin
dbms_output.put_line(last_day(sysdate));
end;

--返回兩個日期之間的月份數目

set serveroutput on;
begin
dbms_output.put_line(months_between( to_date('2012-11-12','yyyy-mm-dd'),to_date('2012-12-14','yyyy-mm-dd')));
end;

--將字符串轉化爲日期(to_date)
set serveroutput on;
begin
dbms_output.put_line(to_date('2012-11-12','yyyy-mm-dd'));
end;


--統計函數(max)

set serveroutput on ;
declare

v_num number ;
begin
select max(sal) into v_num from emp;
dbms_output.put_line('最高工資'||v_num);
end;
--統計函數(min)
set serveroutput on ;
declare

v_num number ;
begin
select min(sal) into v_num from emp;
dbms_output.put_line('最低工資'||v_num);
end;
--統計函數(count)
set serveroutput on ;
declare

v_num number ;
begin
select count(ename) into v_num from emp;
dbms_output.put_line('總人數:'||v_num);
end;

--遊標
--遊標:從字面的意思是遊動的光標,用數據庫的語言描述,
--遊標是映射在結果集一行數據上的位置實體,,有了遊標,
--用戶就可以訪問結果集中的任意一行數據,將遊標放置到某一行後,
--即可對該行數據進行操作,最常見的操作是提取當前行的數據


--遊標for循環是顯示遊標的一種快捷方式,
--當使用for循環開始時,遊標被自動打開(不需要使用open語句);
--每循環一次,系統自動讀取遊標當前行的數據(不需要使用fetch語句);
--當退出for循環時,遊標自動關閉(不需要使用close語句)


set serveroutput on;

declare
v_id number;
v_name varchar2(30);

cursor jacobcursor(v_type number)is
select empno,ename from emp
where deptno=v_type;
begin

open jacobcursor(20);
fetch jacobcursor into v_id,v_name;
close jacobcursor;
dbms_output.put_line('用戶的id:'||v_id||'用戶名:'||v_name);


end;

 

--遊標(%isopen)

set serveroutput on;

declare
v_id number;
v_name varchar2(30);

cursor zzucursor(v_type number)is
select empno,ename from emp
where deptno=v_type;
begin


if zzucursor%isopen=false then
open zzucursor(30);


end if;
fetch zzucursor into v_id,v_name;
close zzucursor;
dbms_output.put_line('userid:  '||v_id||'   username:  '||v_name);
end;

--遊標(%found|| %notfound)

set serveroutput on;
declare
v_id number;
v_name varchar2(50);
cursor zzucursor(v_type number)is
select empno,ename from emp
where deptno=v_type;
begin
if zzucursor%isopen=false then
open zzucursor(30);
end if;


fetch zzucursor into v_id,v_name; --必須在這個位置

 

while zzucursor%found
loop
dbms_output.put_line('userid  '||v_id||'username  '||v_name);
fetch zzucursor into v_id,v_name;
end loop;


close zzucursor;
end;

--遊標(%rowcount)
set serveroutput on;
declare
v_id number;
v_name varchar2(30);
cursor zzucursor(v_type number)is
select empno ,ename from emp
where deptno =v_type;
begin
 if zzucursor%isopen= false then
 open zzucursor(30);
 end if;
 fetch zzucursor into v_id,v_name;
 while zzucursor%notfound=false
 loop
 dbms_output.put_line('userid   :'||v_id||'username  :'||v_name);
 if zzucursor%rowcount=3 then
 exit;
 end if;
 fetch zzucursor into v_id,v_name;
 end loop;
 end;
 
 --記錄與遊標
 set serveroutput on;
 declare
 --記錄
 type user_record is  record
 ( v_id  emp.empno%type,
 v_name   emp.ename%type );
 
 v_user_record  user_record;
 cursor zzucursor(v_type number)is
 select empno ,ename from emp
 where deptno=v_type;
 begin
 if zzucursor%isopen =false then
 open zzucursor(30);
 end if;
 fetch zzucursor into v_user_record;
 while zzucursor%found
 loop
 dbms_output.put_line('userid  :'||v_user_record.v_id||'username :'||v_user_record.v_name);
 fetch zzucursor into v_user_record;
 
 end loop;
 close zzucursor;
 end;

 --記錄
 
set serveroutput on;
declare
type user_record is record
( v_id emp.empno%type,
v_name emp.ename%type
);
v_user_record user_record;
 
cursor zzucursor(v_type number)is
select empno,ename from emp
where deptno =v_type;
begin
if zzucursor%isopen=false then
open zzucursor(30);
end if;
fetch zzucursor into v_user_record;

while zzucursor%found
loop
dbms_output.put_line('userid  :'||v_user_record.v_id||'username  :'||v_user_record.v_name);
if zzucursor%rowcount=3 then
exit;
end if;
fetch zzucursor into v_user_record;
end loop;
close zzucursor;
end;
 
 
 --定義一個記錄
 type user_record is record
 (
 v_id emp.empno%type,
 v_name emp.ename%type
 );
 
 ---for 與 記錄 
 
set serveroutput on;
declare
type user_record is record
( v_id     emp.empno%type,
  v_name   emp.ename%type
);
v_user_record   user_record;
 
cursor zzucursor(v_type number)is
select empno,ename from emp
where deptno =v_type;

begin
for  v in zzucursor(30) loop
v_user_record.v_id:=v.empno;
v_user_record.v_name:=v.ename;
dbms_output.put_line('userid  :'||v_user_record.v_id||'username  :'||v_user_record.v_name);
end loop ;
end;

--存儲過程

create or replace procedure  zzuprocedure(v_type  number)
as
begin
update  emp  set ename='dddd'
where empno=v_type;
end;

--存儲過程2
create or replace procedure zzucursor(v_type number)
as
v_name varchar2(30);

begin

select ename into v_name from emp
where empno=v_type;

dbms_output.put_line(v_name);
 end;
 
 
 
 
  --調用存儲過程
 call procedurename;
 
 execute  procedurename;
 
 --刪除存儲過程
 drop procedure name;
 
  --函數
 
  create or replace function zzufunction(v_type number)
  return  emp.ename%type
 
  as
  names  emp.ename%type;
 
  begin
  select ename into names from emp where empno=v_type;
  return names;
  end;
 
 
  set serveroutput on;
  declare
  v_name emp.ename%type;
  begin
  v_name := zzufunction(7788);
  dbms_output.put_line(v_name);
  end;
 
 
 
 
 --程序包
 create or replace package zzupackage is
 procedure zzucursor(v_type number);
 function zzucurfunction(v_type number)
 return emp.ename%type;
 end zzupackage;

 

--創建包體
create or replace package body  zzupackage
as

procedure zzucursor(v_type number)is
begin

dbms_output.put_line('isss'||v_type);
end;

function zzucurfunction(v_type number)
return emp.ename%type
as
 out_name  emp.ename%type;
 
 begin
 select ename into out_name from emp
 where empno=v_type;
 return out_name;
 end;
 end zzupackage;
 
 --調用包體
 
set serveroutput on ;
begin
zzupackage.zzucursor(222);
end;

--刪除包體
drop package body   packagename;

--觸發器
create or replace trigger zzutrigger
after
update on emp
for each row
begin
dbms_output.put_line('已經觸發觸發器');
end;
 
 

--自定義異常
create or  replace procedure zzuprocedure(v_num number)
is
myexception exception;
begin
update emp set sal=sal+200 where empno=v_num;
if sql%notfound then
raise myexception;
end if;

exception
when myexception  then
dbms_output.put_line('沒有找到用戶');
end;

create or replace view  zzu_view   as select * from emp;

 


--定義索引
create index index_id on emp(ename);
--刪除索引
drop index index_id;

 


--定義序列

create sequence user_sequence
minvalue 1
nomaxvalue
start with 1
increment by 1
nocycle;
-- minvalue 表示序列的最小值爲1
--nomaxvalue  表示序列沒有最大值的限制
--start with 1   表示序列的初始值爲1
--increment by 1  表示序列間隔爲1
--nocycle     不循環

--刪除序列

drop sequence user_sequence


 

發佈了30 篇原創文章 · 獲贊 3 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章