1.1.創建一個過程,能向dept表中添加一個新記錄。(in參數)
創建過程
create or replace procedure insert_dept
( num_dept in number, var_ename in varchar2, var_loc in varchar2 ) is
begin
insert into dept
values(num_dept,var_ename,var_loc);
commit;
end insert_dept;
/
調用
begin
insert_dept(79,'技術部','武漢');
end;
/
2.從scott.emp表中查詢給定職工
(提示:使用&來輸入員工編號)的職工姓名和工資。(要求:利用out模式的參數將值傳給調用者。)
創建過程
create or replace procedure select_emp(
num_empno in emp.empno%type,
name out emp.ename%type,
salary out emp.sal%type) is
begin
select ename,sal into name,salary from emp where empno = num_empno;
exception
when no_data_found then
dbms_output.put_line('該部門不存在');
end select_emp;
/
調用
declare
var_name emp.ename%type,
var_salary emp.sal%type) is
begin
select_emp(&員工編號,var_ename,var_salary);
if var_ename is not null then
dbms_output.put_line(var_ename||' '||var_salary);
end if;
end;
/
3.創建一個過程,在執行調用過程時,可隨機輸入emp表中某個雇員的姓名,
根據雇員的姓名,返回該雇員的薪水值,並輸出。(out參數)。
創建過程
create or replace procedure select_emp2(
name in emp.ename%type,
salary out emp.sal%type) is
begin
select sal into salary from emp where ename = name;
exception
when no_data_found then
salary:=0;
end select_emp2;
/
調用
declare
var_sal number(5);
begin
select_emp2('&員工姓名',var_sal);
dbms_output.put_line(var_sal);
end;
/
4.編寫過程,實現交換兩個變量的值的功能。並輸出交換前和交換后的兩個值。(in out參數)
創建過程
create or replace procedure swap(
num1 in out number,
num2 in out number)
is z number(5);
begin
z:=num1;
num1:=num2;
num2:=z;
end swap;
/
調用
declare
x number:=10;
y number:=20;
begin
dbms_output.put_line('交換前x和y的值是:'||x||' '||y);
swap(x,y);
dbms_output.put_line('交換后x和y的值是:'||x||' '||y);
END;
/
5.創建存儲過程,根據員工編號刪除scott.emp表中的相關記錄。
(提示:由調用語句提供的員工編號來刪除記錄,要求員工編號可隨機輸入。)
創建過程
create or replace procedure delete_emp(id dept.empno%type) is
begin
Delete from dept where empno = id;
end delete_emp;
/
調用
execute delete_emp('&員工編號');
6. 創建存儲過程:輸入部門編號,
輸出scott.emp表中該部門所有職工的員工編號、姓名、工作崗位。
(提示:查詢結果是多行,需使用游標,需把游標的定義像變量那樣在過程或函數里定義,
所以游標的定義要放在如下位置:
create or replace procedure 過程名(參數)is
游標的定義;
begin
end;
/
創建過程
create or replace procedure selcet_curemp(
id in emp.deptno%type) is
cursor c1 is select * from emp where deptno = id;
begin
for rec in c1 loop
dbms_output.put_line(rec.empno||' '||rec.empno||' '||rec.job);
end loop;
end;
/
執行存儲過程
execute selcet_curemp(10);
7.編寫一個過程,指定一個員工編號與一個工資增加的百分比,
使emp表中將該員工的工資(sal)增加輸入的百分比。
創建過程
create or replace procedure up_sal( id in number, parsent in float) is
begin
update emp set sal = sal + sal*parsent where empno = id;
end;
/
begin
up_sal(1234,0.5);
end;
/
8.創建函數,從scott.emp表中查詢指定員工編號的職工的工資
create or replace function select_sal(id emp.empno%type) return emp.sal%type is salary emp.sal%type;
begin
select sal into salary from emp where empno = id;
return salary;
end;
/
調用函數有以下四種方式:
方式一:使用變量接收返回值
VAR salary NUMBER;
EXEC :salary:=select_sal(7369);
PRINT salary;
方式二:在SQL語句中直接調用函數
SELECT select_sal(7369) FROM DUAL;
方式三:使用DBMS_OUTPUT調用函數
EXEC dbms_output.put_line('工資是:'|| select_sal(7369));
方式四:在匿名PL/SQL塊中調用函數(推薦使用該種方式-方便好記)
begin
dbms_output.put_line('工資是:'|| select_sal(7369));
end;
/
9.創建函數,返回scott.emp表中指定職工的工資和姓名。
(提示:返回值是兩個,可用return返回一個,另一個用out參數帶回)
create or replace function select_sal_name(id in emp.empno%type,v_name out emp.ename%type)
return emp.sal%type is salary emp.sal%type;
begin
select sal,ename into salary,v_name from emp where empno = id;
return salary;
end;
/
declare
var_name emp.ename%type;
var_sal emp.sal%type;
begin
var_sal:=select_sal_name(7369,var_name);
dbms_output.put_line(var_name||'的工資為'||var_sal);
end;
/
10. 創建函數,根據給定的部門編號(提示: 利用&)計算該部門所有職工的平均工資。
create or replace function avg_sal(id emp.deptno%type) return number is
avgsal number(7,2);
begin
select avg(sal) into avgsal from emp where deptno = id;
return avgsal;
end;
/
begin
dbms_output.put_line(avg_sal(&deptno));
end;
/
11.創建函數,將scott.emp表中工資低於平均工資的職工工資加上200,並返回修改了工資的總人數.
create or replace function fun2 return number is
begin
update emp set sal=sal+200 where sal<(select avg(sal) from emp);
return sql%rowcount;
end;
/
begin
dbms_output.put_line(fun2);
end;
/
12.創建一個函數,僅有一個形參,它接收調用函數中傳遞過來的實參--部門號,
函數的返回值為該部門的一整條記錄信息(注意:此處能夠接收一整條記錄的變量該怎么定義?)。要求在調用函數中輸出該部門的部門名稱與位置。
create or replace function find_dept(dept_no number) return dept%rowtype
is
v_dept dept%rowtype;
begin
select * into v_dept from dept where deptno = dept_no;
return v_dept;
end;
/
declare
v_dept dept%rowtype;
begin
v_dept:=find_dept(30);
dbms_output.put_line(v_dept.dname||'---'||v_dept.loc);
end;
/