oracle 对象管理 07_PLSQL基础与异常
2019独角兽企业重金招聘Python工程师标准>>>
一、输出信息设置
1.设置sql前缀
a.当前会话
SET SQLPROMPT "_USER@ _CONNECT_IDENTIFIER>"
b.永久设置
$ORACLE_HOME/sqlplus/admin/glogin.sql 文件中增加 SET SQLPROMPT "_USER@ _CONNECT_IDENTIFIER>"
2.常用set命令
set timing on --设置显示“已用时间:XXXX”
set serveroutput on size 10000 --设置允许显示输出类似dbms_output
set feedback on --设置显示“已选择XX行”
set pagesize 10 --设置每一页的行数
set time on --设置显示当前时间(sql前缀上加时间)
set linesize 4000 --输出一行字符个数,缺省为80
set termout off; --必须写在.sql文件中进行。--显示脚本中的命令的执行结果,缺省为on
set echo off --显示start启动的脚本中的每个sql命令,缺省为on
3.程序中使用替代变量
¶meter 编译到该变量则让输入一次值,数值时直接加&,字符串放入引号内;
&¶meter 第一个用,后边都用&则只用输入一次值;
4.oracle的语句
DML:数据操纵语句
DDL: 对象定义语句
DCL:数据控制语句,权限授予和回收
二、程序加密,获取源脚本
1.加密
Wrap命令行工具,可以在命令行中实现源代码文件的加密;
wrap iname=p_wrap_test_nc.sql oname=p_res_nc.plb
Dbms_ddl包,其中包括的方法也可以实现在PL/SQL中进行代码的加密;
DBMS_DDL.WRAP(VC_SQL)
DBMS_DDL.CREATE_WRAPPED(VC_SQL)
2.获取定义脚本
exec dbms_output.put_line(dbms_metadata.get_ddl('PROCEDURE','P_WRAP_TEST_NC')); --所有对象的定义
SELECT LINE, TEXT FROM USER_SOURCE WHERE NAME = 'P_WRAP_TEST_NC'; --用户自己定义的程序对象
三、PL/SQL定义
1.PL/SQL实现本地编译,在服务器上使用底层语言,执行效率高,SQL引擎和PL/SQL引擎协同配合执行PL/SQL程序单元,并
将执行结果返给客户端。集中发送SQL语句,一次编译多次使用,对用户共享;不受操作系统限制,只要运行oracle即可
支持面向对象OOP,支持WEB应用程序。
2.PL/SQL程序定义
块头区: Program_Type[ procedure,function,package] program_name (parameter_name in/out parameter_type,….)
[Return datatype];
AS/IS
声明区:var_name type specs;
declare可以在任意位置声明变量
变量辅助说明:Specs:Not null,default value,:=value,
常量定义:Var_name constant datatype :=value;
BEGIN
执行区:至少包含一条执行语句,甚至可以是null,但不能为空
EXCEPTION
异常区:when… then….
END;
注:
变量声明区不能分开给变量赋值,可以定义时赋初值;
不允许给输入参数重新赋值;
输入参数不能定义长度,变量声明必须定义长度;
3.数据类型
a.char(n):定长字符数据,最大2000个字节,默认为1,指定长度后会用空格填充;
b.varchar2(n):n必须得有,4000字节,变长字符型;
c.number(m,n):m有效数字位数,n处理位number(3,-3) 4567.258 5000
d.long:存2G数据,该类型字段不能用于表达式,where,order by,group by等特定字句中
e.boolean:不能用于创建表的字段描述,可用于存储过程;
f.PLS_integer:带符号的整数数据类型,比number计算快,硬件存储
simple_integer: 非空约束,声明时要赋初值,中间赋值也不能为空
g.date:定长的日期值
timestamp:精确到小数点后6位的
h.anchored:%type类型, var_var1 表.字段%type;定义
i.可以使用自定义数据类型来约束变量值的范围
j.游标变量类型v_cur_col cur_one%rowtype;
4.PL/SQL程序块调试错误信息
show error
四、PL/SQL流程控制
1.IF语句:是一种条件判断语句,首先执行一个条件判断,根据条件的结果走不同的程序流程,过程化控制。
a.IF…THEN:一旦条件满足,顺序执行1到n语句,条件不满足,则跳到END IF之后。
IF 条件1 THEN
执行语句1
…….
执行语句n
END IF;
b.IF…THEN….ELSE:else用来对不满足条件的情况下进行友好处理。条件满足执行THEN后的语句,完成后调至END IF,
条件不满足,则执行ELSE后的语句,完了到END IF。
IF 条件1 THEN
执行语句1;
执行语句n;
ELSE
执行语句1;
执行语句2;
END IF;
c.ELSIF:存在复杂的多个互斥的条件使用,依次判断条件是否满足,满足执行该条件下的语句,然后跳到END IF;
一般条件按顺序进行。
IF 条件1 THEN
执行语句1;
ELSIF 条件2 THEN
执行语句2;
….
ELSIF 条件n THEN
执行语句n;
ELSE
执行语句;
END IF;
d.嵌套IF:在其他语句块中使用条件控制语句块。
2、CASE语句:条件判断语句,通过选择器来判断条件是否满足
a.简单CASE语句:带选择器
CASE 选择器
WHEN 选择器值1 THEN 执行语句1;
WHEN 选择器值2 THEN 执行语句2;
…..
WHEN 选择器值n THEN 执行语句n;
ELSE 执行语句
END CASE; --case必须要写
b.搜索式CASE语句:没有选择器,直接CASE WHEN 条件 THEN
CASE
WHEN 条件1 THEN 执行语句1;
WHEN 条件2 THEN 执行语句2;
…..
WHEN 条件n THEN 执行语句n;
ELSE 执行语句;
END CASE;
3、循环控制语句:在一定的周期执行同样的事情,周期为循环的次数。
a.简单循环:loop 需要一个条件来停止循环,用exit 来退出循环。用IF条件判断或者使用exit when退出循环
loop
执行语句;
IF 条件1 then
exit;--[ exit when 条件2 ]
end if
end loop;
b.while循环:可以用条件设置提前推出循环,条件不满足直接退到循环外下一条执行
while 循环条件 loop
执行语句1;
执行语句2;
…..
执行语句n;
end loop;
c.for循环
范围for循环:i作为循环变量,in指定范围,1为进步,包涵边界值
for i in 1..n loop
执行语句;
end loop;
五、异常
运行过程中的错误为异常,是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。为了提高
程序的健壮性,可以在PL/SQL块中引入异常处理部分,进行捕捉异常,并根据异常出现的情况进行相应的处理。异常作用
范围仅限当前语句块,内部可以使用外部的,外部不能使用内部的
1.异常分类
系统异常、自定义异常,其中系统异常又分为:预定义异常和非预定义异常。
a.预定义异常,ORACLE定义了他们的错误编号和异常名字
NO_DATA_FOUND SELECT ... INTO ... 时,没有找到数据
TOO_MANY_ROWS SELECT ... INTO ... 时,查询的结果是多值
b.非预定义异常,ORACLE为它定义了错误编号,但没有定义异常名字。我们使用的时候,先声名一个异常名,
通过伪过程PRAGMA EXCEPTION_INIT,将异常名与错误号关联起来。
c.自定义异常,程序员从我们业务角度出发,制定的一些规则和限制。
2.异常处理
PL/SQL中,异常处理按个步骤进行:
定义异常
抛出异常
捕获及处理异常
a.定义异常
exception_name EXCEPTION;
b.抛出异常
RAISE exception_name
c.捕获及处理异常
EXCEPTION
WHEN e_name1 [OR e_name2 ... ] THEN
statements;
WHEN e_name3 [OR e_name4 ... ] THEN
statements;
......
WHEN OTHERS THEN
statements;
3.异常使用
a.预定义异常
DECLARE
V_ENAME EMP.ENAME%TYPE;
BEGIN
SELECT ENAME INTO V_ENAME FROM EMP WHERE DEPTNO = &DNO;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Too many rows are returned');
END;
b.非预定义异常
非预定义异常使用的基本过程
定义一个异常名
将异常名与异常编号相关联
在异常处理部分捕捉并处理异常
DECLARE
E_DEPTID EXCEPTION;
PRAGMA EXCEPTION_INIT(E_DEPTID, -2292);
BEGIN
DELETE FROM DEPT WHERE DEPTNO = 10;
EXCEPTION
WHEN E_DEPTID THEN
DBMS_OUTPUT.PUT_LINE('at sub table have record!');
END;
c.自定义异常
自定义异常与Oracle错误没有任何关系,有开发人员为特定情况所定义的例外
定义异常(在declare部分进行定义)
显示触发异常(在执行BEGIN部分触发异常,使用RAISE语句)
引用异常(在EXCEPTION部分捕捉并处理异常)
DECLARE
E_INTEGRITY EXCEPTION;
PRAGMA EXCEPTION_INIT(E_INTEGRITY, -2291);
E_NO_EMPLOYEE EXCEPTION;
BEGIN
UPDATE EMP SET DEPTNO = &DNO WHERE EMPNO = &ENO;
IF SQL%NOTFOUND THEN
RAISE E_NO_EMPLOYEE;
END IF;
EXCEPTION
WHEN E_INTEGRITY THEN
DBMS_OUTPUT.PUT_LINE('The dept is not exists');
WHEN E_NO_EMPLOYEE THEN
DBMS_OUTPUT.PUT_LINE('The employee is not exists');
END;
d.使用异常函数处理异常
函数SQLCODE用于取得Oracle错误号
函数SQLERRM用于取得与错误号对应的相关错误消息*/
undef v_sal
declare
v_ename emp.ename%type;
begin
select ename into v_ename from emp
where sal=&&v_sal;
dbms_output.put_line('Employee Name:'||v_ename);
exception
when no_data_found then
dbms_output.put_line('The employee is not exists for salary '||&v_sal);
when others then
dbms_output.put_line('Error No:'||SQLCODE);
dbms_output.put_line(SQLERRM);
end;
RAISE_APPLICATION_ERROR:将应用程序专有的错误从服务器端转达到客户端
RAISE_APPLICATION_ERROR(error_number,message[,{true | false}]);
error_number:用于定义错误号,且错误号从-20000 到-20999 之间,以避免与ORACLE 的任何错误代码发生冲突
message:用于指定错误消息,且消息长度不能超过k,超出部分将被截取
CREATE OR REPLACE PROCEDURE RAISE_COMM(V_NO EMP.EMPNO%TYPE,
V_COMM OUT EMP.COMM%TYPE) AS
BEGIN
SELECT COMM INTO V_COMM FROM EMP WHERE EMPNO = V_NO;
IF V_COMM IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, 'It is no comm for this employee');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('The employee is not exist');
END;
4.异常处理
当发生异常后,程序将在错误处停止,并转到该语句块的末尾搜索是否有异常处理,有则处理,无或者异常不匹
配,则跳出当前可执行语句块,到外层语句块末尾找异常处理,否则交给操作系统处理。
动态,静态sql
转载于:https://my.oschina.net/peakfang/blog/2245388
oracle 对象管理 07_PLSQL基础与异常相关推荐
- oracle 对象管理 01_用户及权限
2019独角兽企业重金招聘Python工程师标准>>> 一.用户管理 1.创建用户(可带用户的profile文件,对用户的约束信息) CREATE USER username ...
- 触发器与job的配合使用oracle,oracle 对象管理 10_触发器job
一.触发器相关概念 1.触发器分类 a.DML触发器:对DML语句进行触发(表上进行DML操作前BEFORE.后AFTER) b.INSTEAD OF 触发器:只适用于视图(复杂视图上DML),不能指 ...
- oracle对象管理及使用实验报告,oracle对象管理常用操作(objects management)
一.creating a table --创建表 create table computer_systems( computer_system_id number(38, 0) not null, ...
- Oracle数据库模式对象管理
实验四 Oracle数据库模式对象管理 一.预习报告 一. 实验目的 1) 掌握表的创建与管理. 2) 掌握索引的创建与管理. 3) 掌握视图的创建与管理. 4) 掌握序列的创建与管理. 5) 了解簇 ...
- unity 引用prefab_Unity基础教程-对象管理(二)——对象多样化(Fabricating Shapes)...
200+篇教程总入口,欢迎收藏: 放牛的星星:[教程汇总+持续更新]Unity从入门到入坟--收藏这一篇就够了zhuanlan.zhihu.com 本文重点: 1.为形状创建一个工厂 2.保存和加载 ...
- ORACLE甚而,PL/SQL基础
Oracle PL/SQL语言基础 PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用 ...
- Oracle PL/SQL语句基础学习笔记(上)
PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...
- Oracle用户管理学习总结
Oracle 用户管理 一.用户的概念 用户,即user,通俗的讲就是访问oracle数据库的"人".在oracle中,可以对用户的各种安全参数进行控制,以维护数据库的安全性,这些 ...
- Oracle的学习一:安装与卸载、sql *plus常用命令、Oracle用户管理
1.为什么学习oracle? 性能优越: 小型数据库 中型数据库 大型数据库 acess.foxbase mysql.sql server.informix sybase.oracle.db2 复杂量 ...
最新文章
- 剑指offer: 面试题03. 数组中重复的数字
- YOLOv5在建筑工地中安全帽佩戴检测的应用
- 用python描述车_使用Python探索二手车市场(含代码)
- python lol脚本_配台电脑,能玩LOL顶配和能够写一些python脚本能用ps不卡,预算6k到8k?...
- Java设计模式(十五):桥接设计模式
- Linux驱动编程中EXPORT_SYMBOL()介绍
- html语言中的转行标记是6,网页设计与制作模拟试题
- primefaces_懒惰的JSF Primefaces数据表分页–第1部分
- 函数调用关系图如何画_彩铅画入门植物教程 | 如何用彩铅画一株多肉?多肉彩铅画教程步骤图详细...
- python self 值自动改变_Python,为什么传递和更改带有外部函数的类selfvariable用于操作iterable而不是变量...
- 我佛了!用 KNN 实现验证码识别,又 Get 到一招
- SQLServer2008R2精简版使用
- mybatisplus的逻辑删除
- HTTP协议:无状态协议
- Python-QQ聊天记录分析-jieba+wordcloud
- 佳文分享:我个人比较受用的一些习惯
- 20172327 2017-2018-2 《程序设计与数据结构》第十一周学习总结
- 我如何在1年内在YouTube上从0到70k的订阅者流失-以及我赚了多少钱
- 群论:李群(Lie Group)和几种经典李群
- (每日水题004-1)(DP,滚动数组)洛谷P1508 Likecloud-吃、吃、吃