-
plsql基本語法
plsql 就是在sql語句中增加了變量,流程控制,函數,使得sql語句具有更強大的功能
基本結構:declare 定義變量 begin select * from 表;--執行會報錯,可以增刪改,但查的時候要用into select xxx into v_xxx from 表 where xxx; end;
emp%rowtype 行類型
emp.sal%type 和emp表中sal列的類型一樣
record 記錄集類型
例如:
直接賦值
declare
v_name varchar2(50);
begin
v_name:='熊二';
dbms_output.put_line(v_name);
end;
用'/'來執行
打開輸出功能:
set serveroutput on;
根據查詢結果來賦值
declare
v_name varchar2(50);
begin
select ename into v_name from emp where empno=7782;
dbms_output.put_line(v_name);
end;
根據鍵盤輸入來賦值
declare
v_name varchar2(50);
begin
v_name:='&輸入姓名';
dbms_output.put_line(v_name);
end;
輸入部門編號,查詢部門工資最高的員工姓名和職位
declare
v_deptno number(5);
v_ename varchar2(20);
v_job varchar2(30);
begin
v_deptno:=&輸入部門編號;
select ename,job into v_ename,v_job from emp where sal=
(
select max(sal) from emp where deptno=v_deptno
);
dbms_output.put_line(v_deptno||'部門工資最高的員工是:'||v_ename||' 職位:'||v_job);
end;
根據員工編號去查名字
寫法1:
declare
v_name varchar2(50);
begin
select ename into v_name from emp where empno=&empno;
dbms_output.put_line(v_name);
end;
寫法2:
參照某一列的數據類型去定義數據類型
declare
v_name emp.ename%type;
begin
select ename into v_name from emp where empno=&empno;
dbms_output.put_line(v_name);
end;
參照某一行的數據類型,有多少列就定義多少變量
declare
v_emprow emp%rowtype;
begin
select * into v_emprow from emp where empno=&empno;
dbms_output.put_line(v_emprow.ename || v_emprow.job);
end;
定義一個數據類型,參照其他表中的數據類型
declare
type MyType is record
(
t_empno emp.empno%type,
t_ename emp.ename%type,
t_job emp.job%type,
t_sal emp.sal%type
);
v_emprow MyType;
begin
select empno,ename,job,sal into v_emprow from emp where empno=&empno;
dbms_output.put_line(v_emprow.t_ename || v_emprow.t_job);
end;
2.流程控制
--if..else..
declare
v_job emp.job%type;
begin
select job into v_job from emp where empno=&empno;
if v_job='MANAGER' then
dbms_output.put_line('是經理');
else
dbms_output.put_line('不是經理');
end if;
end;
--if..elsif..else..
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=&no;
if v_sal <=1000 then
dbms_output.put_line('藍領');
elsif v_sal <=2000 then
dbms_output.put_line('白領');
else
dbms_output.put_line('金領');
end if;
end;
--case等值
declare
v_job emp.job%type;
begin
select job into v_job from emp where empno=&no;
case
v_job
when 'CLERK' then dbms_output.put_line('科員');
when 'ANALYST' then dbms_output.put_line('分析師');
when 'SALESMAN' then dbms_output.put_line('銷售員');
when 'MANAGER' then dbms_output.put_line('經理');
when 'PRESIDENT' then dbms_output.put_line('董事長');
else dbms_output.put_line('不明職位');
end case;
end;
--case條件
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=&no;
case
when v_sal>=3000 then dbms_output.put_line('金領');
when v_sal>=2000 then dbms_output.put_line('白領');
when v_sal>=1000 then dbms_output.put_line('藍領');
else dbms_output.put_line('無領');
end case;
end;
練習
1.輸入員工編號,如果工資高於他所在部門的平均工資,輸出工資較高,否則輸出工資較低
declare
v_sal emp.sal%type;
v_deptno emp.deptno%type;
v_avgsal emp.sal%type;
begin
select sal,deptno into v_sal,v_deptno from emp where empno=&no;
select avg(sal) into v_sal from emp where deptno=v_deptno;
dbms_output.put_line(v_sal||''||v_avgsal);
if v_sal < v_avgsal then dbms_output.put_line('工資較低');
else dbms_output.put_line('工資較高');
end if;
end;
方法2:
declare
v_sal emp.sal%type;
v_empno emp.empno%type;
v_avgsal emp.sal%type;
begin
v_empno:=&empno;
select sal into v_sal from emp where empno=v_empno;
select avg(sal) into v_avgsal from emp where deptno=
(
select deptno from emp where empno=v_empno
);
if v_sal < v_avgsal then dbms_output.put_line('工資較低');
else dbms_output.put_line('工資較高');
end if;
end;
2.輸入一個員工編號,輸出他入職的季節
declare
v_hiredate emp.hiredate%type;
v_month number(4);
begin
select hiredate into v_hiredate from emp where empno=&no;
select to_number(to_char(v_hiredate,'mm')) into v_month from dual;
case
when v_month >3 and v_month<6 then dbms_output.put_line('春');
when v_month >6 and v_month<9 then dbms_output.put_line('夏');
when v_month >9 and v_month<12 then dbms_output.put_line('秋');
else dbms_output.put_line('冬');
end case;
end;
方法2:
declare
v_month number(4);
begin
select to_number(to_char(hiredate,'mm')) into v_month from emp where empno=&no;
case
when v_month between 1 and 3 then dbms_output.put_line('春');
when v_month between 4 and 6 then dbms_output.put_line('夏');
when v_month between 7 and 9 then dbms_output.put_line('秋');
when v_month between 10 and 12 then dbms_output.put_line('冬');
end case;
end;
3.循環結構
3.1.loop
語法:
LOOP
語句;
EXIT WHEN <條件>
END LOOP;
--輸出1到10
declare
v_i number(5);
begin
v_i:=1;
loop
dbms_output.put_line(v_i);
v_i:=v_i+1;
exit when v_i>10;
end loop;
end;
--如果要使用put不換行的輸出,要結合put_line,否則可能看不到輸出結果
declare
v_i number(5);
begin
v_i:=1;
loop
dbms_output.put(v_i);
v_i:=v_i+1;
exit when v_i>10;
end loop;
dbms_output.put_line(' ');
end;
3.2.WHILE LOOP
語法:
WHILE <條件>
LOOP
語句;
END LOOP;
--與loop不同的是while loop把循環條件放到前面來
declare
v_i number(5);
begin
v_i:=1;
while v_i<=10 loop
dbms_output.put_line(v_i);
v_i:=v_i+1;
end loop;
end;
3.3.FOR
語法:
FOR <循環變量> IN 下限…上限
LOOP
語句;
END LOOP;
--從1循環到10
--當不需要定義變量時可以不寫declare
begin
for v_i in 1 .. 10
loop
dbms_output.put(v_i);
end loop;
dbms_output.put_line('');
end;
練習:
--輸出九九乘法表
begin
for v_i in 1 .. 9
loop
for v_j in 1 .. v_i
loop
dbms_output.put(v_i||'*'||v_j||'='||v_i*v_j||' ');
end loop;
dbms_output.put_line('');
end loop;
end;
--輸出金字塔
*
***
*****
*******
*********
***********
begin
for v_i in 1 .. 6 loop
dbms_output.put_line(lpad(lpad('*',2*v_i-1,'*'),6+v_i,' '));
end loop;
end;