oracle学习笔记

#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等密码 : 

1、修改用户的口令,将用户的口令修改为新的密码
ALTER USER SCOTT IDENTIFIED BY NE WPASSWORD;  http://www.2cto.com/database/201301/181481.html

system sys,sysoper sysdba 的区别

分类: Oracle 相关特性 4175人阅读 评论(3) 收藏 举报

--=====================================

-- system syssysoper 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角色

 

下面具体描述syssystem帐户

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)

1、为什么要使用

答:在一个大型项目中,可能有很多模块,而每个模块又有自己的过程、函数等。而这些过程、函数默认放在一起的(如在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语句关联,在运行时可以取不同的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变量还是不变的

你可能感兴趣的:(oracle学习)