日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle 存储过程 ,触发器练习

發布時間:2025/4/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 存储过程 ,触发器练习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

/*
以下代碼是對emp表進行顯示寬度設置
*/
col empno for 9999;
col ename for a10;
col job for a10;
col mgr for 9999;
col hiredate for a12;
col sal for 9999;
col comm for 9999;
col deptno for 99;
col tname for a12;
set pagesize 50;

//------------------------------------------------------------------------------------------------------

使用loop循環顯示1-10【loop循環】
declare
--聲明變量
i number(2);
begin
i := 1;
--以下代碼是循環
loop
exit when i>10;
dbms_output.put_line(i);
i := i+1;
end loop;
end;
/

使用while循環顯示10-20【while循環】
declare
i number(2) := 10;
begin
while i<=20
loop
dbms_output.put_line(i);
i := i+1;
end loop;
end;
/

使用for循環顯示20-30【for循環】
declare
i number;
begin
for i in 20..30
loop
dbms_output.put_line(i);
end loop;
end;
/

使用無參光標cursor,查詢所有員工的姓名和工資【如果需要保存多行記錄時,使用光標cursor】
declare
--定義一個cursor,里面裝多條記錄
cursor cemp is select ename,sal from emp;
--聲明二個普通變量
pename emp.ename%type;
psal emp.sal%type;
begin
--打開cursor
open cemp;
--循環
loop
--將cursor下移,將用戶名和工資存入二個自定義普通變量中
fetch cemp into pename,psal;
--判斷是否該退出循環,切記
exit when cemp%notfound;
--顯示
dbms_output.put_line(pename||'的工資是'||psal);
end loop;
--關閉cursor
close cemp;
end;
/

使用無參光標,給員工漲工資,ANALYST漲1000,MANAGER漲800,其它漲400【編號,姓名,職位,薪水】
declare
cursor cemp is select empno,ename,job,sal from emp;
pempno emp.empno%type;
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
open cemp;
loop
fetch cemp into pempno,pename,pjob,psal;
exit when cemp%notfound;
--if是PLSQL
if pjob='ANALYST' then
--update是SQL
update emp set sal=sal+1000 where empno=pempno;
elsif pjob='MANAGER' then
update emp set sal=sal+800 where empno=pempno;
else
update emp set sal=sal+400 where empno=pempno;
end if;
end loop;
commit;
close cemp;
end;
/

使用帶參光標,查詢20號部門的員工姓名和工資,工資都加800
declare
--定義一個帶參cursor
cursor cemp(pdeptno number) is select empno,ename,sal from emp where deptno=pdeptno;
pename emp.ename%type;
psal emp.sal%type;
pempno emp.empno%type;
begin
--打開光標,同時傳入實際參數
open cemp(20);
loop
fetch cemp into pempno,pename,psal;
exit when cemp%notfound;
update emp set sal=sal+800 where empno=pempno;
end loop;
--關閉光標
close cemp;
end;
/

oracle系統內置例外,被0除異常【zero_divide】
declare
i number;
s number;
begin
i := 10;
s := i/0;
exception
when zero_divide then
dbms_output.put_line('自已捕獲系統內置例外');
end;
/

用戶自定義例外,沒有找到員工例外【no_emp_found】
declare
cursor cemp(pempno number) is select ename from emp where empno=pempno;
pename emp.ename%type;
--聲明自定義例外
no_emp_found exception;
begin
open cemp(1111);
loop
fetch cemp into pename;
--如果沒有找到員工
if cemp%notfound then
--拋例外
raise no_emp_found;
end if;
end loop;
close cemp;
exception
when no_emp_found then
dbms_output.put_line('查無此員工');
end;
/

//------------------------------------------------------------------------------------------------------

創建無參存儲過程hello,無返回值

create or replace procedure hello
as
begin
dbms_output.put_line('這就是存儲過程');
end;
/

刪除存儲過程hello
drop procedure hello;

調用存儲過程方式一【exec 存儲過程名】
exec hello;

調用存儲過程方式二【PLSQL程序】
begin
--調用存儲過程
hello;
end;
/

調用存儲過程方式三【JDBC】
CallableStatement

創建有參存儲過程raiseSalary(編號),為7369號員工漲10%的工資,并顯示出漲前和漲后的工資【演示in的用法,默認in】
create or replace procedure raiseSalary(pempno number)


as
--as看作declare,但不能出現declare,聲明變量
psal emp.sal%type;
begin
--查詢編碼為7369號員工的工資
select sal into psal from emp where empno=pempno;
--顯示
dbms_output.put_line('7369號員工漲前工資'||psal);
dbms_output.put_line('7369號員工漲后工資'||psal*1.1);
end;
/
exec raiseSalary(7369);


創建無參存儲函數myshow,有返回值
create or replace function myshow return varchar2
as
begin
return '哈哈';
end;
/

刪除存儲函數myshow
drop function myshow;

調用存儲函數方式一【PLSQL程序】

declare
value varchar2(6);
begin
value := myshow();
--value := myshow;可以
dbms_output.put_line(value);
end;
/

調用存儲函數方式二【JDBC】
CallableStatement

創建有參存儲函數findEmpIncome(編號),查詢7369號員工的年收入【演示in的用法,默認in】


create or replace function findEmpIncome(pempno in number) return number
as
--年收入
income number;
begin
select sal*12+NVL2(comm,comm,0) into income from emp where empno=pempno;
--返回年收入
return income;
end;
/

declare
income number;
begin
income := findEmpIncome(7369);
dbms_output.put_line('年收入是'||income);
end;
/

創建有參存儲函數findEmpNameAndSal(編號),查詢7902號員工的的姓名和月薪,【返回多個值,演示out的用法】
當返回2個或多個值,必須使用out符號
當返回1個值,就無需out符號

create or replace function findEmpNameAndSal(pempno in number,pename out varchar2) return number
as
psal emp.sal%type;
begin
select ename,sal into pename,psal from emp where empno=pempno;
--返回月薪
return psal;
end;
/

---------------------------------------相互轉值

declare
psal emp.sal%type;
pename emp.ename%type;
begin
psal := findEmpNameAndSal(7902,pename);
dbms_output.put_line('7902號員工的姓名'||pename||',薪水是'||psal);
end;
/

創建有參存儲過程findEmpNameAndSalAndJob(編號),查詢7902號員工的的姓名,職位,月薪【演示out的用法】
create or replace procedure
findEmpNameAndSalAndJob(pempno in number,pename out varchar2,pjob out varchar2,psal out number)
as
begin
select ename,job,sal into pename,pjob,psal from emp where empno=pempno;
end;
/

declare
pename emp.ename%type;
pjob emp.job%type;
psal emp.sal%type;
begin
findEmpNameAndSalAndJob(7902,pename,pjob,psal);
dbms_output.put_line('7902號員工的姓名是'||pename||':'||pjob||':'||psal);
end;
/

什么情況下使用存儲過程?什么情況下使用存儲函數?
項目中的原則:
A)如果只有一個返回值:用函數
B)如果無返回值,或超過1個以上的返回值,用過程

創建語句級觸發器insertEmpTrigger,當對emp表進行insert操作前,顯示"hello world"
create or replace trigger insertEmpTrigger
before
insert
on emp
begin
dbms_output.put_line('插入記錄之前執行');
end;
/

刪除觸發器insertEmpTrigger
drop trigger insertEmpTrigger;

使用insert語句操縱表,引起觸發器工作
insert into emp(empno,ename,job,sal) values(1122,'JACK','IT',5000);

insert into emp
select *
from new_emp;

創建語句級觸發器deleteEmpTrigger,當對emp表進行delete操作后,顯示"world hello"
create or replace trigger deleteEmpTrigger
after
delete
on emp
begin
dbms_output.put_line('刪除記錄之后執行');
end;
/

周一到周五,且9-17點能向數據庫插入數據,否則【raise_application_error('-20000','例外原因')】

分析:
A)周六,周日 不管何時 不能插入數據
B)周一到周五 9-17之外,不包括9和17點,不能插入數據
create or replace trigger securityEmpTrigger
before
insert
on emp
declare
pday varchar2(9);
phour number(2);
begin
select to_char(sysdate,'day') into pday from dual;
--隱式將varchar2轉成number
select to_char(sysdate,'hh24') into phour from dual;
--判斷
if (pday in ('星期六','星期日')) or (phour not between 9 and 17) then
--拋例外,該例是系統的
raise_application_error('-20999','不是工作時間,不能操作數據庫');
end if;
end;
/

創建行級觸發器,漲后工資這一列,確保大于漲前工資【for each row/:new.sal/:old.sal】


create or replace trigger checkSalaryTrigger
after
update of sal
on emp
for each row
begin
--如果更新后的值<更新前的值
if :new.sal < :old.sal then
--拋例外
raise_application_error('-20888','工資不能越漲越低');
end if;
end;
/

update emp set sal=sal+1 where ename='SMITH';

錯誤編號的范圍:[20000-20999]

//--------------------------------------------------------------------------------------------------
***
Java 調用 Oracle 存儲 過程 與 函數
CallableStatement
String sql = "{call raiseSalary(?,?)}";//過程
String sql = "{?=call findEmpNameAndSal(?,?)}";//函數
cstmt.setInt(1,7369);
cstmt.registerOutParameter(2,Types.VARCHAR);
cstmt.execute();
String message = cstmt.getString(2);

過程:findEmpNameAndSalAndJob()
函數:findEmpNameAndSal()
找oracle11的對應的JDBC驅動:E:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc5.jar


//--------------------------------------------------------------------------------------------------

Java 調用 Oracle 存儲 大對象【CLOB 與 BLOB】 4G
private static String driver = "oracle.jdbc.driver.OracleDriver";
//不一定是1521,但優先選用1521端口號
private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
private static String username = "scott";
private static String password = "123456";
文本:CLOB(Character)
多媒體:BLOB(Binary)

//--------------------------------------------------------------------------------------------------

*****
jquery/ajax + struts2 + javabean + hibernate + oracle
需求:
1)使用異步方式,檢查用戶名是否存在,參見<<綜合練習.JPG>>
2)注冊英雄
3)分頁查詢所有英雄


hibernate
query.setFirstResult(0);
query.setMaxResult(6)
框架自動將分頁API轉成oracle專有的頁面語句
oracle

//--------------------------------------------------------------------------------------------------

?


?

?

總結

以上是生活随笔為你收集整理的oracle 存储过程 ,触发器练习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 波多野结衣中文字幕久久 | 啪啪av导航 | 茄子视频色 | 91久久国产 | 操屁股视频 | 日本aa大片 | 国产精品第12页 | 国产精品18p | 久久精品导航 | 欧美成人三级视频 | 日本羞羞网站 | 国产高清自拍视频 | 亚洲一区二区三区在线视频观看 | 黄色网络在线观看 | 永久免费在线播放 | 麻豆视频在线观看 | 欧美嘿咻视频 | 在线观看日韩一区 | 日韩国产欧美一区 | 成人黄色动漫在线观看 | 亚洲一区亚洲二区 | 青青草国内自拍 | 日韩aaaaaa | 亚洲天堂手机在线 | 国产免费一区二区三区在线播放 | 欧美丝袜视频 | 特黄aaaaaaaaa毛片免费视频 | 色婷婷小说 | 性久久久久久久久 | 国模无码国产精品视频 | 菲律宾av| 免费成人深夜 | 男女吻胸做爰摸下身 | 国产免费一区二区三区在线观看 | 欧美我不卡 | 日本成人动漫在线观看 | 性做久久久久久免费观看 | 久久久久久免费观看 | 亚洲综合在线视频 | 成人午夜在线观看视频 | 国产精品亚洲五月天丁香 | 国产精品久久久久9999 | 白丝女仆被免费网站 | 五月婷婷狠狠爱 | 超薄肉色丝袜一区二区 | 男人插入女人阴道视频 | av网址导航 | 日本韩国欧美一区 | 亚洲色图欧美色 | 亚洲精品国产suv一区 | 九九热精品在线观看 | 奇米狠狠777 | 久久r| 伊人久艹 | 果冻传媒18禁免费视频 | 成人在线观看网站 | 国产一二三区在线视频 | 美女久久视频 | 亚洲综合精品国产一区二区三区 | 帮我拍拍漫画全集免费观看 | 国产精品爽爽 | 奇米精品一区二区三区在线观看一 | 久久久久噜噜噜亚洲熟女综合 | 国产三级在线免费 | 色播视频在线 | 在线播放小视频 | 欧美在线视频你懂的 | www.蜜臀av| 香蕉视频黄色片 | 欧美视频免费看 | 极品粉嫩国产18尤物 | 亚洲一卡二卡在线观看 | 欧美色就是色 | 久久亚洲aⅴ无码精品 | 日韩精彩视频在线观看 | 91视频免费看 | 国产456| 草草草av| 国产精品久久久久久久一区二区 | zjzjzjzjzj亚洲女人 | 91精品视频免费在线观看 | 日本黄色成人 | 久久视频免费 | 日本综合色 | 久久久久精彩视频 | 中文字幕高清av | 日本人妻换人妻毛片 | 黄色免费成人 | 九月激情网 | 日本不卡视频一区二区 | 日韩欧美中字 | 国产av第一区 | 欧美精品1区 | 久久精品23 | 亚洲日本在线观看视频 | 欧美成人免费在线观看视频 | 成人中文网 | 亚洲精品免费在线观看视频 | 成人91视频 |