oracle pl/sql編程(1 )

--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;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章