zoukankan      html  css  js  c++  java
  • PL/SQL基础2(笔记)

    1 第一个PL/SQL的程序

    DECLARE
    
    BEGIN
    
      DBMS_OUTPUT.PUT_LINE('Hello World!');
    
    END;
    
    /

     

    --2一个简单的PL/SQL程序

    DECLARE
    
       v_num NUMBER;
    
    BEGIN
    
       v_num:=30;
    
       dbms_output.put_line('v_num变量内容是:'||v_num);
    
    END;
    
    /
    
     

    --3输入 一个员工编号,而后取得员工姓名

     

     

    DECLARE
    
      v_eno  NUMBER:=&ID;
    
      v_ename VARCHAR2(20);
    
    BEGIN
    
        SELECT ename INTO v_ename
    
        FROM emp
    
        WHERE empno=v_eno;
    
        dbms_output.put_line('编号为:'||v_eno||' 员工姓名:'||v_ename);
    
    END;
    
    /

    --变量的声明与赋值%type和%rowtype的使用

    --定义变量不设置默认值

    DECLARE
    
        v_result          VARCHAR2(30);  --只声明变量没有内容
    
    BEGIN
    
        dbms_output.put_line('v_result的内容:'||v_result  );
    
    END;
    
    /

    --5加法

    DECLARE
    
        v_resultA   NUMBER:=100;  --只声明变量没有内容
    
        v_resultB   NUMBER;
    
    BEGIN
    
      v_resultB:=30;
    
        dbms_output.put_line('加法'||(v_resultA+v_resultB)  );
    
    END;
    
    /

    --定义非空

    DECLARE
    
        v_resultA  NUMBER NOT NULL:=100;  --只声明变量没有内容
    
    BEGIN
    
        dbms_output.put_line('v_resultA:'||v_resultA  );
    
    END;
    
    /

    --定义非空

    DECLARE
    
        v_resultA  NUMBER NOT NULL;  --只声明变量没有内容
    
        BEGIN
    
          dbms_output.put_line('v_resultA:'||v_resultA  );
    
    END;
    
    /

    --定义常量

    DECLARE
    
        v_resultA  CONSTANT NUMBER NOT NULL:=100;  --使用CONSTANT关键字定义常量
    
    BEGIN
    
        dbms_output.put_line('v_resultA:'||v_resultA  );
    
    END;
    
    /

    --常量不能改变

    DECLARE
    
        v_resultA  CONSTANT NUMBER NOT NULL:=100;  --使用CONSTANT关键字定义常量
    
    BEGIN
    
      v_resultA:=20;
    
        dbms_output.put_line('v_resultA:'||v_resultA  );
    
    END;
    
    /

    --如果希望与指定数据表中某一列的类型一样,则可以使用 变量名   表名称。字段名称%TYPE 的格式定义

    DECLARE
    
      v_eno            emp.empno%TYPE;    --与empno类型相同
    
       v_ename           emp.ename%TYPE;   --与ename类型相同
    
    BEGIN
    
      dbms_output.put_line('请输入员工编号:');
    
      v_eno:=&empno;                         --由键盘输入员工编号
    
      SELECT ename INTO v_ename FROM emp WHERE empno=v_eno;
    
      dbms_output.put_line('编号为:'||v_eno||'员工姓名: '||v_ename);
    
    END;
    
    /

    --还可以使用%ROWTYPE 标记定义表中一行的记录类型

    --使用ROWTYPE装载一行记录

    DECLARE
    
    v_deptROW            dept%ROWTYPE ;     ---装载一行的dept记录
    
    BEGIN
    
     SELECT * INTO v_deptRow FROM dept WHERE deptno=10;
    
     dbms_output.put_line('部门编号'||v_deptRow.deptno||' 部门名称:'||v_deptRow.dname||' 部门位置'||v_deptRow.loc);
    
    END;
    
    /

    --************运算符

    --赋值运算符 变量:=表达式

    DECLARE
    
    v_info  VARCHAR2(50):='欢迎使用Oracle数据库';
    
    vurl    VARCHAR2(50);
    
    BEGIN
    
      vurl :='www.163.com';
    
      dbms_output.put_line(v_info);
    
      dbms_output.put_line(v_url);
    
    END;
    
    /

    连接运算符

    使用”||”完成操作

    DECLARE
    
    v_info  VARCHAR2(50):='欢迎使用Oracle数据库';
    
    v_url    VARCHAR2(50);
    
    BEGIN
    
      v_url :='www.163.com';
    
      dbms_output.put_line(v_info ||'网址'|| v_url);
    
    END;
    
    /

    --关系运算符

    --关系运算符>,<,>=,<=,=,!=,<>

    --判断NULL IS NULL ,IS NOT NULL

    --范围查询 BETWEEN 最小值 AND最大值

    --范围查询 IN

    --模糊查询LIKE

    DECLARE
    
      v_url      VARCHAR2(50):='www.163.com';
    
      v_num1     NUMBER:=80;
    
      v_num2     NUMBER:=30;
    
    BEGIN
    
      IF v_num1>v_num2 THEN
    
        dbms_output.put_line('第一个数字比第二个数字大');
    
      END IF;
    
      IF v_url LIKE '%163%' THEN
    
        dbms_output.put_line('网址中包含163的字样');
    
      END IF;
    
    END;
    
    /

    --逻辑运算符   AND RO NOT

    DECLARE
    
     v_flag1         BOOLEAN:=TRUE;
    
     v_flag2         BOOLEAN:=FALSE;
    
     v_flag3         BOOLEAN;
    
    BEGIN
    
      IF v_flag1 AND (NOT v_flag2) THEN
    
        dbms_output.put_line('v_flage1 AND (NOT v_flag2)=TRUE');
    
       END IF;
    
       IF v_flag1 OR v_flag3 THEN
    
        dbms_output.put_line('v_flage1 OR v_flag3=TRUE');
    
       END IF;
    
       IF v_flag1 AND  v_flag3 IS NULL THEN
    
        dbms_output.put_line('v_flage1 AND  v_flag3 的结果为NULL');
    
       END IF;
    
    END;
    
    /

    ---数值型

    --使用NUMBER变量

    DECLARE
    
      v_x NUMBER(3);  --最多只能为3位数字
    
      v_y NUMBER(5,2)  ;--3位整数,2 位小灵敏
    
    BEGIN
    
      v_x:=-500;
    
      v_y:=999.88;
    
      dbms_output.put_line('v_x'||v_x);
    
      dbms_output.put_line('v_y'||v_y);
    
      dbms_output.put_line('v_x+v_x'|| (v_x+v_y));
    
    END;
    
    /

    --BINARY_INTEGER与 PLS_INTEGER(-2147483648---2147483647)

    --BINARY_INTEGER与 PLS_INTEGER具有相同的范围长度,与NUMBER相比较其所占用的范围更小,

    --在数学计算时,NUMBER保存为十进制,需要先转换为二进制后才可以说进行计算,

    ----BINARY_INTEGER与 PLS_INTEGER采用二进制的补码形式存储,所以性能上要比NUMBER高

    --但是--BINARY_INTEGER与 PLS_INTEGER还是有区别的

    --当--BINARY_INTEGER操作的数大于其数据范围里会变为NUMBER,

    --PLS_INTEGER操作的数大于其数据范围里会抛出异常

    DECLARE
    
    v_pls1     PLS_INTEGER:=100;
    
    v_pls2     PLS_INTEGER:=200;
    
    v_result   PLS_INTEGER;
    
    BEGIN
    
      v_result:=v_pls1+v_pls2;
    
      dbms_output.put_line('计算结果:'||v_result);
    
     END;
    
     

    --字符型

     --char和VARCHAR2

     

    DECLARE
    
      v_info_char          CHAR(10);
    
      v_info_varchar       VARCHAR2(10);
    
     BEGIN
    
       v_info_char:='bdqn';
    
       v_info_varchar:='java';
    
       dbms_output.put_line('v_info_char内容长度:'||LENGTH(v_info_char));
    
       dbms_output.put_line('v_info_varchar内容长度:'||LENGTH(v_info_varchar));
    
     END;

    --Nchar和NVARCHAR2

     DECLARE
    
      v_info_char          NCHAR(10);
    
      v_info_varchar       NVARCHAR2(10);
    
     BEGIN
    
       v_info_char:='bdqn';
    
       v_info_varchar:='java';
    
       dbms_output.put_line('v_info_char内容长度:'||LENGTH(v_info_char));
    
       dbms_output.put_line('v_info_varchar内容长度:'||LENGTH(v_info_varchar));
    
     END;

     

    NCHAR和NVARCHAR2保存数据为UNICODE编码,中文或者英文都会变为十六进制保存,但是浪费空间

    --日期型

     --date数据

     --定义DATE型变量

     DECLARE
    
     v_date1   DATE:=SYSDATE;
    
     v_date2   DATE:=SYSTIMESTAMP;
    
     v_date3   DATE:='23-9月-1984';
    
     BEGIN
    
       dbms_output.put_line('日期数据 :'|| to_char(v_date1,'yyyy-mm-dd hh24:mi:ss'));
    
       dbms_output.put_line('日期数据 :'|| to_char(v_date2,'yyyy-mm-dd hh24:mi:ss'));
    
       dbms_output.put_line('日期数据 :'|| to_char(v_date3,'yyyy-mm-dd hh24:mi:ss'));
    
     END;
    
     

    --定义TIMESTAMP

      

    DECLARE
    
     v_date1   TIMESTAMP:=SYSDATE;
    
     v_date2   TIMESTAMP:=SYSTIMESTAMP;
    
     v_date3   TIMESTAMP:='23-9月-1984';
    
     BEGIN
    
       dbms_output.put_line('日期数据 :'|| v_date1);
    
       dbms_output.put_line('日期数据 :'|| v_date2);
    
       dbms_output.put_line('日期数据 :'|| v_date3);
    
     END;

    -- --if

     

    DECLARE
    
        v_countResult       NUMBER;
    
     BEGIN
    
       SELECT COUNT(*) INTO v_countResult FROM emp;
    
       IF v_countResult>10 THEN
    
         dbms_output.put_line('EMP表记录大于10条');
    
         END IF;
    
     END;

     

     --IF ELSE

     

    DECLARE
    
        v_countResult       NUMBER;
    
     BEGIN
    
       SELECT COUNT(*) INTO v_countResult FROM dept;
    
       IF v_countResult>10 THEN
    
         dbms_output.put_line('DEPT表记录大于10条');
    
         ELSE
    
            dbms_output.put_line('DEPT表记录小于10条');
    
         END IF;
    
     END;

     

     --IF ELSIF ...ELSE

     

    DECLARE
    
       V_COUNTRESULT NUMBER;
    
     BEGIN
    
       SELECT COUNT(*) INTO V_COUNTRESULT FROM EMP;
    
       IF V_COUNTRESULT > 10 THEN
    
         DBMS_OUTPUT.PUT_LINE('EMP表记录大于10条');
    
       ELSIF V_COUNTRESULT < 10 THEN
    
         DBMS_OUTPUT.PUT_LINE('EMP表记录小于10条');
    
       ELSE
    
         DBMS_OUTPUT.PUT_LINE('EMP表记录等于于10条');
    
       END IF;
    
     END;

    --查询EMP表的工资,输入员工编号,根据编号查询工资,如果工资高于3000,则显示高工资

     --大于2000,中等工资,小于2000,显示低工资

     

    DECLARE
    
      V_ENO     EMP.EMPNO%TYPE;
    
      V_EMPSAL  EMP.SAL%TYPE;
    
      V_EMPNAME EMP.ENAME%TYPE;
    
    BEGIN
    
      V_ENO := &EMPNO;
    
      SELECT ENAME, SAL INTO V_EMPNAME, V_EMPSAL FROM EMP WHERE EMPNO = V_ENO;
    
      IF V_EMPSAL > 3000 THEN
    
        DBMS_OUTPUT.PUT_LINE(V_EMPNAME || '工资是高工资');
    
      ELSIF V_EMPSAL > 2000 THEN
    
        DBMS_OUTPUT.PUT_LINE(V_EMPNAME || '工资是中等工资');
    
      ELSE
    
        DBMS_OUTPUT.PUT_LINE(V_EMPNAME || '工资是低工资');
    
      END IF;
    
    END;

    --用户输入 一个员工编号,根据它所在的部门给上涨工资

    --10部门上涨10%,20部门20%,30上涨30%

    --要求最高不能超过5000元,起过5000元就停留在5000;

    DECLARE
    
    v_id          emp.empno%TYPE:=&empno;   --用户输入编号
    
    v_deptno      emp.deptno%TYPE;         --变量部门编号
    
    v_sal         emp.sal%TYPE ;           --变量工资
    
    BEGIN
    
      SELECT deptno ,sal INTO v_deptno,v_sal FROM emp WHERE empno=v_id;
    
      IF v_deptno=10 THEN
    
        IF v_sal*1.1>5000 THEN
    
          dbms_output.put_line(v_id||'涨工资后'|| 5000||'');
    
          ELSE
    
            dbms_output.put_line(v_id||'涨工资后'||v_sal*1.1);
    
          END IF;
    
       ELSIF v_deptno=20 THEN
    
            IF v_sal*1.2>5000 THEN
    
          dbms_output.put_line(v_id||'涨工资后'|| 5000||'');
    
          ELSE
    
            dbms_output.put_line(v_id||'涨工资后'||v_sal*1.2);
    
          END IF;
    
         ELSIF v_deptno=30 THEN
    
            IF v_sal*1.3>5000 THEN
    
          dbms_output.put_line(v_id||'涨工资后'|| 5000||'');
    
          ELSE
    
            dbms_output.put_line(v_id||'涨工资后'||v_sal*1.3);
    
          END IF;
    
          ELSE
    
            NULL;
    
       END IF;
    
    END;

    --循环

    --loop循环

    DECLARE
    
    v_i NUMBER:=1;
    
    BEGIN
    
      LOOP
    
        dbms_output.put_line(v_i);
    
        v_i:=v_i+1;
    
        EXIT WHEN v_i>8;
    
      END LOOP;
    
    END;

    --WHILE..loop

    DECLARE
    
    v_i NUMBER:=1;
    
    BEGIN
    
      WHILE v_i<15 LOOP
    
        dbms_output.put_line(v_i);
    
        v_i:=v_i+1;
    
      END LOOP;
    
    END;

    ---for 循环

    DECLARE
    
    v_i NUMBER;
    
    BEGIN
    
      FOR v_i IN 1..18 LOOP
    
        dbms_output.put_line(v_i);
    
      END LOOP;
    
    END;

    --使用REVERSE递减

    DECLARE
    
    v_i NUMBER;
    
    BEGIN
    
      FOR v_i IN REVERSE 1..18 LOOP
    
        dbms_output.put_line(v_i);
    
      END LOOP;
    
    END;

     

    --循环控制

    --使用EXIT退出

    DECLARE
    
    v_i NUMBER;
    
    BEGIN
    
      FOR v_i IN 1..10 LOOP
    
        IF v_i=6 THEN
    
          EXIT;
    
          END IF;
    
          dbms_output.put_line(v_i);
    
      END LOOP;
    
    END;

    --使用contiune结束当次循环

    DECLARE
    
    v_i NUMBER;
    
    BEGIN
    
      FOR v_i IN 1..10 LOOP
    
        IF mod(v_i,2)=0 THEN
    
          CONTINUE;
    
          END IF;
    
          dbms_output.put_line(v_i);
    
      END LOOP;
    
    END;

    ---嵌套语法

    DECLARE

    声明部分

    BEGIN

     程序执行部分,

    DECLARE

    声明部分

    BEGIN

    程序执行部分,

    EXECPTION

    异常处理部分

    END;

    EXECPTION

    异常处理部分

    END;

    --定义内部程序块

    DECLARE
    
     v_x NUMBER:=30;
    
     BEGIN
    
       DECLARE
    
       v_x VARCHAR2(40):='JAVA 学习';
    
       v_y NUMBER:=20;
    
       BEGIN
    
         dbms_output.put_line('内部程序块输出v_x= '||v_x);
    
         dbms_output.put_line('内部程序块输出v_y= '||v_y);
    
       END;
    
       dbms_output.put_line('外部程序块输出v_x= '||v_x);
    
    END;

     

    --异常

     

    DECLARE
    
     v_dno           dept.deptno%TYPE:=&deptno; --部门编号
    
     v_dna           dept.dname%TYPE:='&dname'; ---部门名称
    
     v_dloc          dept.loc%TYPE:='&loc';    -- 部门位置
    
     v_deptCount     NUMBER;            --保存count()函数的结果
    
    BEGIN
    
      SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=v_dno;
    
      IF v_deptCount > 0 THEN
    
        raise_application_error(-20888,'此部门编号已经存在,请重新输入 ');
    
        ELSE
    
          INSERT INTO dept(deptno,dname,loc)VALUES(v_dno,v_dna,v_dloc);
    
          dbms_output.put_line('新增加部门成功');
    
          COMMIT;
    
        END IF;
    
        EXCEPTION
    
          WHEN OTHERS THEN
    
            dbms_output.put_line(SQLERRM);
    
            ROLLBACK;
    
    END;

     

     

  • 相关阅读:
    《我也能做CTO之程序员职业规划》之十五: 智商
    《.Net 软件设计新思维:像搭积木一样搭建软件》成书背后的故事
    测试有道:微软测试技术心得
    GTUG 推荐这本书给大家
    测试有道:微软测试技术心得
    独具匠心的好书:评《构建高性能Web站点》
    敏捷软件开发模型SCRUM
    JSP和Servlet性能优化
    软件项目管理的圣经人月神话(中)
    探讨JAR文件无限可能性
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4209135.html
Copyright © 2011-2022 走看看