-- 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时跳出循环。