游标是什么: 游标字面理解就是游动的光标。
用数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等等。 游标的分类: 显式游标和隐式游标 显示游标的使用需要4步: 1。
声明游标 CURSOR mycur(vartype number) is select emp_no,emp_zc from cus_emp_basic where com_no = vartype; 2。打开游标 open mycur(000627) 注:000627:参数 3。
读取数据 fetch mycur into varno,varprice; 4。关闭游标 close mycur; 游标的属性 oracle 游标有4个属性: %ISOPEN , %FOUND , %NOTFOUND, %ROWCOUNT %ISOPEN 判断游标是否被打开,如果打开%ISOPEN 等于true,否则等于false %FOUND %NOTFOUND 判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false %ROWCOUNT 返回当前位置为止游标读取的记录行数。
示例: set serveroutput on; declare varno varchar2(20); varprice varchar2(20); CURSOR mycur(vartype number) is select emp_no,emp_zc from cus_emp_basic where com_no = vartype; begin if mycur%isopen = false then open mycur(000627); end if; fetch mycur into varno,varprice; while mycur%found loop dbms_output。 put_line(varno||','||varprice); if mycur%rowcount=2 then exit; end if; fetch mycur into varno,varprice;。
仅使用权限、角色、视图甚至细粒度安全策略建立访问控制系统还不能保证数据库的安全。
因此,开启审计数据库的使用能让我们知道访问控制机制是否确实像所希望的那样工作。 审计分为标准审计和细粒度审计,标准审计基于语句级、权限级和对象级。
而细粒度审计涉及某种粒度的数据访问。 比如某个经理应该能够看到为他工作的雇员工资有关信息。
那么,怎样才能知道这位经理是否还查看了他的顶头上司的工资信息?是否要审计这位经理的所有的select语句?这个时候利用细粒度审计 (FGA)可以只审计一个表种的某些行,还可以将FGA作为一种侵入检测装置。 1。
启用审计 alter system set audit_trail = DB scope = spfile; 有些网站上写可以scope = both,但是实际修改时无法修改指定的类型,只能修改到spfile重启实例,还望达人指教。 audit_trail主要有如下几个值: NONE:10g的默认值,表示禁用数据库审计; OS:将审计记录写到一个操作系统文件中。
Examda提示: 写入的目录由audit_file_dest参数指定,但是注意:在Windows NT下(我是XP),审计记录不启用这个参数,而是直接写道本地管理日志,需要到管理中查看。 DB:将审计记录写入数据库审计跟踪,棵视为DBA_AUDIT_TRAIL(存储在SYS。
AUD$表中)。启用这个参数后注意将相关的几张表以及索引从system表空间下改到另一个表空间。
select * from dba_tables t where t。 table_name = 'AUD$'; select * from dba_tables t where t。
table_name = 'AUDIT$'; select * from dba_tables t where t。table_name = 'AUDIT_ACTIONS'; alter table aud$ move tablespace TBS_PM; alter table AUDIT$ move tablespace TBS_PM; alter table AUDIT_ACTIONS move tablespace TBS_PM; alter index I_aud1 rebuild tablespace TBS_Index; alter index i_audit rebuild online tablespace TBS_Index; alter index i_audit_actions rebuild online tablespace TBS_Index; 另有DBExtened,XML这里不做介绍了,常用的就是以上3个。
2。修改AUDIT_TRAIL后,重启实例,然后指定审计的表和活动。
create table test_audit ( col1 varchar2 (10) ); audit update on test_audit; audit insert on test_audit; insert into test_audit(col1) values ('dfasd3424'); update test_audit t set t。 col1 = '132rf'; commit; select * from dba_common_audit_trail; 1 Standard Audit 19330 8 1 15-9月 -08 12。
07。32。
343000 上午 +08:00 PREMOBILE PAUL_XI\Administrator WORKGROUP\PAUL_XI 1416:4828 PAUL_XI 0 PREMOBILE TEST_AUDIT 103 SESSION REC 05002F009C0A0000 0 0 NONE ------S--------- 2 Standard Audit 19353 33 1 15-9月 -08 10。 21。
02。328000 上午 +08:00 PREMOBILE PAUL_XI\Administrator WORKGROUP\PAUL_XI 1416:2348 PAUL_XI 0 PREMOBILE TEST_AUDIT 103 SESSION REC 09000F00DA0A0000 0 0 NONE ------S---S----- 3。
为审计使用系统级触发器(个人认为这个已经不是Audit审计功能,而仅仅是触发器) 创建数据库启动触发器 create table logon_audit ( user_id varchar2(30), sess_id number (10), logon_time date, logoff_time date, host varchar2(20) ); create or replace trigger logon_audit_trig after logon on database begin insert into logon_audit values(user,sys_context('userenv','sessionid'),sysdate,null,sys_context('userenv','host')); commit; end; select * from logon_audit; 1 PREMOBILE 19327 2008-9-14 23:51:22 WORKGROUP\PAUL_XI 2 PREMOBILE 19328 2008-9-14 23:51:35 WORKGROUP\PAUL_XI 3 SYSMAN 0 2008-9-14 23:49:44 PAUL_XI 4 SYSMAN 0 2008-9-14 23:50:49 PAUL_XI。
ORACLE 内部函数篇 254。
CHARTOROWID(CHAR) 将包含外部语法 ROWID 的 CHAR 或 VARCHAR2 数值转换为内部的二进制语法 , 参数 CHAR 必须是包含外部语法的 ROWID 的 18 字符的字符串 。 SELECT NAME FROM BSEMPMS WHERE ROWID=CHARTOROWID('AAAAfZAABAAACp8AAO'); NAME : LEIXUE 255。
CONVERT(CHAR,DEST_CHAR_SET,SOURCE_CHAR_SET) CONVERT 将字符串 CHAR 中的字符从 SOURCE_CHAR_SET 标识的字符集转换为由 DEST_CHAR_SET 标识的字符集 SELECT CONVERT('GroB','US7ASCII','WE8HP') 'CONVERSION' FROM PUBS; CONVERSION: Gross 256。 HEXTORAW(CHAR) 将包含十六进制的 CHAR 转换为一个 RAW 数值 。
INSERT INTO BSEMPMS(RAW_COLUMN) SELECT HEXTORAW('7D') FROM TEST; 257。 RAWTOHEX(RAW) 将 RAW 数值转换为一个包含十六进制的 CHAR 值 。
SELECT RAWTOHEX(RAW_COLUMN) 'CONVERSION' FROM BSEMPMS; CONVERSION: 7D 258。 ROWIDTOCHAR(ROWID) 将一个 ROWID 数值转换为 VARCHAR2 数据类型 。
SELECT ROWID FROM BSEMPMS WHERE ROWIDTOCHAR(ROWID) LIKE '%BR1AAB%'; 259。 TO_MULTI_BYTE(CHAR) 将 CHAR 中的单字节转换为等价的多字节字符 。
SELECT TO_MULTI_BYTE('ASFDFD') FROM TEST; 260。 TO_SINGLE_BYTE(CHAR) 将 CHAR 中的多字节转换为等价的单字节字符 。
SELECT TO_SINGLE_BYTE('ASFDFD') FROM TEST; 261。 TRANSLATE USING(TEXT USING {CHAR_CS|NCHAR_CS}) 将文本 TEXT 按照指定的转换方式转换成数据库字符集和民族字符集 。
其中 TEXT 是待转换的 。 USING CHAR_CS 参数转换 TEXT 为数据库字符集 , 输出数据类型是 VARCHAR2。
USING NCHAR_CS 参数转换 TEXT 为数据库字符集 , 输出数据类型是 NVARCHAR2。 CREATE TABLE TEST(CHAR_COL CHAR(20),NCHAR_COL NCHAR(20)); INSERT INTO TEST VALUES('HI,N'BYE'); SELECT * FROM TEST; 262。
DUMP(EXPR,RETURN_FORMAT,START_POSITION,LENGTH) 返回一个包含数据类型代码 , 字节长度等内部表示信息的 VARCHAR2 值 。 返回结果是当前数据库字符集 , 数据类型按照下面规定的内部数据类型的编码作为一个数字进行返回 : 代 码 数据类型 0 VARCHAR2 1 NUMBER 8 LONG 12 DATE 23 RAW 24 LONG RAW 69 ROWID 96 CHAR 106 MSSLABEL 参数 RETUEN_FORMAT 指定按照下面的基数表示返回的数值 。
RETURN_FORMAT RESULT 8 8 进制 10 10 进制 16 16 进制 17 单字符表示 如果参数 RETURN_FORMAT 没有指定 , 则按十进制表示返回 。 如果参数 START_POSITION 和 LENGTH 被指定 , 则从 START_POSITION 开始的长为 LENGTH 的字节将被返回 , 缺省是返回整数表示 。
SELECT DUMP('ABC',1016) FROM TEST; select dump(ename,8,3,2) 'example' from emp where name='ccbzzp'; 263。 empty_b|clob() 返回一个空的 LOB 定位符 , 用在初始化 LOB 变量 , 或用在 INSERT 及 UPDATE 声明去初始化 LOB 列或将其属性置为空 。
INSERT INTO TABLE1 VALUES(EMPTY_BLOB()); UPDATE TABLE1 SET CLOB_COL=EMPTY_BLOB(); 264。 BFILENAME('DIRECTORY','FILENAME') 返回一个 BFILE 定位符 , 相关的二进制 LOB 物理文件在服务器的文件系统上 。
目录 DIRECTORY 是指在服务器的文件系统上实际搜索路径全名的别名 。 FILENAME 是指服务器的文件系统的文件名 。
相关内容:oracle问题集汇总。
oracle入门知识 一个表空间只能属于一个数据库每个数据库最少有一个控制文件(建议3个,分别放在不同的磁盘上) 每个数据库最少有一个表空间(system表空间) 建立system表空间的目的是尽量将目的相同的表存放在一起,以提高使用效率,只应存放数据字典 每个数据库最少有两个联机日志组,每组最少一个联机日志文件 一个数据文件只能属于一个表空间一个数据文件一旦被加入到一个表空间中,就不能再从这个表空间中移走,也不能再加入到其他表空间中 建立新的表空间需要建立新的数据文件 commit后,数据不一定立即写盘(数据文件) 一个事务即使不被提交,也会被写入到重做日志中。
oracle server可以同时启动多个数据库 一套操作系统上可以安装多个版本的oracle数据库系统(unix可以,nt不可以) 一套oracle数据库系统中可以有多个oracle数据库及其相对应的实例。
PL/SQL块的命名和匿名 PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块。
匿名程序块可以用在服务器端也可以用在客户端。 命名程序块可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。
PL/SQL程序块可背独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序: 。
函数 。 过程 。
包 。 触发器 函数 函数是命名了的、存储在数据库中的PL/SQL程序块。
函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下: FUNCTION name [{parameter[,parameter,。
])] RETURN datatypes IS [local declarations] BEGIN execute statements [EXCEPTION exception handlers] END [name] 过程 存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同,存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用,定义存储过程的语法如下: PROCEDURE name [(parameter[,parameter,。 。
])] IS [local declarations] BEGIN execute statements [EXCEPTION exception handlers ] END [name] 包(package) 包其实就是被组合在一起的相关对象的集合,当包中任何函数或存储过程被调用,包就被加载入内存中,包中的任何函数或存储过程的子程序访问速度将大大加快。
包由两个部分组成:规范和包主体(body),规范描述变量、常量、游标、和子程序,包体完全定义子程序和游标。 触发器(trigger) 触发器与一个表或数据库事件联系在一起的,当一个触发器事件发生时,定义在表上的触发器被触发。
变量和常量 变量存放在内存中以获得值,能被PL/SQL块引用。 你可以把变量想象成一个可储藏东西的容器,容器内的东西是可以改变的。
声明变量 变量一般都在PL/SQL块的声明部分声明,PL/SQL是一种强壮的类型语言,这就是说在引用变量前必须首先声明,要在执行或异常处理部分使用变量,那么变量必须首先在声明部分进行声明。 声明变量的语法如下: Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression] 注意:可以在声明变量的同时给变量强制性的加上NOT NULL约束条件,此时变量在初始化时必须赋值。
给变量赋值 给变量赋值有两种方式: 。 直接给变量赋值 X:=200; Y=Y+(X*20); 。
通过SQL SELECT INTO 或FETCH INTO给变量赋值 SELECT SUM(SALARY),SUM(SALARY*0。 1) INTO TOTAL_SALARY,TATAL_COMMISSION FROM EMPLOYEE WHERE DEPT=10; 常量 常量与变量相似,但常量的值在程序内部不能改变,常量的值在定义时赋予,,他的声明方式与变量相似,但必须包括关键字CONSTANT。
常量和变量都可被定义为SQL和用户定义的数据类型。 ZERO_VALUE CONSTANT NUMBER:=0; 这个语句定了一个名叫ZERO_VALUE、数据类型是NUMBER、值为0的常量。
标量(scalar)数据类型 标量(scalar)数据类型没有内部组件,他们大致可分为以下四类: 。 numberWWW。
CN-MPA。COM 2005-8-16 3:17:43 。
character 。 date/time 。
boolean。
Oracle 基本知识轻松学: 1。
一个表空间只能属于一个数据库。 2。
每个数据库最少有一个控制文件(建议3个,分别放在不同的磁盘上)。 3。
每个数据库最少有一个表空间(SYSTEM表空间)。 4。
建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起,以提高使用效率,只应存放数据字典。 5。
每个数据库最少有两个联机日志组,每组最少一个联机日志文件。 6。
一个数据文件只能属于一个表空间。 7。
一个数据文件一旦被加入到一个表空间中,就不能再从这个表空间中移走,也不能再加入到其他表空间中。 8。
建立新的表空间需要建立新的数据文件。 9。
数据文件被ORACLE格式化为ORACLE块,Oracle9i以前版本中,ORACLE块的大小是在第一次创建数据库时设定的。 10。
并且以后不能改变,要想改变,只能重建数据库。 11。
一个段segment只能属于一个表空间,但可以属于多个数据文件。 12。
一个区extent只能属于一个数据文件,即区间(extent)不能跨越数据文件。 13。
PCTFREE和PCTUSED总和不能大于等于100。 14。
单独一个事务不能跨越多个回滚段。 15。
索引表不含ROWID值。 16。
拥有不同大小的回滚段没有任何益处。 17。
COMMIT后,数据不一定立即写盘(数据文件)。 18。
一个事务即使不被提交,也会被写入到重做日志中。 19。
Oracle 8。0。
4中,在初始安装时建立的缺省数据库,实例名为ORCL 。 20。
一个块的最大长度为16KB(有2K、4K、8K、16K)。 每个数据库最大文件数(按块大小) 2K块 20000个文件 4K块 40000个文件 8K块或以上 65536个文件 21。
oracle server可以同时启动多个数据库 。 22。
一套操作系统上可以安装多个版本的ORACLE数据库系统(UNIX可以,NT不可以)。 23。
一套ORACLE数据库系统中可以有多个ORACLE数据库及其相对应的实例 。 24。
每个ORACLE数据库拥有一个数据库实例(INSTANCE)(OPS除外)。 25。
所以,一套操作系统上同时可以有多个oracle数据库实例启动。
一个表空间只能属于一个数据库 每个数据库最少有一个控制文件(建议3个,分别放在不同的磁盘上) 每个数据库最少有一个表空间(SYSTEM表空间) 建立SYSTEM表空间的目的是尽量将目的相同的表存放在一起,以提高使用效率 每个数据库最少有两个联机日志文件 一个数据文件只能属于一个表空间 一个数据文件一旦被加入到一个表空间中,就不能再从这个表空间中移走,也不能再加入到其他表空间中建立新的表空间需要建立新的数据文件 数据文件被ORACLE格式化为ORACLE块,ORACLE块的大小是在第一次创建数据库时设定的,并且以后不能改变 单独一个事务不能跨越多个回滚段 索引表不含ROWID值 拥有不同大小的回滚段没有任何益处 ORACLE在初始安装时建立一个缺省数据库,实例名为ORCL 一个块的最大长度为16KB(有2K、4K、8K、16K) 每个数据库最大文件数(按块大小) 2K块 20000个文件 4K块 40000个文件 8K块或以上 65536个文件 oracle server可以同时启动多个数据库 一套操作系统上只能安装一个版本的ORACLE数据库系统 一套ORACLE数据库系统中可以有多个ORACLE数据库 每个ORACLE数据库拥有一个数据库实例(INSTANCE) 所以,一套操作系统上同时可以有多个oracle数据库实例启动。
结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,属于第四代语言(4GL),其执行特点是非过程化,即不用指明执行的具体方法和途径,而是简单地调用相应语句来直接取得结果即可。
显然,这种不关注任何实现细节的语言对于开发者来说有着极大的便利。 然而,有些复杂的业务流程要求相应的程序来描述,这种情况下4GL就有些无能为力了。
Oracle L/SQL的出现正是为了解决这一问题,Oracle PL/SQL是一种过程化语言,属于第三代语言,它与C、C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。 一、编程基础知识 1。
程序结构 Oracle PL/SQL程序都是以块(block)为基本单位,整个Oracle PL/SQL块分三部分:声明部分(用declare开头)、执行部分(以 begin开头)和异常处理部分(以exception开头)。 其中执行部分是必须的,其他两个部分可选。
无论Oracle PL/SQL程序段的代码量有多大,其基本结构就是由这三部分组成。 2。
控制结构 Oracle PL/SQL程序段中有三种程序结构:条件结构、循环结构和顺序结构。 1) 条件结构 与其它语言完全类似,语法结构如下: if condition then statement1 else statement2 end if ; 2)循环结构 这一结构与其他语言不太一样,在PL/SQL程序中有三种循环结构: a。
loop … end loop; b。while condition loop … end loop; c。
for variable in low_bound 。 。
upper_bound loop … end loop; 其中的“…”代表循环体。 3)顺序结构 实际就是goto的运用,不过从程序控制的角度来看,尽量少用goto可以使得程序结构更加的清晰。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:4.324秒