JavaOracle中几十个实用的PLSQLWord格式.docx
《JavaOracle中几十个实用的PLSQLWord格式.docx》由会员分享,可在线阅读,更多相关《JavaOracle中几十个实用的PLSQLWord格式.docx(11页珍藏版)》请在冰豆网上搜索。
||m||&
||erec.deptno);
END;
/
Q.编写一个PL/SQL程序块以计算某个雇员的年度薪水总额。
esalNUMBER;
eenameemp.ename%TYPE;
SELECT(NVL(sal,0)+NVL(comm,0))*12,enameINTOesal,eenameFROMempWHEREempno=&
DBMS_OUTPUT.PUT_LINE(eename||&
&
sYearsSalaryis&
||esal);
Q.按下列加薪比执行:
DeptnoRaise(%age)
105%
2010%
3015%
4020%
加薪的百分比是以他们现有的薪水为根据的。
写一PL/SQL以对指定雇员加薪。
vcounterNUMBER:
=10;
vraiseNUMBER;
LOOP
EXITWHENvcounter>
40;
UPDATEempsetsal=NVL(sal,0)+NVL(sal,0)*0.05WHEREdeptno=vcounter;
vcounter:
=vcounter+10;
ENDLOOP;
Q.编写一PL/SQL以向"
emp"
表添加10个新雇员编号。
(提示:
如果当前最大的雇员编号为7900,则新雇员编号将为7901到7910)
vcounterNUMBER;
SELECTMAX(empno)INTOvcounterFROMemp;
FORiIN1..10
=vcounter+1;
INSERTINTOemp(empno)VALUES(vcounter);
Q.只使用一个变量来解决实验课作业4。
A
--vraiseNUMBER;
SELECT*INTOerec
FROMemp
WHEREename=&
ename&
;
IFerec.job=&
CLERK&
THEN
UPDATEempSETsal=sal+500WHEREempno=erec.empno;
ELSIFerec.job=&
SALESMAN&
UPDATEempSETsal=sal+1000WHEREempno=erec.empno;
ANALYST&
UPDATEempSETsal=sal+1500WHEREempno=erec.empno;
ELSE
UPDATEempSETsal=sal+2000WHEREempno=erec.empno;
ENDIF;
--UPDATEempSETsal=sal+vraiseWHEREempno=erec.empno;
--DBMS_OUTPUT.PUT_LINE(vraise);
Q.接受两个数相除并且显示结果。
如果第二个数为0,则显示消息"
DIVIDEBYZERO"
。
num1NUMBER;
num2NUMBER;
num1:
=&
num;
num2:
DBMS_OUTPUT.PUT_LINE(num1||&
/&
||num2||&
is&
||num1/num2);
EXCEPTION
WHENZERO_DIVIDETHEN
Didn&
tyourteachertellyounottoDIVIDEBYZERO?
/
第二阶段
Q.编写一个PL/SQL程序块,对名字以"
A"
或"
S"
开始的所有雇员按他们的基本薪水的10%加薪。
CURSORc1IS
SELECT*FROMempWHERESUBSTR(ename,1,1)=&
A&
ORSUBSTR(ename,1,1)=&
S&
FORUPDATEOFsal;
FORiINc1
UPDATEempSETsal=NVL(sal,0)+NVL(sal,0)*0.1WHERECURRENTOFc1;
Q.编写一PL/SQL,对所有的"
销售员"
(SALESMAN)增加佣金500.
SELECT*FROMempWHEREjob=&
UPDATEempSETsal=NVL(sal,0)+500WHERECURRENTOFc1;
Q.编写一PL/SQL,以提升两个资格最老的"
职员"
为"
高级职员"
(工作时间越长,优先级越高)
ORDERBYhiredateFORUPDATEOFjob;
--升序排列,工龄长的在前面
EXITWHENc1%ROWCOUNT>
2;
DBMS_OUTPUT.PUT_LINE(i.ename);
UPDATEempSETjob=&
HIGHCLERK&
WHERECURRENTOFc1;
Q.编写一PL/SQL,对所有雇员按他们基本薪水的10%加薪,如果所增加的薪水大于5000,则取消加薪。
CURSORc1ISSELECT*FROMempFORUPDATEOFsal;
IF(i.sal+i.sal*0.1)<
=5000THEN
UPDATEempSETsal=sal+sal*0.1WHERECURRENTOFc1;
DBMS_OUTPUT.PUT_LINE(i.sal);
Q.显示EMP中的第四条记录。
CURSORc1ISSELECT*FROMemp;
IFc1%ROWCOUNT=4THEN
DBMS_OUTPUT.PUT_LINE(i.EMPNO||&
||i.ENAME||&
||i.JOB||&
||i.MGR||&
||i.HIREDATE||&
||i.SAL||&
||i.COMM||&
||i.DEPTNO);
EXIT;
第三阶段
Q.使用REF游标显示"
EMP"
表中的值。
TYPEemprectypISRECORD
(
EMPNOemp.empno%TYPE,
ENAMEemp.ename%TYPE,
JOBemp.job%TYPE,
MGRemp.mgr%TYPE,
HIREDATEemp.hiredate%TYPE,
SALemp.sal%TYPE,
COMMm%TYPE,
DEPTNOemp.deptno%TYPE
TYPEemp_cursorISREFCURSORRETURNemp%ROWTYPE;
vemp_curEMP_CURSOR;
vemp_recEMPRECTYP;
OPENvemp_curFORSELECT*FROMemp;
FETCHvemp_curINTOvemp_rec;
EXITWHENvemp_cur%NOTFOUND;
DBMS_OUTPUT.PUT(vemp_rec.empno||&
||vemp_rec.ename||&
||vemp_rec.job);
DBMS_OUTPUT.PUT(vemp_rec.mgr||&
||vemp_rec.hiredate||&
||vemp_rec.sal);
DBMS_OUTPUT.PUT_line(vemp_m||&
||vemp_rec.deptno);
CLOSEvemp_cur;
Q.从"
中获得值送到PL/SQL表,将PL/SQL表中的薪水值增加500,并向用户显示增加的薪水及其他详细信息。
TYPEemprecISRECORD
iBINARY_INTEGER:
=1;
TYPEemp_tabISTABLEOFEMPRECINDEXBYbinary_integer;
vempEMP_TAB;
FORxINc1
vemp(i).empno:
=x.empno;
vemp(i).ename:
=x.ename;
vemp(i).job:
=x.job;
vemp(i).mgr:
=x.mgr;
vemp(i).hiredate:
=x.hiredate;
vemp(i).sal:
=x.sal+500;
vemp(i).comm:
=m;
vemp(i).deptno:
=x.deptno;
i:
=i+1;
FORjIN1..i-1
DBMS_OUTPUT.PUT(vemp(j).empno||&
||vemp(j).ename||&
||vemp(j).job);
DBMS_OUTPUT.PUT(vemp(j).mgr||&
||vemp(j).hiredate||&
||vemp(j).sal);
DBMS_OUTPUT.PUT_line(vemp(j).comm||&
||vemp(j).deptno);
Q.一旦将值送到PL/SQL表后,尝试在PL/SQL表中插入新记录并且删除某些现有的记录。
=x.sal;
--FORjIN1..i-1
--LOOP
--DBMS_OUTPUT.PUT(vemp(j).empno||&
--DBMS_OUTPUT.PUT(vemp(j).mgr||&
--DBMS_OUTPUT.PUT_line(vemp(j).comm||&
--ENDLOOP;
--插入记录
插入记录:
=1000;
Goldens&
Software&
=null;
2003-01-04&
=8888;
FORjIN1..i
--删除第5、6条记录
删除第5、6条记录:
FORjIN5..i-2
vemp(j).empno:
=vemp(j+2).empno;
vemp(j).ename:
=vemp(j+2).ename;
vemp(j).job:
=vemp(j+2).job;
vemp(j).mgr:
=vemp(j+2).mgr;
vemp(j).hiredate:
=vemp(j+1).hiredate;
vemp(j).sal:
=vemp(j+2).sal;
vemp(j).comm:
=vemp(j+2).comm;
vemp(j).deptno:
=vemp(j+2).deptno;
vemp(i-1).empno:
vemp(i-1).ename:
vemp(i-1).job:
vemp(i-1).mgr:
vemp(i-1).hiredate:
vemp(i-1).sal:
vemp(i-1).comm:
vemp(i-1).deptno:
FORjIN1..i-2
第四阶段
Q.编写一过程以接受用户输入的三个部门编号并显示其中两个部门编号的部门名称。
CREATEORREPLACEPROCEDUREDeptName(no1dept.deptno%TYPE,no2dept.deptno%TYPE,no3dept.deptno%TYPE)AS
vflagNUMBER;
vdeptno1dept.deptno%TYPE;
vdeptno2dept.deptno%TYPE;
vdname1dept.dname%TYPE;
vdname2dept.dname%TYPE;
vflag:
=TO_NUMBER(TO_CHAR(SYSDATE,&
SS&
));
IF(vflag>
=1ANDvflag<
=10)OR(vflag>
=50ANDvflag<
60)THEN
SELECTdeptno,dnameINTOvdeptno1,vdname1FROMdeptWHEREdeptno=no1;
SELECTdeptno,dnameINTOvdeptno2,vdname2FROMdeptWHEREdeptno=no2;
ELSIF(vflag>
=11ANDvflag<
=20)OR(vflag>
=40ANDvflag<
50)THEN
SELECTdeptno,dnameINTOvdeptno2,vdname2FROMdeptWHEREdeptno=no3;
SELECTdeptno,dnameINTOvdeptno1,vdname1FROMdeptWHEREdeptno=no2;
部门编号:
||vdeptno1||&
||&
部门名称:
||vdname1);
||vdeptno2||&
||vdname2);
EXECUTEDeptName(10,20,30);
Q.编写一过程以显示所指定雇员名的雇员部门名和位置。
CREATEORREPLACEPROCEDU