1. 程式人生 > >PL/SQL程式設計基礎知識(一)

PL/SQL程式設計基礎知識(一)

--PL/SQL變數的宣告和賦值
declare
  v_ename varchar2(30);--定義變數
begin
  v_ename:='&請輸入名字';--接受鍵盤輸入
  dbms_output.put_line(v_ename);
end;

--put_line :列印換行  ;  put :列印不換行

--接受數字輸入,第一行輸出若使用不換行列印造成輸出失敗
declare
 v_num number;
begin
  v_num:=22;--直接賦值
  dbms_output.put_line(v_num);
end;

--變數中接受表的型別
declare
  v_ename scott.emp.ename%type;--宣告為scott使用者emp表ename欄位型別
begin
  select ename into v_ename from emp where empno=7369;--使用select into給變數賦值
  dbms_output.put_line(v_ename);
end;

--行結果集型別
declare
  v_emprow scott.emp%rowtype;--v_emprow的型別為scott使用者emp表的行型別
begin
  select * into v_emprow from emp where empno=7369;
  dbms_output.put_line('員工姓名'||v_emprow.ename||'  員工薪水'||v_emprow.sal);--oracle字元連線使用||符號
end;

--if選擇結構
declare
  v_score number;
begin
  v_score:='&請輸入oracle資料成績';
  if v_score>90 then dbms_output.put_line('獎勵大大的');
  elsif v_score>80 then dbms_output.put_line('中等');--注意:oracle中的 elsif 和其他程式語言不一樣:其中缺少一個e
  else dbms_output.put_line('繼續努力');
  end if;--if語句塊需要手動結束
end;


--case語句結構
declare
  v_ename scott.emp.ename%type;
  v_deptno scott.emp.deptno%type;
begin
  v_ename:='&請輸入員工姓名';
  select deptno into v_deptno from emp where ename=v_ename;
  case v_deptno
    when 10 then dbms_output.put_line('10');
    when 20 then dbms_output.put_line('20');
    when 40 then dbms_output.put_line('30');
    else dbms_output.put_line('無');
    end case;
end;

select * from dept;
SELECT * FROM EMP;

create table grades(
       id number,
       name varchar2(30),
       course varchar2(30),
       grade number(5,2)
);
insert into grades(id,name,course,grade) values(1,'鄒忌第','語文',90);
insert into grades(id,name,course,grade) values(2,'鄒忌第','數學',90);
insert into grades(id,name,course,grade) values(3,'鄒忌第','外語',90);
insert into grades(id,name,course,grade) values(4,'鄒忌第','物理',90);
insert into grades(id,name,course,grade) values(5,'男生與我','語文',90);
insert into grades(id,name,course,grade) values(6,'男生與我','數學',90);
insert into grades(id,name,course,grade) values(7,'男生與我','外語',90);
insert into grades(id,name,course,grade) values(8,'海軍','語文',90);
insert into grades(id,name,course,grade) values(9,'海軍','數學',90);
insert into grades(id,name,course,grade) values(10,'海軍','外語',90);

select * from grades;

--行轉列

select name,
sum(case when course='語文' then grade else 0 end) as 語文,
sum(case when course='數學' then grade else 0 end) as 數學,
sum(case when course='外語' then grade else 0 end) as 外語,
sum(case when course='物理' then grade else 0 end) as 物理
 from grades group by name;
 
--LOOP迴圈  至少執行一次
declare
 v_num1 number;
 v_num2 number;
begin
  v_num1:='&請輸入數值1';
  v_num2:='&請輸入數值2';
  
  loop
    dbms_output.put_line(v_num1);
    v_num1:=v_num1+1;
    exit when v_num1>v_num2;--退出條件
   end loop;
exception
   when others then
     dbms_output.put_line('unknown exception occurred');
     dbms_output.put_line(sqlcode);--輸出異常對應的編號
     dbms_output.put_line(sqlerrm);--輸出異常對應的資訊
end;

--while迴圈 使用最多 最為靈活

declare
     v_num1 number;
     v_num2 number;
begin
     v_num1:='&請輸入數值1';
     v_num2:='&請輸入數值2';
     
     while v_num1<v_num2 loop
       dbms_output.put_line(v_num1);
       v_num1:=v_num1+1;
      end loop;
exception
  when others then
     dbms_output.put_line('unknown exception occurred');
     dbms_output.put_line(sqlcode);--輸出異常對應的編號
     dbms_output.put_line(sqlerrm);--輸出異常對應的資訊
end;


--for迴圈
declare
     v_num1 number;
     v_num2 number;
     
begin
     v_num1:='&請輸入數值1';
     v_num2:='&請輸入數值2';
     
     for v_result in v_num1.. v_num2 loop --for 變數名 in 迴圈的範圍 loop
       dbms_output.put_line(v_result);--對變數進行操作
     end loop;
exception
  when others then
     dbms_output.put_line('unknown exception occurred');
     dbms_output.put_line(sqlcode);--輸出異常對應的編號
     dbms_output.put_line(sqlerrm);--輸出異常對應的資訊
end;