sql触发器

【赵强老师】利用数据库触发器实现数据的同步

好久不见. 提交于 2020-04-07 10:14:05
一、什么是触发器 数据库触发器是一个与表相关联的,存储的PL/SQL 语句。每当一个特定的数据操作语句(insert update delete)在指定的表上发出时,Oracle自动执行触发器中定义的语句序列。 触发器的应用场景如下: 复杂的安全性检查 数据的确认 数据库审计 数据的备份和审计 二、创建Oracle触发器的语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE [OF column [, column …]]} [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...] ON [schema.]table_name | [schema.]view_name [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}] [FOR EACH ROW ] [WHEN condition] PL/SQL_BLOCK | CALL procedure_name; 其中: BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器

pl/sql

老子叫甜甜 提交于 2020-04-06 10:52:33
一、pl/sql编程语言 --复合索引触发规则,复合索引第一列位有限检索列 --必须包含优先检索列中的值,才会触发 1.声明方法 declare i number(10) :=10; s varchar2(10) :='小红'; ena emp.ename%type; --引用型的变量 emprow emp%rowtype;--记录型变量 begin dbms_output.put_line(i); dbms_output.put_line(s); select ename into ena from emp where empno=7788; dbms_output.put_line(ena); select * into emprow from emp where empno=7788; dbms_output.put_line(emprow.ename || '工作为' || emprow.job); end; 2.pl/sql中的if判断 declare i number(3) :=&i; -- &i输入一个数 begin if i<18 then dbms_output.put_line('未成年'); elsif i<40 then dbms_output.put_line('成年人'); else dbms_output.put_line('老年人'); end if

sql语句性能优化

社会主义新天地 提交于 2020-04-03 21:37:55
面试的时候被面试官问到sql语句的性能优化,回来百度才发现我了解的那些真的是凤毛麟角,废话不多说,上干货: 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。 3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。 4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20 5,in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了:Select id from t where num between 1 and 3 6,下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’ 或者select id from t

工作三年了,该报多少工资?

天大地大妈咪最大 提交于 2020-03-23 19:48:05
  本人自从毕业后都在长沙工作,工资待遇一直都很一般,到现在才3500/月,做的项目都是些中小型的项目,没干过什么大项目,平时工作也不是很忙,也没在项目当中学习过什么很牛逼的技术,有时间自己也自学了不少,就想以后走人能够找份好工作,最近想打算辞职去广州或者深圳,谋得一份好工作,也不想非得要很高的工资,想听听大家的建议,得开都少工资才合适?下面提供我自己简历的掌握技术的那一部分: 熟悉基于 C# 的 B/S 和 C/S 模式开发。 熟悉Javascript,Jquery 等脚本开发语言和框架。 熟悉 Linq , Asp.net Ajax , Asp.net 服务器端控件开发。 熟悉 C# 设计模式。 了解 CLR(都是在CLR Via C#书上学的) 熟悉 MVC , EF 。 熟悉 SQLServer2005 数据库,精通 SQL 语句 ,存储过程和触发器的编写。 熟悉 SQL 语句的查询优化,有较强的数据分析能力。 请各位帮忙建议下,在此谢过!!! 来源: https://www.cnblogs.com/chenlinfei/p/3200349.html

游标和触发器

可紊 提交于 2020-03-12 12:15:10
1. 游标的定义 在 PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指针,或是命名一个工作区(Work Area),或是一种结构化数据类型。它为应用等量齐观提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法,是设计嵌入式SQL语句的应用程序的常用编程方式。 游标分类 1. 显式 游标用于处理 SELECT 语句返回的多行数据;人为创建,干预 2. 隐式 游标用于处理 SELECT INTO 和非查询的 DML 语句;系统自动创建,管理 2. 显式游标示例练习 --游标传参,显示游标 DECLARE -- 定义游标,指定循环列表 cursor c_cur is select * from ruanjian182; -- 定义收参 v_info ruanjian182%rowtype; BEGIN -- 打开游标 open c_cur; -- loop 循环获取. loop fetch c_cur into v_info; -- 退出条件判断 exit when c_cur%notfound; dbms_output.put_line(v_info.id || ' '||v_info.name); end loop; -- 关闭游标

创建视图与触发器

狂风中的少年 提交于 2020-03-11 20:11:45
CREATE VIEW test.v AS SELECT * FROM t;   表和视图共享数据库中相同的名称空间,因此,数据库不能包含具有相同名称的表和视图。     视图必须具有唯一的列名,不得有重复,就像基表那样。默认情况下,由SELECT语句检索的列名将用作视图列名。要想为视图列定义明确的名称, 可使用可选的column_list子句,列出由逗号隔开的ID。column_list中的名称数目必须等于SELECT语句检索的列数。 SELECT * FROM v;    视图定义服从下述限制:   · SELECT语句不能包含FROM子句中的子查询。   · SELECT语句不能引用系统或用户变量。   · SELECT语句不能引用预处理语句参数。   · 在存储子程序内,定义不能引用子程序参数或局部变量。   · 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。   · 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。   · 在视图定义中命名的表必须已存在。   · 不能将触发程序与视图关联在一起。   在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。  

MySQL存储过程

穿精又带淫゛_ 提交于 2020-03-07 14:08:00
摘自:https://www.cnblogs.com/l5580/p/5993238.html MySQL5 中添加了存储过程的支持。 大多数SQL语句都是针对一个或多个表的单条语句。并非所有的操作都怎么简单。经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件。虽然他们的作用不仅限于批处理。 为什么要使用存储过程:优点 1 通过吧处理封装在容易使用的单元中,简化复杂的操作 2 由于不要求反复建立一系列处理步骤,这保证了数据的完整性。如果开发人员和应用程序都使用了同一存储过程,则所使用的代码是相同的。还有就是防止错误,需要执行的步骤越多,出错的可能性越大。防止错误保证了数据的一致性。 3 简化对变动的管理。如果表名、列名或业务逻辑有变化。只需要更改存储过程的代码,使用它的人员不会改自己的代码了都。 4 提高性能,因为使用存储过程比使用单条SQL语句要快 5 存在一些职能用在单个请求中的MySQL元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码 换句话说3个主要好处简单、安全、高性能 缺点 1 一般来说,存储过程的编写要比基本的SQL语句复杂,编写存储过程需要更高的技能,更丰富的经验。 2 你可能没有创建存储过程的安全访问权限。许多数据库管理员限制存储过程的创建,允许用户使用存储过程

[Java面试十二]数据库概念相关

南楼画角 提交于 2020-03-05 12:54:02
1. 什么是存储过程?它有什么优点? 答:存储过程是一组予编译的 SQL 语句, 它的优点有: 允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次。 允许更快执行,如果某操作需要执行大量 SQL 语句或重复执行,存储过程比 SQL 语句执行的要快。 减少网络流量,例如一个需要数百行的 SQL 代码的操作有一条执行语句完成,不需要在网络中发送数百行代码。 更好的安全机制,对于没有权限执行存储过程的用户,也可授权他们执行存储过程。 2. oracle的 存储过程和函数有什么区别? Oracle 中的函数与存储过程的 区别 : A: 函数必须有返回值 , 而过程没有 . B: 函数可以单独执行 . 而过程必须通过 execute 执行 . C: 函数可以嵌入到 SQL 语句中执行 . 而过程不行 . 其实我们可以将比较复杂的查询写成函数 . 然后到存储过程中去调用这些函数 . Oracle 中的函数与存储过程的 特点 : A. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。 B. 对于存储过程来说可以返回参数,而函数只能返回值或者表对象。 C. 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于 FROM 关键字的后面。 3. 什么是事务? 答

你真的了解触发器么?

本秂侑毒 提交于 2020-03-05 09:58:54
  当我们想更新一张动态表的时候(即:表中的数据不断的添加),也许我们会用数据库代理,通过写作业,然后让他定时查询动态表中最新添加的数据,然后更新数据。这样时能实现更新数据的要求,但是数据却不能实时同步更新。   这个时候,触发器就是我们想要的神器了。我们可以在那张动态表上新建触发器。触发器的实质就是个存储过程,只不过他调用的时间是根据所建的动态表发生该表而执行(即:Insert新数据,Update或者Delete数据)。   具体怎么使用触发器,今天我这里就不介绍了,园子里资料多的很。那么我今天要介绍的是什么呢? 前几天在写sql代码的时候无意间发现了这么个问题:就是我一直以为每当动态表中插入一条数据,触发器就执行一次,但是我这样理解的话,当批量插入数据的时候,触发器执行的次数和插入的行数相同,但是事实不是这样。乘着今天有点时间,就想写出来和大家分享下,讲的不对请大家斧正!   下面,我就写了个简单的例子供大家参考。 --我们要建触发器的动态表 Create table Table_a ( ID int identity(1,1),--自增ID Content nvarchar(50), UpdateIDForTrigger int ) 然后我们在该表上创建一个触发器 Create TRIGGER [dbo].[Table_a_Ins] ON [dbo].[Table_a]

mysql(3)mysql的sql语句入门

∥☆過路亽.° 提交于 2020-03-03 12:41:08
1.登录mysql与退出mysql 登录:mysql -u账号 -p密码 -h主机地址 -P端口号 -e 执行的sql语句; //密码一般不直接写出,回车后隐藏写入 ,-h可以不写默认是localhost 退出:quit,exit ,ctrl+c 备注:参数可分为全局和会话,可修改与不可修改,全局需要加上global,例如 set global 参数 =值,会话级别只对当前会话有效, 例如set 【session】 autocommit=1;中间可以省略session,例如需要全局的话需要 set global autocommit=1;不能持久化,重启后是默认值,全局设置对已经开启了会话的不起作用,只会对以后连接的会话有效,查看可以使用show 【global/session】 【variables 】 【like pattern】 变量名 来查看。 备注:dbms数据库管理系统 ,dba数据库管理员, sql(ddl 表结构,dml增删改 ,dql 查询,dcl数据库控制,tcl事物控制) 2.数据的导入与导出 1)数据的导入:source (运行在mysql下的命令) select version();//查看当前数据库版本; create database 数据库名称;//创建数据库 show databases ; //显示所有的数据库,产看数据库是否已经导入,也可以使用