當前位置:首頁 » 存儲配置 » 存儲過程練習

存儲過程練習

發布時間: 2022-05-17 23:40:28

Ⅰ 有沒有plsql存儲過程的例子,想練習練習

我給你出個題:

輸入學號,查詢他選修課程的最高分,最低分和平均分並輸出

Ⅱ 創建存儲過程,使用OUT類型參數獲得雇員經理名,怎麼做,

--一共兩個想法,你看看哪個你喜歡
--第一個想法是傳一個編號,返回一個值
--過程
create or replace procere wangsc_pro(
p_number in number,
p_name out varchar2
)
as
cursor cur_emp is
select m.ename from emp w join emp m on w.mgr=m.empno and w.empno=p_number;
begin
open cur_emp;
loop
fetch cur_emp into p_name;
exit when cur_emp%notfound;
end loop;
close cur_emp;
end;
--調用
declare
v_empno emp.empno%type:=7369;
v_ename emp.ename%type;
begin
wangsc_pro(v_empno,v_ename);
dbms_output.put_line('雇員:'||v_empno||'--經理:'||v_ename);
end;
--第二個想法是不傳參數,返回記錄集
--定義一個包
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;
--過程
create or replace procere wangsc_pro(
p_cursor out testpackage.test_cursor
)
as
v_sql varchar2(1000);
begin
v_sql := 'select w.ename,m.ename from emp w join emp m on w.mgr=m.empno';
open p_cursor for v_sql;
end;
--調用
declare
v_wename emp.ename%type;
v_mename emp.ename%type;
pp_cursor testpackage.test_cursor;
begin
wangsc_pro(pp_cursor);
loop
fetch pp_cursor into v_wename,v_mename;
exit when pp_cursor%notfound;
dbms_output.put_line('雇員:'||v_wename||'-經理:'||v_mename);
end loop;
close pp_cursor;
end;

Ⅲ 什麼是存儲過程,要學習存儲過程要看些什麼書

存儲過程(Stored Procere)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,存儲在資料庫中,經過第一次編譯後再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。
通俗的講存儲過程就是一組SQL語句的集合,來實現特定功能,類似於系統函數一樣。
你要學習存儲過程必須掌握基本的SQL語法,學習存儲過程需要多練習,至於書籍的話任何一本資料庫書應該都有吧。
希望可以幫助到你。

Ⅳ 資料庫題習題創建帶輸入參數的存儲過程P_ cust_credit_level,根據輸入參數更新

mysql存儲
DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `p_EventTest`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `p_EventTest`(
in v_code varchar(255)
)
BEGIN
/*定義異常標示符*/
declare t_status int default 0 ;

declare continue handler for sqlstate '23000' set t_status = 1;
declare continue handler for sqlexception set t_status = 2;

/*開啟事物*/
start transaction ;
update 表名 set 欄位名=v_code where 條件 ;

if t_status <> 0 then
rollback ;
else
commit ;
end if ;
END$$

DELIMITER ;

Ⅳ 寫SQL的存儲過程語句有什麼好的學習方法嗎 說仔細一點

說實話你這個問題很大,並且很多人都想走捷徑,還是那句話,書山有路勤為徑。

滄海一粟 的說法我認為是很對的,我在總結一下不知道對你有沒有幫助。
1、當你了解T-SQL後,你得了解你所使用的關系資料庫,不同的關系資料庫會有一些區別。
2、多試著練習,從簡單到難。當然你可以多看例子,如果是初學者建議使用SQL server的,因為在它的查詢分析器的語法提示要准確得多,並且會提示出錯在那行,這樣修起來要簡單得多。
3、關於創建存儲過程的 例子在sql server中也很多,象sp_who,sp_who2等都是系統存儲過程可以打開來看看學一下語法,和技巧。
4、關於技巧那你就得慢來累計了,比如:在過程中能不用游標就不要用,游標容易造成死鎖並且執行速度不是很快,多使用臨時表,可以用臨時表的自增列來做為循環的序號替換游標。對於大數據的臨時表也要創建索引,創建索引可以提示檢索速度。
5、如果要說規范當然按書上說的規范來寫是不會錯的,比如你寫了begin 那你得 換行寫上end 然後在begin與end中寫你的語句。這樣你就不容易忘掉了,呵呵。

Ⅵ 資料庫存儲過程的習題

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[book_total]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[book_total]
GO

CREATE procere book_total (@allvalue int output)
as
begin
select @allvalue = Sum(價格) from book
end
GO

Ⅶ 怎樣學習存儲過程比較好

首先要學習一下相關的數據語言了解各種語言的結構,參照樣例嘗試學習各類操作以實踐為主這樣學習比較實用一些

Ⅷ 誰有ORACLE關於存儲過程和觸發器的上機練習題極代碼呀能幫忙發一份么,有幾個例題也行,本人乃初

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 procere hello
as
begin
dbms_output.put_line('這就是存儲過程');
end;
/
刪除存儲過程hello
drop procere hello;
調用存儲過程方式一【exec 存儲過程名】
exec hello;
調用存儲過程方式二【PLSQL程序】
begin
--調用存儲過程
hello;
end;
/
調用存儲過程方式三【JDBC】
CallableStatement
創建有參存儲過程raiseSalary(編號),為7369號員工漲10%的工資,並顯示出漲前和漲後的工資【演示in的用法,默認in】
create or replace procere 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 procere
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 al;
--隱式將varchar2轉成number
select to_char(sysdate,'hh24') into phour from al;
--判斷
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;
/

Ⅸ sql server存儲過程要怎麼練啊,我是做.NET的,不知道要怎麼練才會比較快上手,感覺每次寫存儲過程都笨笨的

只有一法:
多練習,多寫代碼,有不會的發出來。
別無捷徑可走。

熱點內容
本地ip可以搭伺服器嗎 發布:2024-11-15 21:04:27 瀏覽:162
阿里巴巴python 發布:2024-11-15 20:56:25 瀏覽:782
博圖腳本編輯 發布:2024-11-15 20:41:06 瀏覽:312
帶密碼的箱子鑰匙在哪裡 發布:2024-11-15 20:40:12 瀏覽:236
兩個次梁相交怎麼配置 發布:2024-11-15 20:27:35 瀏覽:373
android關機實現 發布:2024-11-15 20:26:42 瀏覽:56
木糠壓縮原理 發布:2024-11-15 20:22:53 瀏覽:654
編譯原理難以理解的問題 發布:2024-11-15 20:11:25 瀏覽:130
安卓9是什麼水平 發布:2024-11-15 20:06:57 瀏覽:185
intel快速存儲ssd 發布:2024-11-15 20:00:27 瀏覽:143