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;

 

PL/SQL基础2(笔记)的更多相关文章

  1. Oracle PL/SQL随堂笔记总结

    1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...

  2. Oracle实战笔记(第六天)之PL/SQL基础

    一.PL/SQL介绍 1.概念 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语 ...

  3. PL/SQL基础1(笔记)

    --基本结构DECLARE--变量声明部分:在此声明PL/SQL用到的变量,类型,游标,以及局部的存储过程和函数BEGIN --执行部分:过程及SQL语句,即程序的主要部分 EXCEPTION --执 ...

  4. 慕课网笔记之oracle开发利器-PL/SQL基础

    实例1--if语句 /* 慕课网Oracle数据库开发必备之PL/SQL_2-3 判断用户从键盘输入的数字 1.如何使用if语句 2.接收一个键盘的输入(字符串) */ set serveroutpu ...

  5. Oracle442个应用场景---------PL/SQL基础

    ----------------------------------------------------------------------------------- 备份和恢复数据库略过.在后面解说 ...

  6. Oracle数据库之PL/SQL基础

    介绍PL/SQL之前,先介绍一个图像化工具:Oracle SQL Developer 在oracle的开发过程中, 我们难免会使用第三方开发的软件来辅助我们书写SQL, pl/sql是一个不错的sql ...

  7. PL\SQL 随学笔记

    一.在PL\SQL语句块begin...end;中,不能直接使用select,必须与into结合查询. 例如: declare aa:=22; id2 integer; begin select * ...

  8. PL SQL 基础

    Oracle之PL/SQL学习笔记   自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整 ...

  9. PL/SQL基础知识

    Oracle之PL/SQL学习笔记 自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了 ...

随机推荐

  1. 爬虫技术 -- 基础学习(四)HtmlParser基本认识

    利用爬虫技术获取网页源代码后,针对网页抽取出它的特定文本内容,利用正则表达式和抽取工具,能够更好地抽取这些内容. 下面介绍一种抽取工具 -- HtmlParser HtmlParser是一个用来解析H ...

  2. C# 5.0 新特性——Async和Await使异步编程更简单

    http://www.cnblogs.com/zhili/archive/2013/05/15/csharp5asyncandawait.html http://blog.zhaojie.me/201 ...

  3. IIS 7完全攻略之日志记录配置(摘自网络)

    IIS 7完全攻略之日志记录配置 作者:泉之源 [IT168 专稿]除了 Windows 提供的日志记录功能外,IIS 7.0 还可以提供其他日志记录功能.例如,可以选择日志文件格式并指定要记录的请求 ...

  4. Breach - HTML5 时代,基于 JS 编写的浏览器

    Breach 是一款属于 HTML5 时代的开源浏览器项目,,完全用 Javascript 编写的.免费.模块化.易于扩展.这个浏览器中的一切都是模块,Web 应用程序在其自己的进程运行.通过选择合适 ...

  5. 美了美了!22款精美的 iOS 应用程序图标模板

    22款制作精美的 iOS 应用程序图标设计作品,遵循图形设计的现代潮流,所有图标都非常了不起,给人惊喜.通过学习这些移动应用程序图标,设计人员可以提高他们的创作,使移动用户界面看起来更有趣和吸引人. ...

  6. 我也想聊聊 OAuth 2.0 —— Access Token

    这是一篇待在草稿箱半年之久的文章 连我自己都不知道我的草稿箱有多少未发布的文章了.这应该是我在上一家公司未解散之前写的,记得当时是要做一个开发者中心,很不幸. 今天,打开草稿箱有种莫名的伤感,看到这个 ...

  7. undefined reference to `omp_get_max_threads'

    原因是缺少 libgomp/openmp 库的链接 配置和解决方法参考: http://www.code-by.org/viewtopic.php?f=54&t=163

  8. PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1

    ※★◆●PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1AApprriill 22001166Conte ...

  9. Enterprise Library - Data Access Application Block 6.0.1304

    Enterprise Library - Data Access Application Block 6.0.1304 企业库,数据访问应用程序块 6.0.1304 企业库的数据访问应用程序块的任务简 ...

  10. Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录

    在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操 ...