PL/SQL练习
程序员文章站
2022-06-21 15:33:37
...
-- 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.48 UPDATE语句已成功执行,共修改数据条数: 1 last_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.Net DECLARE -- 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.48 200-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
可变数据练习:
-- Created on 2014-7-10 by GANG --可变数组练习 --格式:TYPE type_name IS VARRAY (maximum_size) OF element_type [NOT NULL] -- type_name是新可变长数组类型的类型名。 -- maximum_size是一个指定可变数组中元素最大数目的整数。 -- element_type是一个PL/SQL标量、记录或对象类。 -- NOT NULL子串表示集合中的每一个元素都必须有值 --例如: type numberlist is varray(10) of number(5); -- type recordlist is varray(5) of dept%rowtype; DECLARE TYPE STRINGS IS VARRAY(6) OF VARCHAR2(10); V_STRING_LIST STRINGS := STRINGS('aa', 'bb', 'cc', 'dd', 'ee'); --初始化 I INTEGER := 1; BEGIN V_STRING_LIST.EXTEND; --数组末尾添加一个元素 V_STRING_LIST(6) := 'extended'; V_STRING_LIST.TRIM; --数组末尾删除一个元素。 DBMS_OUTPUT.PUT_LINE('strings可变数组的长度为:' || V_STRING_LIST.COUNT); /*LOOP --简单循环,必须以子句EXIT WHEN 结束循环 DBMS_OUTPUT.PUT_LINE('strings可变数组的第' || I || '位的值为:' || V_STRING_LIST(I)); I := I + 1; EXIT WHEN I > V_STRING_LIST.COUNT;--EXIT WHEN 子句是必须的,否则循环将无法停止。 END LOOP;*/ /*WHILE i<=V_STRING_LIST.count LOOP --WHILE循环,可以使用EXIT WHEN 结束循环 DBMS_OUTPUT.PUT_LINE('strings可变数组的第' || I || '位的值为:' || V_STRING_LIST(I)); I := I + 1; END LOOP;*/ FOR I IN 1 .. V_STRING_LIST.COUNT LOOP --FOR循环,‘1 .. V_STRING_LIST.COUNT’是FOR循环的范围。 DBMS_OUTPUT.PUT_LINE('strings可变数组的第' || I || '位的值为:' || V_STRING_LIST(I)); END LOOP; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE || '--' || SQLERRM); END;
输出结果:
strings可变数组的长度为:5 strings可变数组的第1位的值为:aa strings可变数组的第2位的值为:bb strings可变数组的第3位的值为:cc strings可变数组的第4位的值为:dd strings可变数组的第5位的值为:ee
GOTO练习:
-- Created on 2014-7-11 by GANG -- GOTO语句 -- GOTO label; -- <<label>> /*标号是用<< >>括起来的标识符 */ DECLARE -- Local variables here -- I INTEGER; BEGIN FOR I IN 1 .. 10 LOOP DBMS_OUTPUT.PUT_LINE('当前i值为:' || I); IF I > 5 THEN GOTO ENDOFLOOP; END IF; END LOOP; <<ENDOFLOOP>> DBMS_OUTPUT.PUT_LINE('当i大于5时跳出循环。'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE || '--' || SQLERRM); END;
输出结果:
当前i值为:1 当前i值为:2 当前i值为:3 当前i值为:4 当前i值为:5 当前i值为:6 当i大于5时跳出循环。