一 : 示波器的原理与使用全攻略
61阅读/ www.61k.net在数字电路实验中,需要使用若干仪器、仪表观察实验现象和结果。常用的电子测量仪器有万用表、逻辑笔、普通示波器、存储示波器、逻辑分析仪等。万用表和逻辑笔使用方法比较简单,而逻辑分析仪和存储示波器目前在数字电路教学实验中应用还不十分普遍。示波器是一种使用非常广泛,且使用相对复杂的仪器。本章从使用的角度介绍一下示波器的原理和使用方法。
二 : 触发器的原理和使用方法
触发器
触发器的定义:(www.61k.com)q触发器是当特定事件出现时自动执行的存储过程q特定事件可以是执行更新的DML语句和DDL语句 q触发器不能被显式调用 q触发器的功能:q自动生成数据 q自定义复杂的安全权限 q提供审计和日志记录 q启用复杂的业务逻辑 触发器的语法:CREATE [OR REPLACE] TRIGGER trigger_name AFTER | BEFORE | INSTEAD OF [INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE] ON table_or_view_name [REFERENCING {OLD [AS] old / NEW [AS] new}] [FOR EACH ROW] [WHEN (condition)] pl/sql_block;触发器由三部分组成: q触发器语句(事件) q定义激活触发器的 DML 事件和 DDL 事件 q触发器限制 q执行触发器的条件,该条件必须为真才能激活触发器 q触发器操作(主体) q包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行 |
create table student (id number (10 ),name varchar2 (20 ),age number( 10)); insert into student values( 1, '张三',20); insert into student values( 2, '李四',25); insert into student values( 3, '王五',30); create or replace trigger trigger1 after update --after触发器,并且针对于更新操作 on student --触发器针对哪张表 for each row -- 添加了 begin dbms_output.put_line('更新了' ); end; -- ORA-04089: 无法对 SYS 拥有的对象创建触发器 SQL >connect hr/ hr@ jiagulun update student s set s.age = s.age +5 ; SQL> set serverout on; SQL> update student s set s.age = s.age +5 ; 更新了--触发器触发了 更新了--触发器触发了 更新了--触发器触发了 3 rows updated --更新了三行触发了三次 SQL> create or replace trigger trigger1 after update on student SQL> update student s set s.age = s.age +5 ; 更新了--触发器触发了 3 rows updated --更新了三行触发了一次 SQL> 通过上面的测试可以得出: 1.对于sys用户所拥有的对象是不能建立触发器的。 2.for each row: 1.假如添加了说明是行级别的触发器,每行的更新都会触发。 2. 假如没添加就是表级别的触发器,所有的更新行只会触发一次。 |
:new 和sqlserver中的inserted :old 和sqlserver中的deleteed 如果在触发器的plsql内使用了:new 和 :old,就必须使用行级触发器也就是for each row 因为:new和:old是指向某行记录的指针,假如是表级别的触发器这两个指针不知道确定指向哪行记录 这样就会产生歧义了 当执行insert 的时候: :new存在 :old不存在。当执行delete 的时候: :new不存在 :old存在。当执行update 的时候: :new存在 :old存在。 当一个update被执行的时候: oracle是先删除记录行,所以old是需要的 oracle再insert记录行,所以new是需要的 create or replace trigger trigger2 before update on student for each row begin if :old.age > 20 or :new.age < 30 then raise_application_error (-20001 ,'大于20岁的学生不需要更新,而且更新后的年龄不能大于30' ); end if; end; SQL> update student s set s.age = s.age + 10; update student s set s.age = s.age + 10 --ORA-20001: 大于20岁的学生不需要更新,而且更新后的年龄不能大于30 --ORA-06512: 在 "HR.TRIGGER2", line 3 --ORA-04088: 触发器 'HR.TRIGGER2' 执行过程中出错 create or replace trigger trigger2 before update on student --for each row 使用了new或old就必须使用行级触发器 begin if :old.age > 20 or :new.age < 30 then raise_application_error (-20001 ,'大于20岁的学生不需要更新,而且更新后的年龄不能大于30' ); end if; end; --ORA-04082: NEW 或 OLD 引用不允许在表级触发器中 SQL> 通过上面的操作可以发现: 1. NEW 或 OLD 引用不允许在表级触发器中 2. 在update中既有new 也有 old 3. 在触发器中不能使用alter、create、事务回滚、 create or replace trigger trigger3 --ORA-04084: 无法更改此触发器类型的 NEW 值 create or replace trigger trigger3 before/after delete on student for each row begin if :old.age > 0 then |
SQL> create view stu_add_view 2 as select s.id, s.name, s.age, a.zz from student s inner join address a 3 on s.id = a.xh; View created SQL> select * from stu_add_view; ID NAME AGE ZZ ----------- -------------------- ----------- ---------- 2 李四 40 郑州 1 张三 35 开封 3 王五 45 洛阳 SQL> update stu_add_view sav set sav.zz = '江西' where sav.name = '王五'; update stu_add_view sav set sav.zz = '江西' where sav.name = '王五'; --ORA-01779: 无法修改与非键值保存表对应的列 --对于上面的错误,可以通过触发器来解决: create or replace trigger trigger4 instead of update on stu_add_view for each row declare xh3 number (10 );--变量的声明不要和列名相同,因为会出现下面问题: begin select s.id into xh3 from student s where s.name = : old.name; delete address a where a.xh = xh3;--这里,假如上面的声明是xh那么就会出现a.xh = xh这会出现恒等的情况,会删除所有记录 insert into address values (xh3 ,:new.zz ); end ; 其实instead of 触发器的sql.block中做的操作就是底层更新的操作:先删除后插入 -------------------------写一个触发器:所有的dml操作都输出操作信息---------- create or replace trigger trigger6 before insert or delete or update on student for each row begin if inserting then dbms_output.put_line('进行的是插入操作插入的信息如下:姓名:' ||:new.name ||'年龄:' ||:new.age ); elsif deleting then dbms_output.put_line ('进行的是删除操作删除的信息如下:姓名:' ||:old.name ||'年龄:' ||:old.age ); elsif updating then dbms_output.put_line ('进行的是更新操作原信息如下:姓名:' ||:new.name ||'年龄:' ||:new.age ); dbms_output.put_line ('新信息如下姓名:' ||:old.name ||'年龄:' ||:old.age ); else dbms_output.put_line ('做的是其他操作' ); end if; end; |
--------------写一个模式触发器---------------------------- create table dropped_obj (obj_name varchar2( 20), obj_type varchar2(20),drop_date date); create or replace trigger trigger1 before alter or drop on schema --针对于该用户对象的删除操作进行触发 begin insert into dropped_obj values(ora_dict_obj_name,ora_dict_obj_type,sysdate ); end ; SQL> drop table student; Table dropped SQL> select * from dropped_obj;--会发现刚刚删除的操作被记录下来 OBJ_NAME OBJ_TYPE DROP_DATE -------------------- -------------------- ----------- STUDENT TABLE 19- 1月 -15 6 : SQL> --使用的变量: --Ora_client_ip_address 返回客户端的ip地址 --Ora_database_name 返回当前数据库名 --Ora_login_user 返回登录用户名 --Ora_dict_obj_name 返回ddl操作所对应的数据库对象名 --Ora_dict_obj_type 返回ddl操作所对应的数据库对象的类型 --------------写一个数据库触发器---------------------------- create table event_table ( event varchar2( 30), time date ); create or replace trigger trigger_start after startup on database begin insert into event_table values (ora_sysevent ,sysdate ); end ; create or replace trigger trigger_shut before shutdown on database; begin insert into event_table values (ora_sysevent ,sysdate ); end ; SQL> shutdown immediate; --关闭数据库事件 Database closed. Database dismounted. ORACLE instance shut down. SQL> startup; ORACLE instance started.--开启数据库事件 Total System Global Area 400846848 bytes Fixed Size 2213776 bytes Variable Size 251660400 bytes Database Buffers 142606336 bytes Redo Buffers 4366336 bytes Database mounted. Database opened. SQL> select * from event_table;--两个事件都被记录下来了 EVENT TIME ------------------------------ ------------ SHUTDOWN 19- JAN- 15 STARTUP 19- JAN- 15 SQL> --------------写一个登录触发器触发器---------------------------- create table log_table (username varchar2( 20), logon_time date , logoff_time date, address varchar2( 20)); create or replace trigger trigger_login after logon on database begin insert into log_table values(Ora_login_user,sysdate ,null ,Ora_client_ip_address ); end ; create or replace trigger trigger_logout before logoff on database begin update log_table lt set lt.logoff_time = sysdate where lt.username = Ora_login_user; end; SQL> exit;--退出操作 Disconnected fromOracleDatabase 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning , OLAP , Data Mining and Real Application Testing options [oracle@ localhost ~]$ sqlplus / as sysdba --登录操作 SQL*Plus: Release 11.2.0.1.0 Production on Mon Jan 19 06: 37: 49 2015 Copyright ( c) 1982 , 2009, Oracle. All rights reserved. Connected to : Oracle Database 11 g Enterprise Edition Release 11.2 .0.1.0 - 64 bit Production With the Partitioning , OLAP , Data Mining and Real Application Testing options SQL> select * from log_table; USERNAME LOGON_TIME LOGOFF_TIME ADDRESS -------------------- ------------ ------------ -------------------- SYS 19- JAN- 15 19- JAN- 15 SYS 19- JAN- 15 6 rows selected. SQL> |
三 : Android 之Handle的使用原理理解
Handle的使用,首先我们要明白一点,那就是Handle的用处,Handle是用来做什么的,明白了这点,那么我在来理解下面的内容。
一:接下来我来说明一下Handle的用途
Handle到底是什么,我们为什么要来使用Handle,Handle 其实跟Intent有点类似,这里我直说类似,没有说什么是一样的啊,这种话,不是我说的,intent是用来实现四大组件之间的通信用的,而Handle呢?这个它的用途就是实现线程之间的通信,例如:当子线程做一个耗时的操作的时候,我们并不知道他什么时候做完,做完了也不知道,那么,我们是不是需要一个东西来通知我们,让我们知道呀,所以说,也就有了Handle的来源,没有Handle这个东西,对我们来说,非常的麻烦。
二:Handle的消息机制原理
1.图形展示
下载图片,下载完成之后通知主线程更新ui)
1.主线程中有一个消息处理器Handle,被放在主线程中的消息队列中
2.在主线程中有一个MessageQueue 也就是消息队列,存放消息
3.在主线程中也有一个Looper (不停的循环消息队列取消息)如果有新的消息就将消息交给消息处理器,handle会调用其中的handleMessage处理消息
3.具体实施
1.子线程,利用handle发送消息放在主线程的消息队列中
2.主线程里面有一个looper循环获取消息
3.发现新的消息,就会调用handlemessage方法处理消息
三:示例代码:
package com.zengtao.classwork;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.widget.ProgressBar;
public class MainActivity extends ActionBarActivity {
private ProgressBar pb; // 进度条
private int[] randData = new int[100]; // 数组
private int index = 0; // 索引
private int mProgressStaus = 0; // 设置进度条的长度
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pb = (ProgressBar) findViewById(R.id.pb);
// 初始化handle,绑定在主线程中的队列消息中
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 接收消息
if (msg.what == 0x111) {
mProgressStaus = index;
pb.setProgress(mProgressStaus);
}
}
};
// 创建子线程,在子线程中处理耗时工作
new Thread() {
@Override
public void run() {
super.run();
while (index<100) {
doWork();
Message msg = new Message();
msg.what = 0x111;
mHandler.sendMessage(msg);
}
}
}.start();
}
/**
* 模拟耗时工作(一定要在子线程中做)
*
* @return 进度条的多少
*/
public int doWork() {
randData[index++] = (int) (Math.random() * 100);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return index;
}
}
四:示例代码注解
1.主线程中创建Handle对象
2.子线程中发送消息到队列中
3.主线程looper获取消息,利用handleMessage()方法处理
以上便是handle的使用,以及原理的解析,写的不明白的,请谅解,将此分享给大家,希望对你们有所帮助。
扩展:handle机制的原理 / handle原理 / android handle
本文标题:示波器的原理和使用-示波器的原理与使用全攻略61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1