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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于成都笔试中的PL/SQL准备,我可以为你提供一些指导和建议。PL/SQL是一种过程式编程语言,用于Oracle数据库的开发和管理。下面是一些可以帮助你准备PL/SQL笔试的建议: 1. 理解PL/SQL语法:掌握PL/SQL的基本语法结构,包括变量声明、条件语句、循环语句、游标和异常处理等。熟悉这些基础知识对于理解和编写PL/SQL代码至关重要。 2. 学习SQL语句:PL/SQL是建立在SQL语言基础上的,所以熟悉SQL语句也是非常重要的。掌握SQL查询、插入、更新和删除等基本操作,以及表连接、子查询和聚合函数等高级查询技巧。 3. 理解存储过程和函数:PL/SQL的核心概念是存储过程和函数。了解它们的定义、调用和使用方法,以及参数传递、返回值和异常处理等方面的知识。 4. 掌握PL/SQL的高级特性:学习PL/SQL的高级特性,如游标、触发器和包等。了解它们的用途和使用方法,以及与数据库交互和数据处理的相关技巧。 5. 多做练习题和项目实践:通过做一些练习题和实际项目,加深对PL/SQL的理解和应用能力。可以使用在线编程平台或者自己搭建一个本地的Oracle数据库环境。 6. 阅读相关文档和教程:阅读Oracle官方文档和一些相关的教程和书籍,可以帮助你更全面地了解和掌握PL/SQL的知识。 希望以上建议对你有所帮助!祝你在成都笔试中取得好成绩!如果你还有其他问题,可以继续向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值