马士兵大哥数据库教程2阶段
user_indexes;user_tables;user_views;用户字典表dictionary
select user_tables user_views;user_indexes
视图view;create view v$_stu as select ,,, from .
建立视图要付出维护上的代价。
序列sequence,Oracle独有的东西;
create sequence seq;SELECT SEQ.NEXTVAL FORM DUAL;
数据库三范式:只是一种规范,该打破就打破。cilver Bullet 银弹,没有完美的解决方案。
第一范式:1,要有主键;2,列不可分。减少数据冗余。
第二范式:多对多表关系设定:1,不存在部分依赖;如果有多个主键,之间不能有依赖关系。即其他信息不能 部分依赖主键。
第三范式:不存在传递函数依赖。即每个非关键字都独立于其他非关键字列,并依赖于关键字。
PL/SQL的Oracle内部编程语言
T-SQL是SQ-Server 的编程语言
例如存储过程:
最简单的存储过程:begin dbms_output.put_line('HelloWorld!');end;
启动:set serveroutput on; 再执行一次上面,就会有输出。
Oracle常见7中数据类型:
1,binary_integer:整数,主要用来计数,而不是表示字段类型;例如数组下标哦。
2,number 数字类型;
3,char 定长字符串;
4,varchar 变长字符串;
5,date 日期;
6,long 长字符串,最长2GB;
7,boolean布尔类型;可以取true,false,和NULL值。
declare v_empno number(4);
v_empno v_empno%type;
复杂数据类型:
1,--table数据类型://数组
declare
type type_table_emp_empno is table of emp.empno%type index by binary_integer;
v_empnos type_table_emp_empno
begin
v_empnos(0) := 7369;
v_empnos(2) := 7839;
v_empnos(-1) := 9999; /* 可存在负数的下标 */
dbms_output.put_line(v_empnos(-1));
end;
2,--Record数据类型;//集合、类的概念
declare
type type_record_dept is record
(
deptno dept.deptno%type,
dname dept.dname%type,
loc dept.loc%type
);
v_temp type_record_dept;
3,--使用%rowtype声明record对象
declare
v_temp dept%rowtype;//可以直接根据表结构来动态定义。
PL/SQL中的SQL语句:
1,有且只有一条输出记录;
2,例子:select ename,sal into v_ename,v_sal from emp where depno = '';//sql需要配合into使用。
3,Update动作需要commit。
4,dbms_output_put_line(sql%rowcount || '条记录被影响')//sql为关键字,代表刚才执行的sql语句;
PL/SQL中的DDL语句:
begin
execute immediate 'create table T (nnn varchar2(20) default ''aaa'')' //2个单引号代表一个单引号,需要加上粉红部分;
end;/
PL/SQL分支和循环
分支:if then ; elsif then ;else ; end if;end;
循环:1) loop ; 累加;exit when 条件; end loop;end;
2) while 条件; loop ;累加;end loop;end;
3) for k in 1..10 loop ;end loop; end;//
for k in reverse 1..10 loop ;end loop;end; --完成了逆序输出循环。其中1..10代表1到10,增强的for循环。
错误处理:
exception
when 错误1 then ;
when others then ; 常见的2种:too_many_rows no_data_found //查手册
完整的例子:
--创建一个errorlog表:
create table errorlog
(
id number primary key,
errcode number,
errmsg varchar2(1024),
errdate date
);
create sequence seq_errorlog_id start with 1 increment by 1;
declare
v_depno dept.depno%type := 10;
v_errcode number;
v_errmsg varchar2(1024);
begin
delete from dept where depno = v_deptno;
commit;
exception
when others then
roolback;
v_errcode :=SQLCODE; --SQLCODE为数据库关键字,代表出错代码
v_errmsg := SQLERRM; --SQLERRM为数据库关键字,代表出错信息
insert_into errorlog values (seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate);
commit;
end;
在未知中徜徉,
求心之荡漾。