Oracle
文章平均质量分 60
艺术就是爆炸
这个作者很懒,什么都没留下…
展开
-
Oracle PL/SQL高级编程(第八弹:性能优化:SQL语句性能优化)
连接查询的表顺序默认情况下,当对多个表进行连接查询时,Oracle分析器会按照从右到左的顺序处理FROM子句中的表名。例如下面的语句:SELECT a.empno, a.ename,c.deptno, c.dname, a.log_action FROM emp_log a, emp b, dept c;在执行时,Oracle会先查询dept表,根据dept表查询的行作为数据源串行...原创 2018-08-13 23:49:32 · 527 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第十三弹:系统事件触发器)
DML触发器和替代触发器都是在DML事件上触发的 ,而系统触发器是在DDL事件和数据库服务器事件时触发的。定义系统触发器语法如下:CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE | AFTER} {DDL event |DATABASE event}ON {DATABASE | SCHEMA}[WHEN [...]]plsql_b...原创 2018-08-11 01:31:52 · 1459 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第十二弹:替代触发器)
DML触发器只能应用在表上。而替代触发器只能定义在视图上。当腰对一个不能进行修改的视图进行数据的修改时,或者要修改视图中的某个嵌套表时,可以使用替代触发器。替代触发器的作用提到触发器,又称为INSTEAD OF触发器,它会替代原来的数据操作语句的执行,更改为使用在触发器中定义的语句来执行数据操作。一些简单的单表视图,可以直接INSERT、UPDATE,但如果要对复杂的视图进行INS...原创 2018-08-10 23:56:47 · 1909 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第十一弹:DML触发器)
DML触发器时一种用在表上的比较传统的触发器,用的最为频繁。触发器的执行顺序由于在一个表上可能定义多个触发器,因此需要首先了解一下触发器的执行顺序。单行触发器执行顺序当在某一行上定义了多个触发器时,执行顺序如下: 1. BOFORE语句触发器 2. BEFORE行级触发器 3. 执行DML语句 4. AFTER行级触发器 5. AFTER语句触发器多行触发器执行顺...原创 2018-08-10 01:02:13 · 565 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第十弹:理解触发器)
触发器简介触发器的一个明显的特性就是不能被显式地调用,当触发事件发生时就会隐式地执行该触发器,且不接收参数。 触发器通常用来以下几个方面: - 完成表的变更校验:当表数据发生INSERT、UPDATE或DELETE时,提供验证逻辑、检查完整性约束、记录日志等操作。 - 自动数据库维护:通过使用系统级的触发器,可以在数据库系统启动或退出时,通过触发器完成系统的初始化和清除操作。 - 控制...原创 2018-08-09 23:03:05 · 417 阅读 · 1 评论 -
Oracle PL/SQL进阶编程(第一弹:子程序结构)
子程序简介一般来说,过程和函数被称为子程序。过程是一段不具有返回值的代码块,而函数会返回一个值。子程序与匿名块的最大不同是它可以存储到数据库的数据字典中,以便重用。 过程一旦被创建,就以编译的形式被存储在数据库中,这样就可以从别的PL/SQL命名块或是匿名块中调用了。子程序的优点子程序被创建后,就可以在user_object数据字典中查询:SELECT object_type 对原创 2017-09-19 22:48:42 · 934 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第三十六弹:异常处理的一些经验)
从异常中恢复当触发异常以后,代码的执行立即跳转到异常处理部分,异常处理部分结束后,语句块就终止了。如果在处理完异常之后想继续执行抛出异常的地方后面的代码,可以将异常包装在子块中,在子块中写对应的异常控制程序,这样一旦在子块中有错误发生,子块内部的异常处理器就捕获异常。当子块结束时,就可以继续执行外层块中的下一条语句。获取异常抛出的位置如下代码:DECLARE ...BEGIN S原创 2017-08-15 21:39:08 · 673 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第三十五弹:异常的传递)
执行时异常传递执行时异常传递是指在PL/SQL块的执行部分抛出异常的传递机制。 1. 如果当前PL/SQL的异常处理部分具有一个匹配的异常处理器,则执行当前块的异常处理器,然后将控制权传递到外层语句块。 2. 如果当前PL/SQL块中没有匹配的异常处理器,则在当前块中抛出的异常会被传递到外层的异常处理器,然后执行外层语句块的步骤1中的匹配操作。 3. 如果已经到了顶层,没有外层语句块了,则异常原创 2017-08-14 23:25:19 · 605 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第二十三弹:其他常用函数)
分组函数 函数名称 描述 AVG 返回传入的列值得平均值 COUNT 返回查询的行的数目 SUM 返回传入的列的总和 MIN 返回查询中的列的最小值 MAX 返回查询中的列的最大值其他函数 函数名称 描述 NVL(exp1,exp2) 判断exp1的值是否为NULL,不为NULL则返回exp1,为NULL则返回exp2 NVL2(ex原创 2017-07-26 23:55:25 · 629 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第三十四弹:RAISE_APPLICATION_ERROR)
RAISE_APPLICATION_ERROR在子程序内部使用时,能从存储子程序中抛出自定义的错误消息。这样就能将错误报告给应用程序而避免范围未捕获异常。语法如下:RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors]);error_number是范围在-20000到-20999之间的负整数,error_message是最原创 2017-08-10 23:12:56 · 6124 阅读 · 1 评论 -
Oracle PL/SQL开发基础(第三十三弹:EXCEPTION_INIT)
如果有一些异常并没有异常名称,比如一些ORA-开头的异常并没有一个友好的预定义的异常定义,此时在WHEN子句中无法使用具体的异常名称,必须要使用OTHERS异常处理器进行捕捉。通过EXCEPTION_INIT编译指示,可以为这些不在预定义异常范围内的异常添加名称。编译指示是指能在编译期而非运行时进行处理的编译指令。编译指令EXCEPTION_INIT将告诉编译器,将异常名称和错误编号关联起来,使得在原创 2017-08-10 22:35:16 · 2003 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第三十二弹:SQLCODE和SQLERRM)
尽管一个异常在同一时刻只能抛出一次,但是实际上错误的消息文本可能包含来自多个异常的消息,这是因为异常具有传递性。在OTHERS处理器中处理异常时,有几种方法可以得到错误信息栈中的错误消息,其中最常用的是SQLCODE和SQLERRM。SQLCODE函数返回当前的错误编码,对于用户自定义的异常,SQLCODE总是返回1;SQLERRM用于返回错误消息文本,对于自定义的异常,SQLERRM总是返回“Us原创 2017-08-10 21:25:55 · 1740 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第二十二弹:类型转换函数)
上一篇讲到了类型转换函数。不过那么多的类型转换函数中,常用的也就是TO_CHAR,TO_NUMBER,TO_DATE这几个。下面对这几个进行详细的介绍。使用TO_CHAR将日期型转换为字符串默认情况下,日期格式都是以DD-MON-YY来显示的,为了使其他的 显示格式显示日期值,可以使用TO_CHAR将日期从默认格式转换为指定的格式。例如:SELECT TO_CHAR (SYSDAT原创 2017-07-26 00:02:53 · 928 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第三十一弹:自定义异常)
声明异常如:DECLARE e_nodeptno EXCEPTION;BEGIN NULL;END;异常的声明跟变量的声明非常相似,其类型为EXCEPTION。不过异常是一种错误的表示形式,而不是一个真正的变量,因此不能在赋值语句或SQL语句中使用异常,但是异常和变量的作用范围和规则是相同的。作用域范围在同一个块中不能声明一个异常两次,但是可以在不同的块中声明相同的异常。在原创 2017-08-09 23:52:18 · 498 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第三十弹:预定义异常)
无论是预定义错误还是自定义错误,Oracle在内部都会隐含地触发一个错误,每个错误都有一个序号,SQLCODE就是异常的编码,SQLERRM用来获取异常的信息。但是在PL/SQL进行异常处理时,不能直接使用异常编码,必须使用一个名字来引用和处理异常。因此PL/SQL为一些公共的错误定义了一系列的预定义异常。 常见的预定义异常如下: Oracle错误号 SQLCODE值 异常名称 异原创 2017-08-09 22:30:46 · 737 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第二弹:子程序参数)
子程序可以带有参数,参数可以具有不同的模式,可以按值传递,也可以通过引用传递。形参与实参形式参数:子定义子程序时,在定义语句中定义的参数称为形式参数,简称形参。形参的数据类型不包含任何的长度约束。通常使用p开头作为形参的前缀,如p_deptno。 实际参数:在调用子程序时,传入的具体参数值称为实际参数,简称实参。实参和它对应的形参必须类型兼容。参数模式形参的模式用来控制形原创 2018-08-06 20:44:24 · 358 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第三弹:子程序进阶技术)
在SQL中调用子程序如果编写的PL/SQL函数可以像Oracle内置函数一样被SQL调用,需要遵循一定的规则: - 所有函数的参数必须是IN模式。 - 参数的数据类型和RETURN子句的返回类型必须能被Oracle数据库识别,这是因为PL/SQL兼容所有的Oracle数据类型,但是PL/SQL扩充了自己的类型,比如BOOLEAN、INTEGER、记录、集合、自定义的子类型等。 - 函数必...原创 2018-08-06 23:50:37 · 1223 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第十四弹:系统事件触发器)
查看触发器源码可以通过DBA_TRIGGERS、ALL_TRIGGERS、USER_TRIGGERS视图查看触发器相关信息,也可以通过PL/SQL DEVELOPER等可视化工具查看。删除和禁用触发器如果不在需要触发器可以使用 DROP TRIGGER删除触发器: DROP TRIGGER trigger_name;如果只是暂时地禁用触发器的执行,可以使用ALTER TRIG...原创 2018-08-11 13:46:20 · 376 阅读 · 0 评论 -
Oracle PL/SQL高级编程(第七弹:性能优化:理解执行计划)
如果写了一个大而复杂的PL/SQL应用程序,想要跟踪对子程序的调用,比如看到子程序的执行顺序,则可以使用DBMS_TRACE包,该包的使用过程与DBMS_PROFILER类似,一个主要区别在于DBMS_TRACE可以设定需要跟踪的事件:调用、异常、SQL甚至...原创 2018-08-13 20:23:25 · 413 阅读 · 0 评论 -
Oracle PL/SQL高级编程(第六弹:性能优化:使用DBMS_TRACE包)
如果写了一个大而复杂的PL/SQL应用程序,想要跟踪对子程序的调用,比如看到子程序的执行顺序,则可以使用DBMS_TRACE包,该包的使用过程与DBMS_PROFILER类似,一个主要区别在于DBMS_TRACE可以设定需要跟踪的事件:调用、异常、SQL甚至每一个PL/SQL代码的可运行。DBMS_TRACE默认已经被安装在Oracle系统中,在包中主要的函数有如下两个: - set_pls...原创 2018-08-13 19:03:11 · 1274 阅读 · 1 评论 -
Oracle PL/SQL进阶编程(第九弹:使用系统包:DBMS_JOB)
在Oracle开发中,经常需要对一些任务进行调度。在Oracle中,调度任务又称为作业,只要是使用DBMS_JOB包来实现的。创建作业SUBMIT这个过程用来创建一个作业,并且输出作业号码。当建立新的作业时,需要给出作业要执行的操作,作业在下一次运行的日期及运行的时间间隔,语法如下:PROCEDURE SUBMIT(job OUT BINARY_INTEGER, ...原创 2018-08-08 23:50:34 · 499 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第八弹:使用系统包:DBMS_ALERT)
报警是Oracle中单向的、以事务提交为基础的对数据库报警事件的异步报警通知,比如可以在数据库数据发生变化时,某个字段的值发生变化时,通过报警向用户发送电子邮件通知。 报警是基于事务的,意味着除非能够报警的事务被提交,否则等过过程中的事务不会获得报警。要使用DBMS_ALERT包,需要以DBA身份登录,为用户赋权: GRANT EXECUTE ON DBMS_ALERT TO scott;...原创 2018-08-08 22:57:38 · 419 阅读 · 0 评论 -
Oracle PL/SQL高级编程(第五弹:性能优化:使用DBMS_PROFILER包)
对于已经存在的代码,找出影响性能的问题点至关重要,Oracle提供的DBMS_PROFILER包可以方便地发现其瓶颈所在。安装DBMS_PROFILER包在使用DBMS_PROFILER之前,要以管理员身份进入数据库系统进行安装。 1. 使用管理员身份登录,使用DESC命令判断DBMS_PROFILER包是否存在:DESC DBMS_PROFILER; 2. 如果DESC命令提示DBM...原创 2018-08-13 00:28:01 · 1290 阅读 · 0 评论 -
Oracle PL/SQL高级编程(第四弹:性能优化:提高PL/SQL程序性能的一些编程习惯)
对于一个PL/SQL应用程序来说,影响性能的原因是来自多方面的,比如不良的编程方法,数据库对象本身的构建不合理,表或索引的构建等都可能导致PL/SQL性能低下。 这里总结了一些常见的影响性能的原因以及提高性能的方案,可以把这些当成一种编程的习惯。尽量使用存储过程,避免使用PL/SQL匿名块存储过程创建后,Oracle会对其进行语法句法分析,以编译的额形式存储在数据库中,当客户端调用时,只...原创 2018-08-13 00:24:36 · 505 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第七弹:使用系统包:DBMS_PIPE)
DBMS_PIPE包用于在同一个Oracle的Instance,即例程的不同会话之间进行通信。管道非常类似于UNIX操作系统中的管道,但是Oracle管道并不是使用像在UNIX中那样的操作系统调用的机制,其管道信息被缓存在系统全局区(SGA)中,当关闭Oracle例程时,就会丢失管道信息。管道又可以分为如下两种类型: - 公用管道:指所有数据库用户都可以访问的管道。 - 私有管道:只能由建立管...原创 2018-08-08 01:22:38 · 1296 阅读 · 0 评论 -
Oracle PL/SQL高级编程(第三弹:管理对象类型)
在数据字段视图user_types中保存了对象类型的详细信息,这个视图主要用来保存Oracle的类型信息,除了对象类型外,还保存了集合类型,通过typecode字段进行区分。例如要查询以emp开头的对象类型: SELECT * FROM user_types WHERE type_name like 'EMP%' and typecode = 'OBJECT';通过使用SELECT CON...原创 2018-08-12 15:40:52 · 315 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第六弹:使用系统包:DBMS_OUTPUT)
该包使得我们可以从存储过程、包或触发器中发送信息。Oracle推荐在调试PL/SQL程序时使用该包,不建议使用它来做报表输出或其他的格式化应用。启用或禁用DBMS_OUTPUT默认情况下,Oracle并没有启用DBMS_OUTPUT包,也就是说,直接使用DBMS_OUTPUT.PUT_LINE或GET_LINE来输出或获取消息,是看不到任何输出的。要先使用DBMS_OUTPUT.ENA...原创 2018-08-08 00:01:33 · 1434 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第五弹:包的进阶技术)
包重载包重载实际上就是对包中的子程序的重载,之前我们已经对子程序的重载做过介绍,这里简单看下代码。定义包规范:CREATE OR REPLACE PACKAGE emp_action_pkg_overload IS --定义一个增加新员工的过程 PROCEDURE newdept ( p_deptno dept.deptno%TYPE, --部门编号...原创 2018-08-07 22:54:35 · 346 阅读 · 0 评论 -
Oracle PL/SQL进阶编程(第四弹:理解PL/SQL包)
什么是包一个PL/SQL包由两部分组成: - 包规范:主要是包的一些定义信息,不包含具体的代码实现,是PL/SQL程序的接口部分,包含类型、记录、变量、常量、异常定义、游标和子程序的声明。 - 包体:包体是对包规范中声明的子程序的实现部分,包体的内容对于外部应用程序来说是不可见的。包的优点模块化设计。规范化的程序设计。实现信息的隐藏。提供全局共享的附加功能:在包中公开的...原创 2018-08-07 22:02:18 · 670 阅读 · 0 评论 -
Oracle PL/SQL高级编程(第二弹:管理对象表)
定义对象表对象表就像普通的表一样,只是存储的是对象类型,该表的每一个字段与对象的一个属性相对应。对象表的每一条记录存储一个对象类型的实例。语法如下: CREATE TALE table_name OF object_type;对象表基于的是系统定义的构造函数,而不是用户定义的构造函数,所以在向对象表插入数据时,必须要在构造函数中提供匹配的所有的属性值。创建的对象表一旦引用了特定的对象...原创 2018-08-12 15:13:54 · 411 阅读 · 0 评论 -
Oracle PL/SQL高级编程(第一弹:面向对象编程)
PL/SQL中对象的组成结构PL/SQL中的对象类型是一种自定义的复合类型,与包的定义很相似,由两部分组成: - 对象类型规范:是对象与应用的接口,用于定义对象的公用属性和方法。 - 对象类型体:用于实现对象类型规范所定义的公用方法。在对象类型规范中定义对象属性时,必须要提供属性名和数据类型,对象类型属性可以使用多数Oracle数据类型,但是不能使用以下类型: - LONG和LONG...原创 2018-08-12 01:05:50 · 1932 阅读 · 2 评论 -
Oracle PL/SQL进阶编程(第十五弹:动态SQL语句)
理解动态SQL语句动态SQL语句基础动态SQL语句不仅是指SQL语句是动态拼接而成的,更主要的是SQL语句所使用的对象也是运行时期才创建的。出现这种功能跟PL/SQL本身的早起绑定特性有关,早PL/SQL中,所有的对象必须已经存在于数据库中才能执行,比如要查询emp表,emp表必须已经存在,否则会报错。此时可以通过动态SQL,因为动态SQL不被PL/SQL引擎编译时分析,而是在运行时进行分...原创 2018-08-11 16:50:00 · 2994 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第二十九弹:异常处理简介)
异常处理简介Oracle中的错误可以分为如下两大类: - 编译时错误:程序在编写过程中出现的错误。PL/SQL引擎在进行编译时会发现这些错误并报告给用户,此时程序还没有完全运行。 - 运行时错误:程序在运行过程中因为各种各样的原因产生的运行时错误。由于这类错误优势难以预料,因此需要异常处理机制来进行处理。异常处理语法基本的异常处理结构的PL/SQL包含3个部分: - 在定义区,定义异常。如果使原创 2017-08-09 22:29:17 · 502 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第二十六弹:游标变量)
前面介绍游标的时候,可以看到,美定义一个游标,就为其绑定一个查询语句,这种游标称为静态游标。游标变量是另一种类型的游标,在定义时并不绑定到具体的查询,而是可以打开任何类型兼容的查询,灵活性相当大。游标变量简介原创 2017-08-02 22:02:29 · 903 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第二十四弹:游标基本结构)
游标简介游标只是一个指向查询语句返回结果的指针,因此在游标定义时,将包含一个查询定义。当游标打开后,数据被接收到一块内存区域存储,直到游标关闭。 游标实际上指向的是一块内存区域,这块内存区域位于进程全局区内部,称为上下文区域(Context Area),在上下文区域中保存了如下3类信息: - 查询返回的数据行 - 查询所处理的数据的行号 - 指向共享池中的已分析的SQL语句。在进行原创 2017-08-01 22:09:02 · 729 阅读 · 0 评论 -
Oracle PL/SQL开发入门(第三弹:变量)
变量的声明variable_name [CONSTANT] type [NOT NULL] [:=value]; 如:DECLARE v_empname VARCHAR2 (20); --定义员工名称变量 v_deptname VARCHAR2 (20); --定义部门名称变量 v_hiredate DATE NOT NULL := SYSD原创 2017-03-21 23:23:10 · 505 阅读 · 0 评论 -
Oracle PL/SQL开发入门(第四弹:数据类型)
字符类型我们来看集中常用的字符类型。CHAR如:DECLARE v_name CHAR(2 BYTE); v_name2 CHAR(2 CHAR); v_name3 CHAR; v_name4 CHAR(20);BEGIN v_name:='ab'; --正确,2个字节的字符串 v_name:='中国'; --错误,大于2个字节原创 2017-03-22 21:28:15 · 664 阅读 · 0 评论 -
Oracle PL/SQL开发入门(第五弹:运算符和表达式)
运算符类型赋值运算符赋值运算符使用:=,如:DECLARE v_variable1 VARCHAR2 (200) := 'This is a '; --定义变量变赋初值 v_variable2 VARCHAR2 (100); --定义变量 v_result VARCHAR2 (500)原创 2017-03-22 22:24:34 · 682 阅读 · 0 评论 -
Oracle PL/SQL开发入门(第六弹:控制语句)
分支控制语句IF-THEN-ELSE如:DECLARE v_count NUMBER (10) := 0; --定义计数器变量 v_empno NUMBER (4) := 7888; --定义员工编号BEGIN SELECT COUNT (1)原创 2017-03-22 23:16:12 · 633 阅读 · 0 评论 -
Oracle PL/SQL开发基础(第一弹:创建表和创建约束)
创建表创建表使用CREATE TABLE语句 如:--创建表workcenterCREATE TABLE workcenter --指定表名称( id int, --添加编号字段 name varchar2(200) --添加名称字段)除了指定列的类型之外,还可以使用列类型属性来指定列的基本约束,常用的列特性有: - NOT原创 2017-03-23 21:49:17 · 4450 阅读 · 0 评论