oracle plsql開發 儲存過程綜合練習

2021-08-31 04:26:05 字數 3033 閱讀 4937

--基於表emp和dept

--構造procedure change_salary

--引數:ename in varchar2

salary in number

v_job out varchar2

v_dname out varchar2

--先查詢指定員工,如果查出多條記錄,提示並異常退出;如果沒有該名員工,提示並異常退出。

--否則修改該名員工的薪水,

--輸出引數:該職員的職位,和所在部門的名字,並列印輸出。

--構造上述過程,並寫出在sql editor中的除錯**(給出呼叫方式)

[b]我自己寫的過程:[/b]

create or replace procedure change_salary(v_ename in emp.ename%type,

v_salary in emp.sal%type,

v_job out varchar2,

v_dname out varchar2)

isv_ecount int default 0;

r_emp emp%rowtype;

too_many_salary exception;

begin

select count(1) into v_ecount from emp where emp.ename=v_ename;

if v_ecount=0 then

raise no_data_found;

elsif v_ecount>1 then

raise too_many_rows;

else

begin

select * into r_emp from emp where emp.ename=v_ename;

if r_emp.job!='manager' and v_salary>=8000 then

raise too_many_salary;

else

begin

update emp set sal=v_salary where emp.ename=v_ename;

commit;

v_job:=r_emp.job;

select dname into v_dname from dept where deptno=r_emp.deptno;

dbms_output.put_line('職位:'||v_job||',部門:'||v_dname);

end;

end if;

end;

end if;

exception

when no_data_found then dbms_output.put_line('未查找到該員工,請檢查是否輸入錯誤!');

when too_many_rows then dbms_output.put_line('查詢到'||v_ecount||'個員工,請檢查是否輸入錯誤!');

when too_many_salary then dbms_output.put_line('普通員工不能賺這麼多薪水!');

when others then null;

end change_salary;

create or replace procedure change_salary(

v_ename in emp.ename%type,

v_salary in emp.sal%type,

v_job out emp.job%type,

v_dname out dept.dname%type

) is

v_empno emp.empno%type;

too_many_salary exception;

begin

select e.empno, e.job, d.dname into v_empno, v_job, v_dname

from emp e, dept d

where e.deptno = d.deptno

and upper(ename) = upper(v_ename);

if v_job <> 'manager' and v_salary > 8000 then

raise too_many_salary;

end if;

update emp set sal = v_salary where empno = v_empno;

if sql%found then

dbms_output.put_line('員工姓名為' || v_ename || '的員工的工資已經修改為' || v_salary);

end if;

exception

when no_data_found then

dbms_output.put_line('您輸入的人員姓名' || '對應資訊不存在');

when too_many_rows then

dbms_output.put_line('人員姓名為'||v_ename ||'不止乙個,無法更新!');

when too_many_salary then

dbms_output.put_line('你輸入的工資過高,無法錄入');

when others then

dbms_output.put_line(sqlcode || sqlerrm);

end;

[b]測試方式:[/b]

declare

v_job emp.job%type;

v_dname dept.dname%type;

begin

change_salary('blake',8500,v_job ,v_dname );

if v_job is not null then

dbms_output.put_line('職位:'||v_job||',部門:'||v_dname);

end if;

end;

ps:若是剛剛安裝的oracle ,emp和dept表 在scott/tiger 使用者中存在的

OraclePL SQL儲存過程

create or replace 建立或替換,如果存在就替換,不存在就建立create or replace procedure piscursor cisselect from dept2 for update beginfor row record in c loopif row record...

Oracle PL SQL 儲存過程

1.oracle 提供可以吧pl sql程式儲存在資料庫中,並且可以在任何地方來運用它。這樣就叫儲存過程或者函式。2.建立函式 例 返回helloworld的函式,is相當於declare用於宣告區域性變數,第乙個return只宣告返回型別 create or replace function he...

oracle pl sql之oracle儲存過程

儲存過程是一種命名pl sql程式塊,它可以被賦予引數,儲存在資料庫中,可以被使用者呼叫。由於儲存過程是已編譯好的 所以在呼叫的時候不必再次進行編譯,從而提高了程式的執行效率。另外使用儲存過程可以實現程式的模組化設計 儲存過程的語法 create or replace procedure proce...