第一周
ArcGIS安装问题和Git知识
1、ArcGIS10.1安装问题
安装过程中工具箱类打开为空白,没有任何工具。解决办法:由于IE8不支持工具显示,安装IE9后显示正常。
2、RSA非对称加密算法
Git的.ssh文件利用了RSA非对称加密算法,是利用了数论里的欧拉定理来完成公钥和私钥生成过程。两个质数相乘容易,因式分解困难,所以非常难破解。
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
3、Git常用操作命令
查看状态git status,添加git add ***,提交git commit –m “message”,检出git checkout --***.
http://www.cnblogs.com/52fhy/p/3973887.html 快速上手
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 全面
ORACLE基础知识
1、Oracle基础概念
- 只有oracle实例才能访问oracle数据库管理系统,在安装oracle的时候系统是安装oracle实例,再安装oracle数据库。
- 配置监听:通过Net Manager来进行配置。
- 企业管理器:oracle11g的企业管理器不再提供C/S控制,而是通过B/S进行控制。https://localhost:1158/em 打开网址之前需要额外启动OracleDBConsoleorcl服务。
- Oracle用户、对象管理在企业管理器中进行。创建用户时,有默认的表空间、概要文件、系统、对象、角色、限额这些常用功能。
1) 默认的表空间(USERS和TEMP),表空间实际上是储存的物理结构,可以通过限额来分配表空间的储存大小。不要选SYSTEM作为表空间,因为那是系统储存的表空间,像电脑的C盘一样,别的用户用储存的东西过多,会导致系统的触发器和查询效率降低。
2) 概要文件default:主要用来设置用户登录时间,登录限制,密码错误限制等配置。
3) 系统权限:主要是对表结构、视图、触发器等高级操作如下图:
4) 对象权限:别的用户所建立指定表格的增删改查权限。如下图
5) 角色:系统权限和对象权限的一个集合。可以将角色授予用户,被授予角色的用户会自动拥有角色所具有的权限。如果修改了角色所拥有的权限,则被授予角色的用户的权限也会随之自动修改。
- PLSQL Developer打开命令窗口,输入ed回车可以打开文本编辑器,保存后可以输入/,回车运行。
- DML: Data Manipulation Language 数据操纵语言(增删改查)。DDL: Data Definition Language 数据定义语言(定义数据表结构、表创建、索引)。DCL: Data Control Language 数据控制语言(数据访问,提交回滚、授予权限等)。
- desc tableName;显示表的列信息。或describe tableName
- select *** from tableName; 中可以进行加减乘除运算。若列中有空值,则运算结果也为空值。空值不等于0!运算结果为空不是0;
- 起别名,要么加AS关键字,要么用双引号。只有在起别名的时候用双引号!
- 连接符 ||,类似于java print字符串中的加号。
- 单引号表示字符串。
- 单行函数,一条记录产生一个结果,比如日期转换、大小写转换等。多行函数,聚合函数,比如求一个部门多个员工的平均工资,多条记录产生一个结果。
- IF-THEN-ELSE:可以在Select中进行case表达式判断。或者用DECODE函数。
- 多表连接查询:连接N个表至少需要N-1个连接条件。
- 等值连接和非等值连接。相等、在一个范围之间。
- 外连接和内连接。内连接不包含不匹配的行,外连接返回不匹配的左边的或者右边的所有行。
- 分组函数。SELECT col, function(col) FROM tableName [WHERE condition group by col]. 在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中。SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING groupConditon;
- 表:基本数据存储集合,由行和列组成。USER_TABLES
- 视图:从表中抽取逻辑上相关的数据集合。USER_VIEWS
- 序列:提供有序的数值。USER_SEQUENCES
- 索引:提高查询效率。 USER_INDEXES USER_IND_COLUMNS
- 同义词:给对象起别名。USER_CATALOG
2、SQL查询命令注意点
3、常见数据库对象
4、表对象操作
创建新表,删除表,清空表,修改列,改变对象名称
- CREATE TABLE tableName()
- DROP TABLE tableName
- TRUNCATE TABLE tableName
- ALERT TABLE tableName ADD|MODIFY|(DROUP COLUMN)|(REAME COLUMN)
- RENAME objectName TO newName
5、数据库事务
一组逻辑操作单元,是数据从一种状态转变到另外一种状态。
- 事务组成
1) 一个或多个DML 语句
2) 一个 DDL(Data Definition Language – 数据定义语言) 语句
3) 一个 DCL(Data Control Language – 数据控制语言) 语句
- 数据库事务以第一个DML语句执行作为开始,以commit、rollback、DDL语句(自动提交)、用户回话正常结束、系统异常终止,作为结束。
- SAVEPOINT保存点,可以回滚至保存点。
- 提交或回滚前的数据状态:
1) 其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
2) DML语句所涉及到的行被锁定, 其他用户不能操作。阻塞
3) 执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
- 提交后的数据状态
1) 数据的改变已经被保存到数据库中。改变前的数据已经丢失。所有用户可以看到结果。
2) 锁被释放,其他用户可以操作涉及到的数据。
3) 所有保存点被释放
- 回滚后的数据状态
1) 数据改变被取消。修改前的数据状态被恢复。锁被释放
6、数据库约束
约束CONSTRAINT:表的强制规定。可以在表级(作用多或一列)、列级(作用一列)定义约束。
- 约束分为constraint_type
1) NOT NULL 非空
2) UNIQUE 唯一
3) PRIMARY KEY 主键 primary key (col)
4) FOREIGN KEY 外键 foreign key (col) references tableName (col2)
5) CHECK 检查 check (col > ***)
- 定义方式:列约束必须跟在列的定义后面,表约束不与列一起,而是单独定义。
- 查询表格的约束。SELECT constraint_name, constraint_type, search_condition FROM user_constraints WHERE table_name = 'EMPLOYEES';
7、数据库视图
存储起来的 SELECT 语句
- 使用视图的原因
1) 控制数据访问
2) 简化查询(不用去连表查询,视图已经连表完成)
3) 避免重复访问相同的数据
- 创建或修改视图:CREATE OR REPLACE VIEW viewName as subquery
- ROWNUM伪列,只能使用 < 或 <=,而用 =, >, >= 都将不能返回任何数据。伪列,就相当于Excel中最左边的行编号。分页操作:
select * from (
Select rownum rn , A.* from ( //rn重新编号
Select * from tableName //所有数据
) where rownum < 40 //最大范围
) where rn > 10; //最小范围
比如:
select * from(
select rownum rn, A.* from( select last_name, salary from employees order by salary desc ) A
where rownum < 5
) where rn > 2
8、数据库序列
序列SQUENCE:可供多个用户用来产生唯一数值的数据库对象。
- 序列的作用:
1) 自动提供唯一的数值,共享对象
2) 主要用于提供主键值
3) 将序列值装入内存可以提高访问效率
- 序列在下列情况下出现裂缝:
1) 回滚
2) 系统异常
3) 多个表同时使用同一序列
9、数据库索引
- 索引的作用:
1) 一种独立于表的模式对象,可以存储在与表不同的磁盘或表空间中
2) 索引被删除或损坏, 不会对表产生影响,其影响的只是查询的速度
3) 索引一旦建立,Oracle 管理系统会对其进行自动维护,而且由 Oracle 管理系统决定何时使用索引。用户不用在查询语句中指定使用哪个索引
4) 在删除一个表时,所有基于该表的索引会自动被删除
5) 通过指针加速 Oracle 服务器的查询速度
6) 通过快速定位数据的方法,减少磁盘 I/O
- 什么时候创建索引,表如果经常更新就不要创建索引了
1) 列中数据值分布范围很广
2) 列经常在 WHERE 子句或连接条件中出现
3) 表经常被访问而且数据量很大 ,访问的数据大概占数据总量的2%到4%
- 注意:索引不需要用,只是说我们在用name进行查询的时候,速度会更快。当然查的速度快了,插入的速度就会慢。因为插入数据的同时,还需要维护一个索引。
- 同义词synonom,为数据对象定义同义词
10、同义词
1) 方便访问其它用户的对象
2) 缩短对象名字的长度
3) 创建同义词CREATE SYNONYM e FOR employees;使用同义词select * from e;
ORACLE高级操作
1、Oracle控制用户权限
用system来登录,具有DBA权限,可以创建用户。
1.创建用户
CREATE USER user IDENTIFIED BY password;
2.用户系统权限
GRANT privilege [, privilege...] TO user [, user| role, PUBLIC...];
1) 权限列表
CREATE SESSION(创建会话)登录
CREATE TABLE(创建表)
CREATE SEQUENCE(创建序列)
CREATE VIEW(创建视图)
CREATE PROCEDURE(创建过程)
3. 创建用户表空间。
用户拥有create table权限之外,还需要分配相应的表空间才可开辟存储空间用于创建的表
ALTER USER atguigu01 QUOTA UNLIMITED ON users
4.创建角色并赋予权限
创建角色:CREATE ROLE manager;
赋予系统权限:GRANT create table, create view TO manager;
将角色赋予用户:GRANT manager TO DEHAAN, KOCHHAR;
5.修改密码
ALTER USER scott IDENTIFIED BY lion;
6.对象权限
不同的对象具有不同的对象权限
对象的拥有者拥有所有权限
对象的拥有者可以向外分配权限,通过对象拥有这才可以进行分配。
GRANT object_priv [(columns)]
ON object
TO {user|role|PUBLIC}//public向数据库中所有用户分配权限
[WITH GRANT OPTION]; //使用户同样具有分配权限的权利
列子:
GRANT select
ON employees
TO sue, rich;
Grant succeeded.
收回对象权限:
REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];
2、SET运算符
将多个查询用 SET 操作符连接组成一个新的查询
UNION/UNION ALL 去重/不去重
INTERSECT 交集
MINUS 差集
比如:注意,列要一一对应。
SELECT employee_id, job_id
FROM employees
UNION
SELECT employee_id, job_id
FROM job_history;
3、高级子查询
待补充。周末学习。
PLSQL知识
1、基本语法
PL/SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE 数据库进行访问。由于该语言 集成于数据库服务器中, 所以PL/SQL 代码可以对数据进行快速高效的处理。
PL/SQL由三个块组成:声明、执行、异常。块结构如下:
DECLARE
/* 声明部分 : 在此声明 PL/SQL 用到的变量 , 类型及游标,以及局部的存储过程和函数 */
BEGIN
/* 执行部分 : 过程及 SQL 语句 , 即程序的主要部分 */
EXCEPTION
/* 执行异常部分 : 错误处理 */
END;
其中 执行部分是必须的。
Plsql Dev中需要设置set serveroutput on;否则看不到程序输出结果。
PLSQL块主要有三类:
1)无名块,动态构造,只执行一次。2)子程序,存储在数据库中的存储过程、函数和包。当数据库建立好后,可以在其它程序中调用它们。3)触发器,当数据库发生一些操作时,会自动调用它们。
2、PLSQL的好处
B/S架构中,瓶颈是网络IO,进行大量的数据交换会降低传输效率。利用PLSQL将数据处理放在服务器中进行,会省去了数据在网络中交换的时间。
PLSQL也可以嵌套在客户端工具中,方便使用。
2、变量自定义类型
1)%type获取已定义的某个已经变量类型相同,或者与数据表中某个列的数据类型相同。相当于一个java类的某一个字段。
declare
type test_resc is record(
l_name employees.last_name%type,
d_id employees.department_id%type);
v_emp test_resc;
2)%rowtype获取对应表的所有列的类型。相当于一个java类。
declare
v_emp employees%rowtype;
begin
select * into v_emp from employees where employee_id = 200;
dbms_output.put_line(v_emp.last_name);
end;
3、流程控制
条件判断(两种)
1)if … then … elsif …. Then … Else …. End if; 注意是elsif不是else if
2)case selector when expression1 then result1 when expression2 then result2 else result end;
循环三种
1)Loop 要执行的语句; exit when 条件语句 //满足条件退出 end loop;
2)while 布尔表达式 loop 要执行的语句; end loop;
3)for 循环计数器 in [reverse] 下限… 上限 loop 要执行的语句; end loop;
Reverse 循环会自动减1,否则默认自动加1,因此循环变量必须是整数。
declare
type dep_table_type is table of employees%rowtype; //定义一个储存employee表的数组类型。
my_dep_table dep_table_type := dep_table_type(); //初始化
begin
my_dep_table.extend(5); //容量为5
for i in 1 .. 5 loop //开始循环
select * into my_dep_table(i) //每次记录在第i个中
from employees
where employee_id = 100;
end loop;
dbms_output.put_line(my_dep_table(1).employee_id); //输出
end;
标号和goto
<<label>>标号 goto label
4、游标的使用
类似于java中的Iterator。迭代器。对于处理多行记录的事务经常使用游标来实现。
游标是一个指向上下文的句柄(handle)或指针。
1)定义游标:定义一个游标名,以及对应的SELECT语句。
CURSOR cursor_name[(parameter[, parameter]…)] is select_statement;
定义的游标中不能有INTO语句
2)打开游标:就是执行对应的SELECT语句,并且把结果放入工作区,指针指向工作区的首部。
OPEN cursor_name[([parameter => ] value[, [parameter =>] value]…)]
不能重复打开一个游标
3)提取游标数据
检索结果集合中的数据行,放入指定输出变量中。
FETCH cursor_name INTO {variable_list | record_variable}
对该记录进行处理;继续处理直到活动集合中没有记录。
4)关闭游标
释放系统资源。关闭后可以重新open打开。
CLOSE cursor_name;
declare
--定义游标
cursor c_cursor is select last_name, salary
from employees
where rownum < 11
order by salary;
v_name employees.last_name%type;
v_sal employees.salary%type;
begin
--打开游标
open c_cursor;
--提取游标
fetch c_cursor into v_name, v_sal;
while c_cursor %found loop
dbms_output.put_line(v_name || '---' || v_sal);
fetch c_cursor into v_name, v_sal;
end loop;
--关闭游标
close c_cursor;
end;
游标属性:
%found 布尔属性,当最近一次读取记录成功是返回,值为TRUE;
%notfound 与found相反
%isopen 布尔属性,当游标打开返回TRUE;
%rowcount 数字属性,返回已从游标中读取的记录数。
游标for循环语句,可以省略打开、提取、关闭功能。Where current of cursor_name
5、异常的处理
三种方式。Java中只有两种,try … catch 和 throws。
三种类型的异常错误:1)预定义错误 2)非预定义错误3)用户定义错误。
EXCEPTION
WHEN first_exception THEN handler
WHEN second_exception THEN handler
WHEN OTHERS THEN handler
1)预定义错误:
ORA-1403 No_data_found SELECT INTO 没有找到数据
ORA-1422 Too_many_rows SELECT INTO 返回多行
2)非预定义异常处理
定义异常情况 <异常情况> EXCEPTION;
将定义好的异常情况与标准ORACLE错误联系起来
PRAGMA EXCEPTION_INIT(<异常情况>,<错误代码>);
//错误代码号oracle会报出来,就是没有命名
在异常处理块中对异常进行处理
3)用户自定义异常
定义异常情况 <异常情况> EXCEPTION;
RAISE<异常情况> //抛出异常
在异常处理块中进行处理
SQLCODE返回错误代码数字
SQLERRM返回错误信息
例如dbms_output.put_line(SQLCODE||’---‘||SQLERRM);
6、存储函数和存储过程
都是函数。存储函数funciton有返回值,存储过程procedure没有返回值return,但是可以有OUT返回参数。
1)创建函数
建立内嵌函数
CREAT [OR REPLACE] FUNCTION function_name
[(argment [{ IN | IN OUT}] Type,
Argment [{IN | OUT | IN OUT}] Type )] //参数列表
[ AUTHID DEFINER | CURRENT_USER] //定义者权限和调用者权限
RETURN retrun_type
{IS | AS}//声明函数使用过程中所需要的变量,类似于declare
<类型,变量的类型>
BEGIN
FUNCTION_body
EXCETPION
其它语句
END;
注意:IN参数标记表示传递给函数的值在函数执行中不改变;(默认)只有一个返回值
OUT表示一个值在函数进行计算并通过该参数传递给调用语句;//具有多个返回值
IN OUT表示函数的值可以变化传递给调用语句
因为函数需要一个返回值,所以RETURN包含返回结果的数据类型。
--返回给定部门的工资总和、该部门员工总数(定义为OUT类型的参数)
create or replace function get_salary(
dept_id number,
emp_count out number)
return number
is
--函数使用过程中,需要声明的变量和记录类型、游标
v_sum number(10) := 0;
cursor salary_cursor is select salary from employees
where department_id = dept_id;
begin
--函数执行体
emp_count := 0;
for c in salary_cursor loop
v_sum := v_sum + c.salary;
emp_count := emp_count + 1;
end loop;
return v_sum;
exception
--异常的处理
when no_data_found then
dbms_output.put_line('您需要的数据不存在');
when others then
dbms_output.put_line(sqlcode || ':' || sqlerrm);
end;
调用,一共有两个返回值,一个是函数执行结果,一个是v_num OUT参数。
declare
v_num number(5) := 0;
begin
dbms_output.put_line(get_salary(80, v_num));//v_num返回值,返回员工总数
dbms_output.put_line(v_num);
end;
7、触发器
类似于JavaScript事件函数。触发器在数据库里以独立的对象存储,不能接收参数。
1)触发器分类
DML触发器。可以在DML操作前后触发。
替代触发器。由于不能直接对两个以上表所建立的视图进行操作,所以有替代触发器。
系统触发器。系统事件,比如数据库启动与关闭。
2)触发器组成
触发器事件。任何情况下触发tigger
触发器时间。是事件前还是事件后。
触发器本身。触发器handler。
触发频率。执行次数。
3)创建触发器
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER}
{INSERT | DELETE | UPDATE [OF column, [column …]]} //注意没有查找!select
ON [schema.] table_name
[FOR EACH ROW] //说明为 行触发器。
[WHEN condition] //触发条件
Tigger_body;
行触发器是在DML进行多行操作时,会对每一行都进行触发判断。
语句触发器是将整个语句操作作为触发事件。
4)触发器执行次序
1.执行 BEFORE 语句级触发器;
2. 对与受语句影响的每一行:
执行 BEFORE 行级触发器
执行 DML 语句
执行 AFTER 行级触发器
3. 执行 AFTER 语句级触发器
触发器不能有数据库事务控制。
create or replace trigger del_emp_trigger
before delete on emp for each row
begin
insert into emp_history
values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
end;