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. Python之格式化输出,初始编码以及运算符

    一.题型 1.使用while循环输入 1 2 3 4 5 6  8 9 10 count = 0 while count < 10: count += 1   #count = count + ...

  2. hive:导出数据记录中null被替换为\n的解决方案

    在hive中,一般情况下通过 use my_hive_db; set hive.merge.mapfiles=true; set hive.merge.mapredfiles=true; ; ; in ...

  3. ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    介绍 什么是RESTful?  这里不多做赘述,详情请百度! 哈哈,本来还想巴拉巴拉介绍一些webapi, RESTful的, 还是算了,咱们直接上干货!(原因是懒!哈哈) 使用 以前使用过mvc的人 ...

  4. Javascript之Event Loop

    先看段代码: console.log(1); setTimeout(function () { console.log(2); new Promise(function (resolve, rejec ...

  5. C++程序设计语言(特别版) -- 一个桌面计算器

    前言 这里要介绍各种语句和表达式,将通过一个桌面计算器的程序做些事情,该计算器提供四种座位浮点数的中缀运算符的标准算术运算. 这个计算器由四个部分组成:一个分析器,一个输入函数,一个符号表和一个驱动程 ...

  6. Java学习图形界面+网络编程案例---------网络简易通讯

    主要思想: 主类继承JPanel,在构造方法中将JFrame设成空布局:在其中适当位置添加组件:实现事件监听处理 DATE:2015-10-31 服务器端代码: /** * @author Oyc * ...

  7. java中的内部类概念

    内部类和外部类可以互相访问私有属性 1.普通内部类实例化方式 外部类.内部类 对象 = new 外部类().new 内部类(); class Outer{//外部类 private String ms ...

  8. openfire3.10.0 在mac10.10.3,jdk1.8中,安装后无法打开的解决方案

    先展示一下错误 解决方案很简单,卸载jdk,openfire之后,重新安装就行 步骤如下: (1)卸载jdk1.8 终端依次执行下面的命令 sudo rm -fr /Library/Internet\ ...

  9. UOJ #206. 【APIO2016】Gap

    Description Solution 第一个子任务,直接从 \((a[i],a[j])\) 推出 \((a[i+1],a[j-1])\) 就行了,只需要 \(\frac{N+1}{2}\) 第二个 ...

  10. ●洛谷P1291 [SHOI2002]百事世界杯之旅

    题链: https://www.luogu.org/recordnew/show/5861351题解: dp,期望 定义dp[i]表示还剩下i个盖子没收集时,期望还需要多少次才能手机完. 初始值:dp ...