当前位置: 代码迷 >> SQL >> PL/SQL习题
  详细解决方案

PL/SQL习题

热度:73   发布时间:2016-05-05 11:17:30.0
PL/SQL练习
-- 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

?

?

  相关解决方案