|
执行结果为:?
Sql代码?
- DECLARE??
- ????????* ??
- ????????ERROR?位于第?1?行: ??
- ????????ORA-20001:?编号小于7000的下限! ??
- ????????ORA-06512:?在line?9??
? 说明:在本训练中,使用RAISE_APPLICATION_ERROR引发自定义异常,并以系统错误的方式进行显示。错误编号为20001和20002。? 注意:同上一个训练比较,此种方法不需要事先定义异常,可直接引发。? 可以参考下面的程序片断将出错信息记录到表中,其中,errors为记录错误信息的表,SQLCODE为发生异常的错误编号,SQLERRM为发生异常的错误信息。? DECLARE? ? v_error_code????? NUMBER;? ? v_error_message?? VARCHAR2(255);? BEGIN? ...? EXCEPTION? ...? WHEN OTHERS THEN? ??? v_error_code := SQLCODE ;? ??? v_error_message := SQLERRM ;? ??? INSERT INTO errors? ??? VALUES(v_error_code,v_error_message);? END;? ? 【练习1】修改雇员的工资,通过引发异常控制修改范围在600~6000之间。? 阶段训练? 【训练1】? 将雇员从一个表复制到另一个表。? 步骤1:创建一个结构同EMP表一样的新表EMP1:? CREATE TABLE emp1 AS SELECT * FROM SCOTT.EMP WHERE 1=2;? 步骤2:通过指定雇员编号,将雇员由EMP表移动到EMP1表:?
Sql代码?
- SET?SERVEROUTPUT?ON? ??
- DECLARE??
- v_empno?NUMBER(5):=7788; ??
- emp_rec?emp%ROWTYPE; ??
- BEGIN??
- ?SELECT?*?INTO?emp_rec?FROM?emp?WHERE?empno=v_empno; ??
- ?DELETE?FROM?emp?WHERE?empno=v_empno; ??
- INSERT?INTO?emp1?VALUES?emp_rec; ??
- ?IF?SQL%FOUND?THEN??
- ??COMMIT; ??
- ??DBMS_OUTPUT.PUT_LINE(‘雇员复制成功!‘); ??
- ?ELSE? ??
- ??ROLLBACK; ??
- ??DBMS_OUTPUT.PUT_LINE(‘雇员复制失败!‘); ??
- ?END?IF; ??
- END;??
执行结果为:? 雇员复制成功!? PL/SQL 过程已成功完成。? 步骤2:显示复制结果:? SELECT empno,ename,job FROM emp1;? 执行结果为:? ?
Sql代码?
- EMPNO?ENAME??????JOB ??
- -------------?--------------?----------------???
- ????7788??SCOTT??????ANALYST??
说明:emp_rec变量是根据emp表定义的记录变量,SELECT...INTO...语句将整个记录传给该变量。INSERT语句将整个记录变量插入emp1表,如果插入成功(SQL%FOUND为真),则提交事务,否则回滚撤销事务。试修改雇员编号为7902,重新执行以上程序。? 【训练2】? 输出雇员工资,雇员工资用不同高度的*表示。? 输入并执行以下程序:?
Sql代码?
- SET?SERVEROUTPUT?ON? ??
- BEGIN??
- ?FOR?re?IN?(SELECT?ename,sal?FROM?EMP)??LOOP ??
- ??DBMS_OUTPUT.PUT_LINE(rpad(re.ename,12,‘?‘)||rpad(‘*‘,re.sal/100,‘*‘)); ??
- ?END?LOOP; ??
- END;??
输出结果为:?
Sql代码?
- SMITH???????******** ??
- ALLEN???????????**************** ??
- WARD????????************* ??
- JONES???????????****************************** ??
- MARTIN??????************* ??
- BLAKE???????***************************** ??
- CLARK???????????***************************** ??
- SCOTT???????????****************************** ??
- KING????????????************************************************** ??
- TURNER??????*************** ??
- ADAMS???????*********** ??
- JAMES???????????********** ??
- FORD????????????****************************** ??
- MILLER??????????************* ??
- ?????????执行结果为: ??
- ????????PL/SQL?过程已成功完成。??
? 说明:第一个rpad函数产生对齐效果,第二个rpad函数根据工资额产生不同数目的*。该程序采用了隐式的简略游标循环形式。? 【训练3】? 编写程序,格式化输出部门信息。? 输入并执行如下程序:?
Sql代码?
- SET?SERVEROUTPUT?ON? ??
- ????????DECLARE??
- ?????????v_count?number:=0; ??
- ?????????CURSOR?dept_cursor?IS?SELECT?*?FROM?dept; ??
- ????????BEGIN??
- ??????????DBMS_OUTPUT.PUT_LINE(‘部门列表‘); ??
- DBMS_OUTPUT.PUT_LINE(‘---------------------------------‘); ??
- ?????????FOR?Dept_record?IN?dept_cursor?LOOP??? ??
- ?????????DBMS_OUTPUT.PUT_LINE(‘部门编号:‘||?Dept_record.deptno); ??
- ?????????DBMS_OUTPUT.PUT_LINE(‘部门名称:‘||?Dept_record.dname); ??
- ????????????DBMS_OUTPUT.PUT_LINE(‘所在城市:‘||?Dept_record.loc); ??
- DBMS_OUTPUT.PUT_LINE(‘---------------------------------‘); ??
- ??????v_count:=?v_count+1; ??
- ????????END?LOOP; ??
- ?????????DBMS_OUTPUT.PUT_LINE(‘共有‘||to_char(v_count)||‘个部门!‘); ??
- ????????END;??
输出结果为:?
Sql代码?
- 部门列表 ??
- ------------------------------------???
- 部门编号:10 ??
- 部门名称:ACCOUNTING ??
- 所在城市:NEW?YORK ??
- ------------------------------------???
- 部门编号:20 ??
- 部门名称:RESEARCH ??
- 所在城市:DALLAS ??
- ... ??
- 共有4个部门! ??
- PL/SQL?过程已成功完成。??
? 说明:该程序中将字段内容垂直排列。V_count变量记录循环次数,即部门个数。? 【训练4】? 已知每个部门有一个经理,编写程序,统计输出部门名称、部门总人数、总工资和部门经理。? 输入并执行如下程序:?
Sql代码?
- SET?SERVEROUTPUT?ON? ??
- DECLARE??
- ?v_deptno?number(8); ??
- ?v_count?number(3); ??
- ?v_sumsal?number(6); ??
- ?v_dname??varchar2(15); ??
- v_manager??varchar2(15); ??
- ?CURSOR?list_cursor?IS??
- ???SELECT?deptno,count(*),sum(sal)?FROM?emp?group?by?deptno; ??
- BEGIN??
- ??OPEN?list_cursor;? ??
- ??DBMS_OUTPUT.PUT_LINE(‘-----------?部?门?统?计?表?-----------‘); ??
- DBMS_OUTPUT.PUT_LINE(‘部门名称???总人数??总工资???部门经理‘); ??
- ??FETCH?list_cursor?INTO?v_deptno,v_count,v_sumsal;? ??
- ??WHILE?list_cursor%found?LOOP?? ??
- ?SELECT?dname?INTO?v_dname?FROM?dept ??
- ????WHERE?deptno=v_deptno; ??
- ????SELECT?ename?INTO?v_manager?FROM?emp? ??
- ????WHERE?deptno=v_deptno?and?job=‘MANAGER‘; ??
- DBMS_OUTPUT.PUT_LINE(rpad(v_dname,13)||rpad(to_char(v_count),8) ??
- ??????||rpad(to_char(v_sumsal),9)||v_manager); ??
- ????FETCH?list_cursor?INTO?v_deptno,v_sumsal;? ??
- ????END?LOOP; ??
- ????????DBMS_OUTPUT.PUT_LINE(‘--------------------------------------‘); ??
- ????????CLOSE?list_cursor; ??
- ????????END;??
输出结果为:?
Sql代码?
- --------------------?部?门?统?计?表?-----------------???
- ????????部门名称?????总人数??总工资?????部门经理 ??
- ????????ACCOUNTING????3??????8750???????CLARK ??
- ????????RESEARCH??????5?????10875???????JONES ??
- ????????SALES?????????????6??????9400???????BLAKE ??
- ????????-------------------------------------------------------------???
- ????????PL/SQL?过程已成功完成。???
(编辑:安卓应用网_ASP源码网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|