#1.数据库相当于一个仓库,它用来保存数据的,我们可以通过数据库管理系统像oracle等来创建数据库,管理及操作数据库(备份,查询,建表等), 创建表实际是通过数据库管理系统like oracle划了一片内存来保存数据,然后用orcale自带的已经实现的可以用来管理数据的组件来管理数据库比如备份,数据完整性(回滚) 等,
#2.sql是数据库用来向外通信的,比如java可以通过sql来访问数据库。查询器可以访问数据库。所有这些都不是神奇存在的,他只是一个仓库用来保存数据,orcale作为这个仓库的管理工具可以帮忙建仓库,设计仓库的内容(表),以及管理仓库的日常事务像备份(开关仓库门)等,还有就是数据库的操作(借出借入/新增等)。
#3.oracle自带的服务产品PL/SQL是一个程序设计语言,也就是说它不单单是返回结果like 标准sql那样,他还可以对查询结果作进一步处理,总之PL/SQL可以用sql及oracle的函数进行程序化的设计,比如一个触发器,一个存储过程,我们可以想象他们想当于java中的类等,当她们被触发或被调用时便可以作为程序的一部分进行使用,需要参数传入时也可以传入参数,和其他的程序设计没什么两样,只是他使用的是sql和oracle自带的一些函数来实现罢了。
#存储过程是一个程序片段放在数据库中,可以被调用,trigger也是放在数据库中的代码,由所产生的事件触发,package包是把多个过程组合在一起当做单个程序单元的代码放在数据库中.
#4.一般说oracle数据库指的是整个oracle数据库管理系统,但我们真正需要用的其实是只是一个个实例(数据库---一个个库),每个实例都要用SID来标识,每个实例就是一个服务器
#Jack说了可以在一个个实例上创建一个个schema, 可以看作一个个用户,但这个用户有点特别,他会拥有一些属于自己这个schema的表,别的schema(用户)拥有的table如果没有授权给别的schema(用户),其他schema是看不到的。比如今早创建了一个scott2的schema后,发现没有dba_tables这个table,后来问Jack,他说要用超级用户(schema) SYS授权后才可以的 :GRANT SELECT ON DBA_TABLES TO SCOTT;
执行这条语句后才可以 在SCOTT Schema中访问这个table( 这个情况中只是给了select权限 ):SELECT * FROM DBA_TABLES WHERE OWNER = 'SCOTT'
##5.启动数据库实例之前,可以使用sql*plus来连接到数据库,就像jack一开始的操作一样:
cmd--->sqlplus/nolog 然后connect username/password AS SYSDBA
---->显示连接成功后,便可以修改SYS等密码 :
system sys,sysoper sysdba 的区别
--=====================================
-- system sys,sysoper sysdba 的区别
--=====================================
Oracle 中sys,system帐户以及登陆时的normal,sysoper,sysdba是经常容易混淆的几个概念,下面详细讲述了
这几个的区别。
###6system sys,sysoper sysdba 的区别
这篇文章说的区别: : http://blog.csdn.net/leshami/article/details/5989565
一、sys,system帐户
当Oracle 数据库安装完毕后,系统会自动创建两个帐户如下:
sys:缺省密码为CHANGE_ON_INSTALL ,且被授予DBA角色
system:缺省密码为MANAGER,且被授予DBA角色
下面具体描述sys与system帐户
sys :这个帐户相当于SQL server中的sa帐户,或者说Xp系统中的administrator,或Linux系统中的root帐户,是个超级帐户,拥有的
权限最大,可以完成数据库的所有管理任务。Oracle中全部的基表,视图等都是以sys架构存储在数据字典中,类似于SQL server中
的master数据库,存储了所有最原始最基本最关键的系统结构,数据等。因此所有以sys架构的对象不允许用户或数据库管理员修改
,也不建议创建sys架构的对象。
system :该帐户除了不能完成备份恢复,以及升级之外的数据库所有管理任务,通常用来创建一些用于查看管理信息的表或视图,以及
一些被不同Oracle数据库选项和工具使用的内部表或内部视图。同样也不建议使用system架构来创建一些与管理无关的表或视图。
###7.group by使用的目的是研究分组后有什么我们有用的信息,所以使用group by查询出来的结果反应的是分组后的情况,并不是单个record的情况,所以目标是不同的,所以这时的关注点应该是有多少组,有那些组或属于哪一组等信息。 所以经常用having为条件来挑选出符合我们条件的组,而这个条件我们就可以放在having中。
###使用UNION语句的语境是单使用多个查询条件查相同的信息时,我们可以考虑使用UNION来一次性将结果查出来,比如两个都是想查员工姓名 name,职位 job 和部门, 一个查询条件是 sales部位问的所有员工的这些信息,而另一个requirement是查职位是Manager的员工的那些信息。这两个需求希望得到的东西是一致的,但他们有各自的条件,所以我们就可以用UNION来实现: select name,job,dep from emp where dep="sales"
union
select name,job,dep from emp where job="manager"----->这样可以一次性将所需要的信息查出来。
###8.视图是映射到真实表的一组sql,在创建视图后就可以把视图当成一个虚拟表那样进行查询等使用:(在hibernate中使用的定义一组sql的做法个人猜测也是使用了视图的思想)
视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。 视图:查看图形或文档的方式。 视图是从一个或多个表或视图中导出的表,其结构和数据是建立在对表的查询基础上的。和表一样,视图也是包括几个被定义的数据列和多个数据行,但就本质而言这些数据列和数据行来源于其所引用的表。 所以视图不是真实存在的基础表而是一张虚表,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的表中。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。 当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。 视图有很多优点,主要表现在: •视点集中 •简化操作 •定制数据 •合并分割数据 •安全性
###9序列:
oracle数据库中如何使用序列
http://blog.sina.com.cn/wodedipanshixie
标签: 杂谈 |
你是一个程序员吗?如果是!那么您知道oracle数据库中的序列吗?不知道就请仔细阅读下面的内容。如果您不是程序员也请您读一读吧!它将会将您如何在oracle数据库中使用序列。
我来为您讲解在oracle数据库中如何使用序列。在oracle数据库中没有像SqlServer中的自动增长列,而是用序列来代替自动增长列的。我们如何来使用序列呢?首先我们要有序列对象,如果没有序列对象,我们就来创建一个序列对象。
实现代码的语法是:
create sequence 序列名
requence的意思是序列。
我来举个例子:
代码 :
Create sequence v1; 创建了一个叫v1的序列对象。
在oracle数据库中要使下一列的序列自动增长光有对象也是不行的,还需要有它的函数nextval。 我们如何用呢?我们只需要用序列对象点nextval就行了如下:
V1.nextval 这样就可以使列增长一个数。
要记住的是我们要是列不断增长那么就必须每次都调用nextval函数。
因为nextval的意思是每次在“前面数”的基础上加“1”,相当于Java中的“++”一样
也许这样说你会有些糊涂,不明白是怎么回事。请看下面的例子:
我们来添加数据
Insert into dept(deptno,dname) values(v1.nextval,’aaa’);
Insert into dept(deptno,dname) values(v1.nextval,’sss’);
Insert into dept(deptno,dname) values(v1.nextval,’ddd’);
在表中会出现
1 |
aaa |
2 |
sss |
3 |
ddd |
如果不调用序列的nextval函数则不会出现以上的格式
完整的例子为:
Create sequence v1;
Insert into dept(deptno,dname) values(v1.nextval,’aaa’);
Insert into dept(deptno,dname) values(v1.nextval,’sss’);
Insert into dept(deptno,dname) values(v1.nextval,’ddd’);
1 |
aaa |
2 |
sss |
3 |
ddd |
##10.存储过程和函数是PL/SQL块的一种特殊类型,这些可以以编译的形式存放在数据库中,可以被其他程序块调用。
##11. my first procdure:
create or replace procedure addDataToCountries4(
tid countries4.country_id%type,
tname countries4.country_name%type,
region countries4.country_region%type,
description countries4.country_description %type,
remark countries4.remark%type)AS
Begin
insert into SCOTT.Countries4
( country_ID,
country_Name,
country_Region,
country_Description,
remark)
values(tid,tname,region,description,remark)
;
End addDataToCountries4;
begin
addDataToCountries4('UK','American','America','it is in north american','test remark');
end;
###11.oracle中的包
Jack说有包头无包体的就类似java的抽象类,而只有包体没有包头的就相当于内部类,只在当前包可以调用,当如果要被另一个外面包调用,必须要有包头,外面包就是通过包头来调用另一个包里面的存储过程,函数,变量,record,游标等东西的。
包就是为了把一些关系比较密切的东西放在一起,比如如果管理上需要,就可以把对一个表的增删查改等操作放在一个包中.这样方便查找和管理。
Oracle包(Package)
答:在一个大型项目中,可能有很多模块,而每个模块又有自己的过程、函数等。而这些过程、函数默认是放在一起的(如在PL/SQL中,过程默认都是放在一起的,即Procedures中),这些非常不方便查询和维护,甚至会发生误删除的事件。所以通过使用包就可以分类管理过程和函数。
而且在包中还可以自定义自定义类型,从而在过程和函数中可以直接使用自定义变量。Oracle中包的概念与JAVA中包的概念非常类似,只是JAVA中的包是为了分类管理类,但是关键字都是package。
包分两部分,包规范和包体。
2、包的使用
(1)定义包规范,包规范可单独存在。
--定义包规范create or replace package p_stu as --定义结构体 type re_stu is record( rname student.name%type, rage student.age%type ); --定义游标 type c_stu is ref cursor; --定义函数 function numAdd(num1 number,num2 number)return number; --定义过程 procedure GetStuList(cid in varchar2,c_st out c_stu); end;
(2)实现包规范,即包体,名称必须一致,同样的游标定义不能出现,但结构体可以,方法、过程必须实现。
--实现包体,名称一致。create or replace package body p_stu as --游标和结构体,包规范中已声明,包体中不用再声明,直接使用。 --实现方法 function numAdd(num1 number,num2 number)return number as num number; begin num:=num1+num2; return num; end; --实现过程 procedure GetStuList(cid varchar2,c_st out c_stu) as r_stu re_stu; --直接使用包规范中的结构 begin open c_st for select name,age from student where classid=cid; -- 如果已经在过程中遍历了游标,在使用这个过程的块中,将没有值。 -- loop -- fetch c_st into r_stu; -- exit when c_st%notfound; -- dbms_output.put_line('姓名='||r_stu.rname); -- end loop; end; end;
(3)使用
declare c_stu p_stu.c_stu; --定义包中游标变量 r_stu p_stu.re_stu; --定义包中结构体变量 num number; begin --使用及遍历包中过程返回的结果集 p_stu.GetStuList('C001',c_stu); loop fetch c_stu into r_stu; exit when c_stu%notfound; dbms_output.put_line('姓名='||r_stu.rname); end loop; --使用包中的方法 select p_stu.numAdd(5,6) into num from dual; dbms_output.put_line('Num='||num); end;
##index-by是一种集合类型,类似于数组, TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER
tablettype是这个新定义的类型的名字,就像数组的名字一样,
type是指这个类型所放的内容的类型,比如数组中所放的是字符型或数字
INDEX BY BINARY_INTEGER 表明该类型是一个index-by表类型数据。int a[]= new int[10]
##嵌套表和index-by表的不同是,嵌套表是有序的,从1开始递增,v_name(1)=AC,v_name(2)=BC...而index-by表是无序存储的,仅仅是在存储上,但他仍然需要从对应的下标来取回值.
##可变数组在最大限内是可变的。
##接下来便是对这些集合的操作等。。如count属性,增删查改等操作。
###1.游标是用来处理select语句返回的结果集的,显式游标要声明,要打开,要close。隐式游标则不需要。 显式游标一般与循环结构使用,允许处理多于一行的结果集,当结果集多于一行的,必须使用显式游标。而隐式游标一般用来处理一行的结果集。 游标使用是基本固定的:定义变量和游标,打开游标,用fetch语句取select的结果值到变量中,`,然后用while循环 loop 到 end loop来查出结果集。
%found 和%notfound来判断游标是否成功,查到一行数据则返回成功,否则返回false。
%rowcount是游标的总行数。(相当于 resultset.size())====>jdbc的resultset操作跟游标非常类似.
隐式游标的直观特征是有into,也就是直接在行中把selelct出来的结果放到变量中如: select name,age into v_name,v_age from employee 这就是使用了隐式游标,他不用 声明,打开,关闭,也不用循环,但它只能返回一行结果集,所以一般用来判断查询一个table时是否有返回值时比较有用. select first 1.* from abc ...
推荐使用显式游标 .
注意使用for循环和显式游标结合使用就不用打开,关闭,fetch数据等,比较方便
for region_rec(别名变量) in region_cur(游标)
if region_rec.name=='abc'
insert into def values(region_rec.name);
..............
###游标变量和游标是两个不同的东西,就像常量和变量的关系一样,游标是静态的,因为它与特定的查询绑定在一起。 而游标变量是动态的,它指向多行查询的结果集的当前行。
游标变量就像指针,java中的引用,保存的是内存地址,而不是项目的本身。游标总是指向相同的查询工作区,而游标变量可以指向不同的工作区,游标和游标变量不能相互操作。
###首先要定义游标变量的类型 REF CURSOR, 然后才可以声明游标变量,然后使用open-for为某个查询区打开游标变量,然后使用FETCH从结果集中提取行,当所有行处理完后可以使用close关闭游标变量.===>也就是说游标变量的用处同样是用来操作结果集的,只不过它可以为任何一个查询打开游标变量,而游标是和特定的查询绑定在一起的。 OPEN em-cv(游标变量) FOR select name,age from emp;====>you see,可以为一个查询打开一个游标变量。
至于定义游标变量类型时是强和弱,strong的就是加上了返回类型,也就是打开游标给一个查询后要求返回的类型,它可以是一个结果集,也可以是一个表中的一行%rowtype(个人认为和游标要求 接受变量的数目和select的数目要一致的意思是一样的), 而weak的不需要定义,但个人觉得其实在OPEN 游标变量 FOR select 查询区时,它会默认和查询回来的结果集的一行的数据类型一致的,也就是默认会加上%rowtype 的。所以没有影响,因为实际上也保证了 接受变量的数目和select的数目是一致的.接下来便可以按照游标变量的方式去操作结果集.
##
Oracle 游标和游标变量的区别汇总
游标变量可以在运行时刻与不同的SQL语句关联,在运行时可以取不同的SQL语句.它可以引用不同的工作区.
游标和游标变量是不能相互代替的. 如何定义游标类型
TYPE ref_type_name IS REF CURSOR [RETURN return_type];
声明游标变量
cursor_name ref_type_name; ref_type_name 是后面声明游标变量时要用到的我们的游标类型(自定义游标类型,即CURSOR是系统默认的,ref_type_name是我们定义的 );return_type代表数据库表中的一行,或一个记录类型
TYPE ref_type_name IS REF CURSOR RETURN employee%TYPERETURN 是可选的,如果有是强类型,可以减少错误,如果没有return是弱引用,有较好的灵活性. 不能在包头里面声明游标变量,注意,但可以定义游标类型,要注意这二者的区别.可以声明游标变量作为函数或过程的形式参数.
%TYPE一个列类型
%ROWTYPE行类型控制游标变量
OPEN-FOR(打开游标变量,与多行查询连接起来) FETCH(从结果集中取行数据),close(关闭游标变量)BULK COLLECT子句将游标变量中的行一次性提取到一个集合中.
cursor 和 ref cursor的区别
从技术底层看,两者是相同的。普通plsql cursor在定义时是“静态”的。而Ref cursors可以动态打开。
例如下面例子:
Declare
type rc is ref cursor;
cursor c is select * from dual;
l_cursor rc;
begin
if ( to_char(sysdate,'dd') = 30 ) then
open l_cursor for 'select * from emp';
elsif ( to_char(sysdate,'dd') = 29 ) then
open l_cursor for select * from dept;
else
open l_cursor for select * from dual;
end if;
open c;
end;
/
l rc根据逻辑动态打开;而游标c定义好了只有就无法修改了。
l ref cursor可以返回给客户端,cursor则不行。
l cursor可以是全局的global ,ref cursor则必须定义在过程或函数中。
l ref cursor可以在子程序间传递,cursor则不行。
l cursor中定义的静态sql比ref cursor效率高,所以ref cursor通常用在:向客户端返回结果集
###静态游标是以游标打开时刻的当时状态显示结果集的游标。静态游标在游标打开时不反映对基础数据进行的更新、删除或插入。有时称它们为快照游标。动态游标是可以在游标打开时反映对基础数据进行的修改的游标。用户所做的更新、删除和插入在动态游标中加以反映。
这句话没懂,谁能举例说明下 ,谢谢
动态游标就是当你在修改之后,修改映射到你的游标,而静态游标,当你修改了你游标指向的数据时,不进行映射,我感觉就像指针,动态就是,你修改了指针指向的地址上的东西,指针的值也变,但是静态游标就像是变量,你将a变量的值赋值给b变量,b变量再怎么变,a变量还是不变的