PLSQLl编程

plsql是Oracle在标准的sql语言上的扩展

特点:可以在数据库中定义变量,常量,还可以使用条件语句和判断语句以及异常等

PLSQL程序组成部分

PLSQL由 声明部分、执行部分、异常处理部分组成

DECLARE   -- 声明部分

-- 在此声明pl/sql用到的变量

BEGIN   -- 执行

  -- 在此写执行语句

EXCEPTION

-- 执行异常

END;

简单的PLSQL块

 DECLARE     -- 声明并赋值       变量名 类型 := 值;          := 表示赋值    = 表示条件判断
V_NUM NUMBER := 10; -- PLSQL在声明变量时在前面加v_ 代表变量
BEGIN
V_NUM := V_NUM + 1; -- 对V_NUM加1
DBMS_OUTPUT.put_line('NUM' || V_NUM); -- 对结果进行输出
END;

SELECT...INTO、%TYPE、 %ROWTYPE、常量

SELECT...INTO...

[1] 声明变量赋值为员工表中Smith的员工编号    SELECT ...INTO

SELECT...INTO可以将表中查询到的数据赋值给变量V_NUM

 DECLARE
V_NUM NUMBER; -- 声明
BEGIN
SELECT EMPNO INTO V_NUM FROM EMP WHERE ENAME = 'SMITH';
DBMS_OUTPUT.put_line('NUM' || V_NUM);
END;

%TYPE

[2] 声明变量,变量的类型是scott用户下emp表empno字段的字段类型    %TYPE

 DECLARE
V_NUM SCOTT.EMP.EMPNO%TYPE; -- 声明类型是SCOTT用户下的EMP表的EMPNO列对应的类型
BEGIN
SELECT EMPNO INTO V_NUM FROM EMP WHERE ENAME = 'SMITH';
DBMS_OUTPUT.put_line('NUM' || V_NUM);
END;

%ROWTYPE

[3] 取一行数据   %rowtype

 DECLARE
V_EMPROW SCOTT.EMP%ROWTYPE; -- 拿到SCOTT用户下的EMP表的所有列数据的类型
BEGIN
SELECT * INTO V_EMPROW FROM EMP WHERE ENAME = 'SMITH';
DBMS_OUTPUT.put_line(V_EMPROW.ENAME || V_EMPROW.EMPNO);
END;

常量

 DECLARE
-- 声明
C_PI CONSTANT NUMBER := 3.1415; -- CONSTANT: 常量,一旦设定,不能改变 命名规范:常量前面加C
V_R NUMBER := 20;
V_AREA NUMBER;
BEGIN
V_AREA := C_PI*V_R*V_R;
DBMS_OUTPUT.put_line('圆的面积:' || V_AREA);
END;

判断语句

IF判断

 DECLARE
V_SCORE NUMBER;
BEGIN
V_SCORE := '&请输入成绩'; -- &表示输入
IF(V_SCORE >= 90) THEN
DBMS_OUTPUT.PUT_LINE('去玩游戏');
ELSIF (V_SCOE >= 80) THEN
DBMS_OUTPUT.PUT_LINE('去报补习班');
ELSIF (V_SCORE >= 70) THEN
DBMS_OUTPUT.PUT_LINE('去报两个补习班');
ELSE
DBMS_OUTPUT.PUT_LINE('去写作业');
END IF;
END;

SWITCH判断

 DECLARE
V_SCORE NUMBER;
BEGIN
V_SCORE := '&请输入成绩';
CASE
WHEN V_SCORE > 90 THEN DBMS_OUTPUT.PUT_LINE('去玩游戏');
WHEN V_SCORE > 80 THEN DBMS_OUTPUT.PUT_LINE('去报补习班');
WHEN V_SCORE > 70 THEN DBMS_OUTPUT.PUT_LINE('去报两个补习班');
ELSE DBMS_OUTPUT.PUT_LINE('去写作业');
END CASE;
END;

循环结构

LOOP循环

 -- 要求一个变量,每次循环减1,并输出结果 ,当变量小于3时,退出循环
DECLARE
V_COUNT NUMBER := 10;
BEGIN
LOOP -- 循环开始
V_COUNT := V_COUNT - 1; -- 减1
EXIT WHEN V_COUNT < 3; -- 当V_COUNT小于3时,退出循环
DBMS_OUTPUT.PUT_LINE(V_COUNT);
END LOOP; -- 结束循环
END; DECLARE
V_COUNT := 10;
BEGIN
LOOP
V_COUNT : V_COUNT - 1;
IF V_COUNT < 3 THEN
EXIT; -- 满足条件,退出循环
DBMS_OUTPUT.PUT_LINE(V_COUNT);
END LOOP;
END;

WHILE循环

 -- 声明变量1,每次循环加1,并输出结果,当变量大于20的时候,退出循环
DECLARE
V_NUM NUMBER := 1; -- 声明变量并赋值
BEGIN
WHILE V_NUM < 20 LOOP -- 开始循环
DBMS_OUTPUT_PUT_LINE(V_NUM);
V_NUM := V_NUM + 1;
END LOOP; -- 结束循环
END;

FOR循环

 -- 变量从0开始,变量等于10,每次循环+1,算循环的次数
DECLARE
V_NUM NUMBER := 10;
BEGIN
FOR I IN 0..10 LOOP -- 0..10表示0到10
V_NUM := V_NUM + 1;
DBMS_OUTPUT.PUT_LINE(V_NUM);
END LOOP;
END;

PLSQL之异常处理

使用EXCEPTION处理异常

 DECLARE
V_TEMP NUMBER(4);
BEGIN
SELECT EMPNO INTO V_TEMP FROM EMP WHERE DEPNO = 100; -- 这里DEPNO等于10的列不只一条,而V_TEMP只能接收一条数据,所以会造成异常
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('返回的数据太多了');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有数据啊');
WHEN OTHERS THEN -- 使用OTHERS表示其他异常
DBMS_OUTPUT.PUT_LINE('其他异常');
END;

自定义异常

 DECLARE
V_NUMBER1 NUMBER; -- 声明变量
V_NUMBER2 NUMBER;
V_RESULT NUMBER;
E_NONUMBER EXCEPTION; -- 声明异常 PRAGMA EXCEPTION_INIT (E_NONUMBER, -6502); -- 将错误的代码跟自定义的异常名称绑定,并注册到系统里面
BEGIN
V_NUMBER1 := '& 请输入被除数';
V_NUMBER2 := '& 请输入除数';
V_RESULT := V_NUMBER1 / V_NUMBER2;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
EXCEPTION
WHEN E_NONUMBER THEN
DBMS_OUTPUT.PUT_LINE('你输入的不是数字');
END;

建立错误日志表

 -- 创建表
CREATE TABLE ERROLOG( --错误日志
ERROCODE NUMBER, -- 出错的编码 (ORA-XXXX)
ERROMSG VARCHAR2 (1024), --出错的信息
ERRODATE DATE --出错的时间
) -- 记录错误日志
DECLARE
V_DEPTNO DEPT.DEPTNO%TYPE := 10; --声明一个变量v_deptno 是dept 表的deptno类型
ERROCODE NUMBER; --出错的编码
ERROMSG VARCHAR2(1024); --出错的信息 BEGIN
DELETE FROM DEPT WHERE DEPTNO = 90;
DELETE FROM DEPT WHERE DEPTNO = V_DEPTNO;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK; --回滚到之前的状态
ERROCODE := SQLCODE; --打印错误编码
ERROMSG := SQLERRM; --打印错误的信息
INSERT INTO ERROLOG VALUES (ERROCODE,ERROMSG,SYSDATE);
COMMIT;
END;

PLSQL(1)的更多相关文章

  1. PLSql Oracle配置

    1.安装Oracle客户端或者服务端 2.配置环境变量 <1>.一般如果安装了Oracle客户端或者服务端的话,在环境变种的Path中有Oracle的安装路径(计算机-属性-高级系统设置- ...

  2. plsql查询乱码问题解决

    步骤一:新建变量,设置变量名:NLS_LANG,变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK,确定即可: 步骤二: 退出plsql,重新登陆plsql.输入sql语句,执 ...

  3. Oracle/PLSQL: ORA-06550

    参考: http://blog.csdn.net/haiross/article/details/20612135 Oracle/PLSQL: ORA-06550 Learn the cause an ...

  4. [No00008F]PLSQL自动登录,记住用户名密码&日常使用技巧

    配置启动时的登录用户名和密码 这是个有争议的功能,因为记住密码会给带来数据安全的问题. 但假如是开发用的库,密码甚至可以和用户名相同,每次输入密码实在没什么意义,可以考虑让PLSQL Develope ...

  5. 使用plsql创建表空间和用户

    使用plsql创建oracle数据库的表空间和用户,并授权的语句.1.创建表空间:说明:datafile是指定创建位置,指向oracle数据库的默认位置:autoextend 设置容量为自动增长,50 ...

  6. plsql查找不到带中文的纪录

    今天在另外的电脑用plsql查询不到带中文的记录 select * from test where name like '%测试%' 然后发现是系统的环境变量还没设置好所造成的.在系统变量加入如下变量 ...

  7. plsql配置远程连接数据库

    1.先安装plsql.地址:http://pan.baidu.com/s/1hqGbATI 2.  解压缩 instantclient_11_2(这个客户端可以在网上找精简版的),找到以下路径  \i ...

  8. PLSQL操作excel

    一.plsql数据库操作: 删除数据前备份一张表: create table plat_counter_def_bf as select * from plat_monitor_counter_def ...

  9. PLSQL Developer 连接oracle(64) (instantclient)错误及解决方案

    安装了PLSQL Developer 64bit,下载地址http://cy1.mqego.com/plsqldeveloperxx.zip. 1.安装完成后,输入数据库连接信息之后,提示如下错误 原 ...

  10. Oracle的tnsnames.ora配置(PLSQL Developer)

    首先打开tnsnames.ora的存放目录,一般为D:\app\Administrator\product\11.2.0\client_1\network\admin,就看安装具体位置了. 步骤阅读 ...

随机推荐

  1. UVA850【简单模拟】

    题目:解密句子.有一些被加密的句子已知一条模板翻译,判断是否可以解密,可以的话将所有句子解密. #include <stdio.h> #include<iostream> #i ...

  2. Tumblr:我们是如何从 PHP 5 升级到 PHP 7 的

    Tumblr 团队经常在寻找新的方式来提升网站的性能.这意味着要给访问量大的代码增加缓存,找到更快的 CDN 配置,或者升级基础软件. 最近,通过一次跨团队的努力,我们将全部 web 服务器战舰从 P ...

  3. Hibernate(十三):HQL查询(二)

    背景 基于上一章节<Hibernate(十二):HQL查询(一)>,已经学习了一部分关于HQL的用法: HQL带参数查询 HQL Order By排序查询 HQL 设置实体参数查询 本章节 ...

  4. PHP 7.2 新功能介绍

    PHP 7.2 已經在 2017 年 11 月 30 日 正式發布 .這次發布包含新特性.功能,及優化,以讓我們寫出更好的代碼.在這篇文章裡,我將會介紹一些 PHP 7.2 最有趣的語言特性. 你可以 ...

  5. linux samba服务配置

    1.下载 wget+rpm或yum install 2.配置/etc/samba/smb.conf cat smb.conf | grep setsebool 执行终端打印出来的字符串 setsebo ...

  6. MyBatis基础学习笔记--摘录

    1.MyBatis是什么? MyBatis源自于IBatis,是一个持久层框架,封装了jdbc操作数据库的过程,使得开发者只用关心sql语句,无需关心驱动加载.连接,创建statement,手动设置参 ...

  7. iframe交互(一)父页面自动高度

    //父页面源码 <body style="border:1px solid red;width:200px;height:500px;" onload="IFram ...

  8. java中IO操作

    File类 /** * 路径分隔符:public static final String separator; * 设置文件路径:public File(String pathName) ; * 创建 ...

  9. [LeetCode] Valid Square 验证正方形

    Given the coordinates of four points in 2D space, return whether the four points could construct a s ...

  10. 【Swift】ios开发中巧用 description 打印对象时,打印对象的属性

    ios开发中我们打印对象的时候,会直接输出对象地址,这样不方便我们开发.我们可以 巧用 description 打印对象时,输出对象的属性 在oc中直接重写即可.swift中需要遵守Printable ...