--pl/sql:分爲三個部分,聲明,可執行,異常處理。
declare
avgSalary number(10);
begin
select avg(sal)into avgSalary from emp;
dbms_output.put_line('平均工資:'||avgSalary);
end;
--聲明變量
declare
var1 表名稱.字段名稱%type;
var2 表名稱%rowtype;
--給變量賦值
--有兩種賦值方式;
--第一種::=
--第二種:select ... into ... from table_name where ...;
declare
x number(10) :=100;
begin
dbms_output.put_line('Values:'||x);
end;
--通過鍵盤輸入員工編號,打印員工信息;
declare
input number(4);
x nvarchar2(10);
y nvarchar2(9);
z number(7,2);
begin
input:='&no';
select ename,job,sal into x,y,z from emp where empno=input;
dbms_output.put_line('員工姓名:'||x||',員工職位:'||y||',員工工資:'||z);
end;
-- 如果員工表薪水最高的工資是否大於3000,如果是,則在此基礎上加上500,如果不是則輸入錯誤信息;
declare
emp_no number(4);
max_salary number(7,2);
begin
select max(sal)into max_salary from emp;
select empno into emp_no from emp where sal=max_salary;
if max_salary>3000 then
update emp set sal=sal+500 where empno=emp_no;
max_salary:=max_salary+500;
dbms_output.put_line('更新後的最高薪水:'||max_salary);
end if;
commit;
exception
when others then
dbms_output.put_line('最高薪水小於了3000:'||sqlerrm);
end;
--聲明常量:
--使用:constant定義常量
--常量必須在聲明時候賦值
--常量被賦值之後是不能改
declare
num number(20);
begin
num:='12.5';
dbms_output.put_line(num);
end;
--if() then elsif() then.....
--輸入編號
--得到薪水
--小於2000加1000,小於3000或大於2000加800,大於3000的加500;
declare
emp_no number(4);
emp_salary number(7,2);
begin
emp_no:='&empno';
select sal into emp_salary from emp where empno=emp_no;
if (emp_salary>3000) then
update emp set sal=sal+500 where empno=emp_no;
emp_salary:=emp_salary+500;
dbms_output.put_line('更新後的最高薪水:'||emp_salary);
elsif (emp_salary<3000 and emp_salary>2000) then
update emp set sal=sal+800 where empno=emp_no;
emp_salary:=emp_salary+800;
dbms_output.put_line('更新後的最高薪水:'||emp_salary);
elsif (emp_salary<2000) then
update emp set sal=sal+100 where empno=emp_no;
emp_salary:=emp_salary+1000;
dbms_output.put_line('更新後的最高薪水:'||emp_salary);
end if;
commit;
exception
when others then
dbms_output.put_line('最高薪水小於了3000:'||sqlerrm);
end;
--分別打印出員工薪金的前五名
---循環語句
--loop循環
declare
emp_name nvarchar2(10);
emp_job nvarchar2(9);
emp_salary number(7,2);
emp_rank number(1);
begin
emp_rank:=0;
loop
emp_rank:=emp_rank+1;
if(emp_rank>=6) then exit;
end if;
select ename,job,sal into emp_name,emp_job,emp_salary from (
select ename,job,sal, row_number() over(order by sal desc) as sal_rank from emp) temp where(temp.sal_rank=emp_rank);
dbms_output.put_line('員工編號:'||emp_name||',員工姓名:'||emp_job||',員工工資:'||emp_salary);
end loop;
end;
--for循環
declare
emp_name nvarchar2(10);
emp_job nvarchar2(9);
emp_salary number(7,2);
emp_rank number(1);
begin
for emp_rank in reverse 1..5 loop
select ename,job,sal into emp_name,emp_job,emp_salary from (
select ename,job,sal, row_number() over(order by sal desc) as sal_rank from emp) temp where temp.sal_rank=emp_rank;
dbms_output.put_line('員工編號:'||emp_name||',員工姓名:'||emp_job||',員工工資:'||emp_salary);
end loop;
end;
--while 循環
declare
emp_name nvarchar2(10);
emp_job nvarchar2(9);
emp_salary number(7,2);
emp_rank number(1);
begin
emp_rank:=0;
while emp_rank<5 loop
emp_rank:=emp_rank+1;
select ename,job,sal into emp_name,emp_job,emp_salary from (
select ename,job,sal, row_number() over(order by sal desc) as sal_rank from emp) temp where temp.sal_rank=emp_rank;
dbms_output.put_line('員工編號:'||emp_name||',員工姓名:'||emp_job||',員工工資:'||emp_salary);
end loop;
end;
-----------------------------------goto語句
declare
emp_no emp.empno%type;
emp_name emp.ename%type;
emp_job emp.job%type;
emp_sal emp.sal%type;
begin
emp_no:='7369';
select sal into emp_sal from emp where empno=emp_no;
if(emp_sal>3000) then
goto m;
elsif(emp_sal>1600 and emp_sal<3000)then
goto n;
else
dbms_output.put_line('不做操作!');
end if;
<<n>>
update emp set sal=sal+500 where empno=emp_no;
select empno,ename,job,sal into emp_no,emp_name,emp_job,emp_sal from emp where empno=emp_no;
dbms_output.put_line(emp_no||emp_name||emp_job||emp_sal);
<<m>>
null;
end;
-----------------------------執行動態創建表的語句
select * from emp_01;
drop table emp_01;
declare
eno emp.empno%type;
sql_01 varchar2(200);
sql_02 varchar2(200);
emp_records emp%rowtype;
begin
eno:='&empno';
execute immediate 'create table emp_01(
emp_no number(4),emp_name nvarchar2(10)
)';
sql_01:='select * from emp where empno=:id';
execute immediate sql_01 into emp_records using eno;
sql_02:='insert into emp_01 values(:empno,:ename)';
execute immediate sql_02 using emp_records.empno,emp_records.ename;
exception
when others then
dbms_output.put_line('操作失敗');
end;
-----------------------------自定義異常處理
declare
e exception;
cash number(4);
begin
cash:='&輸入取款金額:';
if(cash>2500) then
raise e;
else
dbms_output.put_line('取款成功');
end if;
exception
when e then
dbms_output.put_line('每次最多隻能取2500元');
end;
----------------------------使用記錄類型
declare
type myrecord is record(
dept_no dept.deptno%type,
dept_name dept.dname%type,
dept_loc dept.loc%type
);
real_record myrecord;
begin
select * into real_record from dept where deptno=10;
dbms_output.put_line(real_record.dept_no||real_record.dept_name||real_record.dept_loc);
end;
select * from dept;
select * from emp;
--練習1
--寫一個塊、 從界面輸入一個僱員的姓名,如果該僱員是ACCOUNTING的
再判斷如果是部門經理工資加2000元。項目經理加1700,軟件開發工程師加1500
運行完後,查看薪水是否增加
SET SERVEROUTPUT ON
--練習2
--用%type定義一個僱員姓名的常量,根據該僱員的姓名取出該僱員中的姓名,職位,部門以及薪水並打印出來(用%rowtype類型的變量)
declare
emp_name emp.ename%type;
emp_records emp%rowtype;
dept_name dept.dname%type;
begin
emp_name:='&name';
select * into emp_records from emp where ename=emp_name;
select dname into dept_name from dept where deptno=emp_records.deptno;
dbms_output.put_line('僱員名稱:'||emp_records.ename||'工作職位:'||emp_records.job||'部門名稱:'||dept_name||'員工薪金:'||emp_records.sal);
end;
--練習3
--如果輸入一個員工的編碼,超過了存儲的範圍。捕獲value_error 的異常。
declare
emp_no emp.empno%type;
begin
emp_no:='&empno';
exception
when value_error then
dbms_output.put_line('輸入編號超過了存儲的範圍');
end;
-- 練習4
--自定義異常,如果修改員工工資時,工資超過了5000,則觸發自定義異常。顯示月薪不能大於5000。
declare
e exception;
emp_no emp.empno%type;
emp_sal emp.sal%type;
begin
emp_no:='7839';
update emp set sal=sal+500 where empno=emp_no;
select sal into emp_sal from emp where empno=emp_no;
if(emp_sal>5000) then
raise e;
else
commit;
end if;
exception
when e then
rollback;
dbms_output.put_line('顯示月薪不能大於5000');
end;
--練習5
--創建一個表來存放sql語句,寫一個塊執行動態sql,讀取表中的sql執行。
select * from sql_table;
select * from DEPT;
declare
type myrecord is record(
rN number(4),
sta varchar2(200)
);
re myrecord;
rowN number(4);
sql_sta varchar2(200);
sql_insert_statement varchar2(200);
sql_excute_statement varchar2(200);
cou number(20);
begin
--判斷表是否存在
select count(*) into cou from user_tables where table_name='SQL_TABLE';
if(cou<=0) then
execute immediate 'create table sql_table (rowNo number(4),sql_sta varchar2(200))';
end if;
-- rowN:='1';
-- sql_sta:='&sql_query';
-- sql_insert_statement:='insert into sql_table values(:rowNo,:statement)';
--execute immediate sql_insert_statement using rowN,sql_sta;
select * into re from sql_table where ROWNO=1;
sql_excute_statement:=re.sta;
execute immediate sql_excute_statement;
dbms_output.put_line(re.sta);
end;
oracle pl/sql編程(1 )
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.