一:
触发器分为行级触发和语句级触发器,
for each now — 行级触发起
基本语法为:
create or replace trigger tri_name before insert on table_name for each now
begin
select sysdate into :new.col_name from dual;
end;
如果是trigger中,肯定是有以下两个元素的:
:new
:old
指定是同一个值,一个指代原值,一个指代修改后的值
insert时 只有new 没有old 代表着要插入的新记录
delete时 只有old 没有new 代表着要删除的记录
update时 二者都可用 new表示要替换的新数据、old表示要被更改的原来的数据行.
":="是赋值语句
在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的返回值被赋予INTO子句中的变量。
基本语法
两个表
:new和:old关键字 — :new 是要插入表中的 :old 是表中已经存在的旧的记录
一个语句写入所有DML关键字
如果一个trigger中,update、delete、insert都有,则标准格式为:
if inserting then
xxx;
elsif deleting then
xxx;
elsif updating then
xxx;
end if;
除了select语句不同,其余update\delete\insert都是一样的
如何在trigger或者存储过程中创建一个变量,然后在下一个步骤中用到这个变量?
答:declare:就是用来定义变量用的,存储过程、触发器里面都会用.
两个表做一个trigger,则:old :new的含义
如果函数或trigger中出现了异常,则:
EXCEPTION
WHEN NO_DATA_FOUND THEN
return “no data found.” – 处理方法
end;
二:游标cursor:
只有变量和游标才能放在declare代码块中。
游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开。
查询返回结果超过一行时,就需要一个显式游标,且此时用户不能使用select into语句
select into 可以是多列,但不能是多行,如果查询出有多行,则必须要用游标
基本语法:
Cursor c_s Is Select Name,num From school;
由于游标存储的数据一定会超过一行,因此如果要使用必定会用到循环loop。
使用循环有两种方式:
1.for c in 游标名 loop
xxx – 执行代码块
end loop;
2.loop
fetch 游标名 into 声明变量1,声明变量2
这种方法要手动打开和关闭游标
循环,if elsif代码块 基本语法。
总结触发器的用法:基本语法格式(包括一些基本的关键字、游标),多个DML操作写在一个语句中,
循环,if elsif代码块。
三:
使用group by的两个要素:
出现在select后面的字段要么是group by的字段,要么是聚合函数中的。
权限:权限和同义词一般要一起设置,设置同义词后,查其他用户的表就不需要写其他用户的用户名
设置同义词和把表权限赋给另一用户,都是在同一个用户下执行两个sql语句即可。
四:
execute immediate 作用:在pl/sql(存储过程)中运行DDL语句,DML语句不需要用到。
执行动态sql语句,给动态语句传值(USING 子句)
一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,
但是DDL语句及系统控制语句却不能在PL/SQL中直接使用