-- Created on 2014-7-9 by GANG --给last_name为‘Chen’的员工工资涨10%DECLARE VC_LAST_NAME EMPLOYEES.LAST_NAME%TYPE := 'Chen'; V_SALARY EMPLOYEES.SALARY%TYPE; V_AFERT_SALARY EMPLOYEES.SALARY%TYPE;BEGIN SELECT SALARY INTO V_SALARY FROM EMPLOYEES WHERE LAST_NAME = VC_LAST_NAME; DBMS_OUTPUT.PUT_LINE('last_name为Chen的员工工资为:' || V_SALARY); V_SALARY := V_SALARY * 1.1; UPDATE EMPLOYEES SET SALARY = V_SALARY WHERE LAST_NAME = VC_LAST_NAME; IF SQL%FOUND THEN --如果一行或者多行数据被成功修改(增、删、改)返回TRUE; DBMS_OUTPUT.PUT_LINE('UPDATE语句已成功执行,共修改数据条数: ' || SQL%ROWCOUNT); --SQL%ROWCOUNT 返回被DML语句修改的记录行数; END IF; SELECT SALARY INTO V_AFERT_SALARY FROM EMPLOYEES WHERE LAST_NAME = VC_LAST_NAME; DBMS_OUTPUT.PUT_LINE('last_name为Chen的员工工资涨后为:' || V_AFERT_SALARY); COMMIT;EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('没有找到last_name为Chen的员工工资,请检查!'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('存在多条last_name为Chen的员工,请检查!'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || SQLERRM);END;
?输出结果:
last_name为Chen的员工工资为:15979.48UPDATE语句已成功执行,共修改数据条数: 1last_name为Chen的员工工资涨后为:17577.43
?
?
-- Created on 2014-7-9 by GANG --打印出员工编号为200的员工姓名DECLARE C_EMPLOYEE_ID CONSTANT EMPLOYEES.EMPLOYEE_ID%TYPE := 200; --CONSTANT修饰常量,值是不可改变的。 V_FIRST_NAME EMPLOYEES.FIRST_NAME%TYPE; V_LAST_NAME EMPLOYEES.LAST_NAME%TYPE;BEGIN SELECT FIRST_NAME, LAST_NAME INTO V_FIRST_NAME, V_LAST_NAME FROM EMPLOYEES WHERE EMPLOYEE_ID = C_EMPLOYEE_ID; DBMS_OUTPUT.PUT_LINE('员工编号为' || C_EMPLOYEE_ID || '的员工姓名为: ' || V_FIRST_NAME || ' ' || V_LAST_NAME);EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('不存在员工编号为' || C_EMPLOYEE_ID || '的员工信息。'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('存在多条员工编号为' || C_EMPLOYEE_ID || '的员工信息。'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || SQLERRM);END;
?输出结果:
员工编号为200的员工姓名为: Jennifer Whalen
?
?
?
?
记录类型练习:
-- Created on 2014-7-9 by GANG --练习记录类型--创建一个图书记录类型(书号,书名),显示结果为:书号:1100 书名:VB.NetDECLARE -- Local variables here; TYPE BOOK_RECORD IS RECORD( --定义记录类型 T_BOOK_ID NUMBER := 1100, --记录成员 T_BOOK_NAME VARCHAR2(20) := 'VB.Net'); V_BOOK_RECORD BOOK_RECORD; --声明接收数据的变量 TYPE EMPLOYEE_RECORD IS RECORD( --定义记录类型 T_EMPLOYEE_ID EMPLOYEES.EMPLOYEE_ID%TYPE, --记录成员 T_SALARY EMPLOYEES.SALARY%TYPE); V_EMPLOYEE_RECORD EMPLOYEE_RECORD; --声明接收数据的变量 VC_LAST_NAME EMPLOYEES.LAST_NAME%TYPE := 'Chen'; --%ROWTYPE返回一个记录类型,这个记录类型中域类型与定义该记录的表中各列的类型相同。 V_EMPLOYEE_RECORD_TABLE EMPLOYEES%ROWTYPE;BEGIN -- Test statements here DBMS_OUTPUT.PUT_LINE('创建图书记录类型(书号,书名)为: 书号:' || V_BOOK_RECORD.T_BOOK_ID || ' 书名:' || V_BOOK_RECORD.T_BOOK_NAME); --在select into语句中使用plsql记录。 --如果选择列表包含的多个列和表达式,并且使用标量接收数据,就需要定义多个标量, --如果使用plsql记录接收数据就只需要定义一个记录变量即可,从而简化了数据的处理。 SELECT EMPLOYEE_ID, SALARY INTO V_EMPLOYEE_RECORD FROM EMPLOYEES WHERE LAST_NAME = VC_LAST_NAME; DBMS_OUTPUT.PUT_LINE('员工姓名为' || VC_LAST_NAME || '的员工ID为:' || V_EMPLOYEE_RECORD.T_EMPLOYEE_ID || ',员工工资为:' || V_EMPLOYEE_RECORD.T_SALARY); SELECT * INTO V_EMPLOYEE_RECORD_TABLE FROM EMPLOYEES WHERE EMPLOYEE_ID = 200; DBMS_OUTPUT.PUT_LINE(V_EMPLOYEE_RECORD_TABLE.EMPLOYEE_ID || '-' || V_EMPLOYEE_RECORD_TABLE.FIRST_NAME || '-' || V_EMPLOYEE_RECORD_TABLE.LAST_NAME || '-' || V_EMPLOYEE_RECORD_TABLE.SALARY);EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || SQLERRM); END;
?输出结果:
创建图书记录类型(书号,书名)为: 书号:1100 书名:VB.Net员工姓名为Chen的员工ID为:110,员工工资为:15979.48200-Jennifer-Whalen-4400
?
?
?
显示7788号员工的员工号,姓名,工资
-- Created on 2014-7-10 by GANG --显示7788号员工的员工号,姓名,工资declare -- Local variables here v_empno emp.empno%TYPE:=7788; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE;begin SELECT ename, sal INTO v_ename,v_sal FROM emp WHERE empno=v_empno; DBMS_OUTPUT.PUT_LINE('7788号员工的员工号:'||v_empno||',姓名:'||v_ename||',工资:'||v_sal); EXCEPTION WHEN no_data_found THEN DBMS_OUTPUT.PUT_LINE('不存在7788号员工'); WHEN too_many_rows THEN DBMS_OUTPUT.PUT_LINE('存在多条7788号员工数据'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE ||'--'||SQLERRM); end;
?输出结果:
7788号员工的员工号:7788,姓名:SCOTT,工资:3000
?
?