当前位置:文档之家› Oracle PL-sql编程手册(sql大全)

Oracle PL-sql编程手册(sql大全)

Oracle PL-sql编程手册(sql大全)
Oracle PL-sql编程手册(sql大全)

Oracle PL/SQL 编程手册(SQL大全

)

一、SQL PLUS

1 引言

SQL命令

以下17个是作为语句开头的关键字:

alter drop revoke

audit grant rollback*

commit* insert select

comment lock update

create noaudit validate

delete rename

这些命令必须以“;”结尾

带*命令句尾不必加分号,并且不存入SQL缓存区。 SQL中没有的SQL*PLUS命令

这些命令不存入SQL缓存区

@ define pause

# del quit

$ describe remark

/ disconnect run

accept document save

append edi t set

break exit show

btitle get spool

change help sqlplus

clear host start

column input timing

compute list ttitle

connect newpage undefine

copy

---------

2 数据库查询

数据字典

TAB 用户创建的所有基表、视图和同义词清单 DTAB 构成数据字典的所有表

COL 用户创建的基表的所有列定义的清单 CATALOG 用户可存取的所有基表清单

select * from tab;

describe命令 描述基表的结构信息

describe dept

select *

from emp;

select empno,ename,job

from emp;

select * from dept

order by deptno desc; 逻辑运算符

= !=或<> > >= < <= in

between value1 and value2

like

%

_

in null

not

no in,is not null

谓词in和not in

有哪些职员和分析员

select ename,job

from emp

where job in ('clerk','analyst');

select ename,job

from emp

where job not in ('clerk','analyst');

谓词between和not between

哪些雇员的工资在2000和3000之间

select ename,job,sal from emp

where sal between 2000 and 3000; select ename,job,sal from emp

where sal not between 2000 and 3000; 谓词like,not like

select ename,deptno from emp

where ename like 'S%';

(以字母S开头)

select ename,deptno from emp

where ename like '%K';

(以K结尾)

select e name,deptno from emp

where ename like 'W___';

(以W开头,后面仅有三个字母)

select ename,job from emp

where job not like 'sales%';

(哪些雇员的工种名不以sales开头)

谓词is null,is not null

没有奖金的雇员(即commision为null)

select ename,job from emp

where comm is null;

select ename,j ob from emp

where comm is not null;

多条件查询

select ename,job

from emp

where deptno=20

and job!='clerk';

表达式

+ - * /

算术表达式

选择奖金高于其工资的5%的雇员

select ename,sal,comm,comm/sal from emp where comm>.05*sal

order by comm/sal desc;

日期型数据的运算

add two days to 6-Mar-87

6-Mar-87 + 2 = 8-Mar-87

add two hours to 6-Mar-87

6-Mar-87 + 2/24 = 6-Mar-87 and 2hrs

add 15 seconds to 6-Mar-87

6-Mar-87 + 15/(24*60*60) = 6-Mar-87 and 1 5 secs

列名的别名

select ename employee from emp

where deptno=10;

(别名:employee)

select ename,sal,comm,comm/sal "C/S RATIO" fr om emp

where comm>.05*sal

order by comm/sal desc;

SQL命令的编辑

list or l 显示缓冲区的内容

list 4 显示当前SQL命令的第4行,并把第4行作为当前行,在该行号后面有个*。

change or c 用新的内容替换原来在一行中第一次出现内容

SQL>c/(...)/('analyst')/

input or i 增加一行或多行

append or a 在一行后追加内容

del 删除当前行 删除SQL缓冲区中的当前行

run 显示并运行SQL缓冲区中的命令

/ 运行SQL缓冲区中的命令

edit 把SQL缓冲区中的命令写到操作系统下的文本文件, 并调用操作系统提供的编辑器执行修改。

-------------

3 数据操纵

数据的插入

insert into dept

values (10,'accounting','new york');

insert into dept (dname,dep tno)

values ('accounting',10);

从其它表中选择插入数据

insert into emp (empno,ename,deptno)

select id,name,department

from old_emp

where department in(10,20,30,40);

使用参数

insert into dept

values(&deptno,&dname,&loc);

执行时,SQL/PLUS对每个参数将有提示用户输入 参数对应日期型或字符型数据时,可在参数上加引号,输入时就可不用引号

insert into dept

values(&deptno,'&dname','&loc');

插入空值(NULL)

insert into dept

values(50,'education',null);

插入日期型数据

日期型数据缺省格式:DD-MON-YY

insert into emp

(empno,ename,hiredate)

values(7963,'stone','07-APR-87');

系统时间:SYSDATE

insert into emp

(empno,ename,hiredate)

values(7600,'kohn',SYSDATE);

数据更新

update emp

set job='manager'

where ename='martin';

update emp

set job='market rep'

where ename='salesman';

update emp

set deptno=40,job='market rep'

where job='salesman';

数据删除

delete emp

where empno=765;

更新的提交

commit

自动提交方式

set autocommit on

如果状态设为开,则使用inesrt,update,delete会立即提交。

更新取消

rollback

两次连续成功的commit之间的操作,称为一个事务

---------------

4 创建基表、视图

创建基表

create table dept

(deptno number(2),

dname char(14),

loc char(13));

数据字典会自动更新。

一个基表最多254列。

表名列名命名规则:

限制

第一个字符必须是字母,后面可任意(包括 $ # _ 但不能是逗号)。

名字不得超过30个字符。

唯一

某一用户的基表名必须唯一,不能是ORACLE的保留字,同一基表的列名互不相同。

使用双引号

如果表名用双引号括起来,则可不满足上述规则;

只有使用双引号,才能区别大、小写;

命名时使用了双引号,在以后的操作也必须使用双引号。

数据类型:

char(n) (不得超过240字符)

number(n,d)

date

long (最多65536字符)

raw (二进制原始数据)

空值处理

有时要求列值不能为空

create table dept

(deptno number(2) not null,

dname char(14),

loc char(13));

在基表中增加一列

alter table dept

add (headcnt number(3));

修改已有列属性

alter table dept

modify dname char(20);

注:只有当某列所有值都为空时,才能减小其列值宽度。

只有当某列所有值都为空时,才能改变其列值类型。

只有当某列所有值都为不空时,才能定义该列为not null。 例:

alter table dept modify (loc char(12));

alter t able dept modify loc char(12);

alter table dept modify (dname char(13),loc ch ar(12));

创建视图

create view managers as

select ename,job,sal

from emp

where job='manager';

为视图列名取别名

create view mydept

(person,title,salary)

as select ename,job,sal

from emp

where deptno=10;

with check option选项

使用with check option,保证当对视图插入或更新数据时,

该数据必须满足视图定义中select命令所指定的条件。 create view dept20 as

select ename,job,sal,deptno

from emp

where deptno=20

with check option;

在做下述操作时,会发生错误

update dept20

set deptno=30

where ename='ward';

基表、视图的拷贝

create table emp2

as select * from emp;

基表、视图的删除

drop table 表名

drop view 视图名

------------

5 SQL*PLUS报表功能

SQL*PLUS的一些基本格式命令

column deptno heading department

column ename heading name

column sal heading salary

column sal format $99,999.00

ttitle sample report for|hitech corp

btitle strict ly confidential

break on deptno

compute sum of sal on deptno

run

表头和表尾

ttitle sample report for|hitech corp

btitle right strictly confidential

“|”表示换行,结尾不必加分号

选项有三种:left right center

使用TTITLE,系统将自动地在每页的顶部显示日期和页号。 TTITLET和BTITLE命令有效,直至重新设置表头或表尾,或退出SQL*PLUS。

下面命令使标题语句失效

TTITLE OFF

BTITLE OFF

列名

column命令定义用于显示列名

若名字为一个单词,不必加引号

column ename heading employee

column ename heading 'employee|name'

(|为换行)

取消栏定义

column ename clear

列的格式

column ename format A15

column sal format $9,999.99

column comm like sal

like子句,使得某一列的格式参照另一列格式,它拷贝列名及其格式

控制记录显示分组顺序

break on deptno

(不显示重复值)

select deptno,ename

from emp

order by deptno;

(ORDER BY子句用于控制BREAK)

显示为

10 clark

niller

20 smith

scott

30 allen

blake

每次只有一个BREAK命令起作用,但一次可以在多个列上使用BREAK命令

break on 列名1 on 列名2

记录分组

break on deptno skip 2

select deptno,ename

from emp

order by deptno;

每个deptno之间空两行

clear break(取消BREAK命令)

break on pag e(每次从一新页开始)

break on report(每次从一新报表开始)

break on page on repo rt(联合使用)

分组计算

break on deptno skip 2

compute sum of sal on deptno

计算每个部门的工资总和

skip子句使部门之间的信息分隔开

其他计算命令

compute avg of sal on deptno(平均值)

count 非空值的总数

MAX 最大值 MIN 最小值

STD 标准偏差

VAR 协方差

NUMBER 行数

使compute命令失效

一旦定义了COMPUTE,则一直有效,直到

关闭COMPUTE(clear compute)

SQL/PLUS环境命令

show 选项

(显示当前参数设置情况)

show all(显示全部参数)

设置参数

set 选项 值或开关

set autocommit on

SET命令包括

set autocommit {off|on|immediate}

(自动提交,OFF缺省)

set echo {off|on}

(命令文件执行,是否在终端上显示命令本身,OFF缺省) set feedback {off|on}

(ON:查询结束时,给出结果,记录数的信息,缺省; OFF:无查询结果,记录数的信息)

set heading {off|on}

(ON:列的头标在报表上显示,缺省;OFF:不在报表上显示)

set linesize {n}

一行显示的最大字符数,缺省为80

set pagesize {n}

每页的行数,缺省是14

set pause {off|on|text}

(ON:当报表超过一页时,每显示一屏就暂停显示,等待用户打回车键,再接着显示;

OFF:页与页不停顿,缺省;text:页与页停顿,并向用户提示信息)

SET BUFFER buffer

设置当头的命令缓冲区,通常情况下,SQL命令缓冲区已为当前缓冲区。

由于SQL命令缓冲区只能存放一条SQL命令,

所以可用其它缓冲区来存放SQL命令和SQL*PLUS命令。 经常用到的设置可放在login.sql文件中。

SET NULL

set null 'no data'

select ename,comm

from emp

where deptno=30;

把部门30中无佣金雇员的佣金显示为“NO DATA”。

set null是SQL*PLUS命令,用它来标识空值(NULL),可以设置为任意字符串。

存盘命令SAVE

save 文件名

input

1 select empno,ename,job

2 from emp

3 where job='analyst'

save research

目录中会增加一个research.sql文件。

编辑命令EDIT

edit

EDIT编辑当前缓冲区中的内容。

编辑一个文件

edit research

调入命令GET

get research

把磁盘上的文件内容调入缓冲区,并显示在屏幕上,文件名尾不必加.sql。

START命令

运行指定的文件

start research

输出命令SPOOL

spool tryfile

不仅可以使查询结果在屏幕上显示,还可以使结果存入文件 停止向文件输出

spool off

把查询结果在打印机上输出,先把它们存入一个文件中,

然后不必使用SPOOL OFF,而用:

spool out

SPOOL OUT关闭该文件并在系统缺省的打印机上输出

制作报表举例

edit tryfile

set echo off

set autocommit on

set pagesize 25

insert into emp (empno,ename,hiredate)

values(9999,'geiger',sysdate);

insert into emp (empno,ename,deptno)

values(3333,'samson',20);

spool new_emp

select * fro m emp where deptno=20

or deptno is null

/

spool off

set autocommit off

用start命令执行这个文件

--------

6 函数

字符型函数

initcap(ename);将ename中每个词的第一个字母改为大写。

如:jack smith--Jack Smith

length(ename);计算字符串的长度。

substr(job,1,4);

其它

lower

upper

least 取出字符串列表中按字母排序排在最前面的一个串 greatest 取出字符串列表中按字母排序排在最后的一个串 日期函数

add_month(hiredate,5) 在雇佣时间上加5个月

month_between(sysdate,hiredate) 计算雇佣时间与系统时间之间相差的月数

next_day(hiredate,'FRIDAY') 计算受雇日期之后的第一个星期五的日期

select ename,sal,next_day(sysda te,'FRIDAY') as_of

from emp

where deptno=20;

(as_of是别名)

如果不用to_char函数,日期在ORACLE中的缺省格式是

'DD_MON_YY'

to_char(date,date picture)

select ename,to_char(hiredate,'Dy Mon dd,yyyy') hired

from emp

where deptno=10;

to_date(字符串,格式)

insert into emp(empno,ename,hiredate)

values(7999,'asms',to_date('070387083000','MMDDYY HHMISS'));

日期型数据的格式

dd 12

dy fri

day friday

ddspth twelfth

mm 03

mon mar

month march

yy 87

yyyy 1987

Mar 12,1987 'Mon dd,yyyy'

MAR 12,1987 'MON dd,yyyy'

Thursday MARCH 12 'Day MONTH dd'

Mar 12 11:00am 'Mon dd hh:miam'

Thu,the twelfth 'Dy,"the"ddspth'

算术函数

least(v1,v2)

select ename,empno,mgr,least(empno,mgr) lownu m

from emp

where empno0

trunc(sal,0)

取sal的近似值(截断)

空值函数

nvl(v1,v2)

v1为列名,如果v1不是空值,nvl返回其列值。

v1为空值,返回v2的值。

聚组函数

select sum(comm)

from emp;

(返回一个汇总信息)

不能把sum用在select语句里除非用group by

字符型、日期型、数字型的聚组函数

min max count可用于任何数据类型

select min(ename)

from emp;

select min(hiredate)

from emp;

select min(sal)

from emp;

有多少人有工作?

select count(job)

from emp;

有多少种不同的工种?

select count(distinct job)

from emp;

count distinct 计算某一字段中不同的值的个数

其它聚组函数(只用于数字型数据)

avg 计算平均工资

select avg(sal) from emp;

stddev 计算工资的平均差

select stddev(sal)

from emp;

sum 计算总工资

select sum(sal)

from emp;

group by子句

select deptno,sum(sal),avg(sal)

from emp

group by deptno;

按多个条件分组

每个部门的雇员数

select deptno,count(*)

from emp

group by deptno;

每个部门的每个工种的雇员数

select deptno,job,count(*)

from emp

group by deptno,job;

满足条件的分组

(where是针对select的,having是针对group by的) 哪些部门的工资总和超过了9000

select deptno,sum(sal)

from emp

group by deptno

having sum(sal)>9000;

select小结

除去职员,哪些部门的工资总和超过了8000

select deptno,sum(sal)

from emp

where job!='clerk'

group by deptno

having sum(sal)>8000

order by sum(sal);

---------

7 高级查询

等值联接

select empno,ename,job,emp.deptno,dname

from emp,dept

where emp.deptno=dept.deptno;

外联接

select ename,dept.deptno,loc

from emp,dept

where emp.deptno(+)=dept.deptno;

如果在dept.deptno中有的数值,在emp.deptno中没有(如deptno=40),

则作外联接时,结果中会产生一个空值

自联接:同一基表的不同行要做联接,可使用自联接

指出每个雇员的经理名字

select worker.ename,manager.ename manager

from emp worker,emp manager

where worker.mgr=manager.empno;

非等值联接

哪些雇员的工资属于第三级别

select ename,sal

from emp,salgrade

where grade=3

and sal between losal and hisal;

(基表salgrade:grade losal hisal)

集合运算

行的连接

集合运算把2个或多个查询结果合并为一个

union-set union

Rows of first query plus of second query, les s duplicate rows

intersect-set intersection

Rows both queries have in common

minus-set difference

rows unique to the first query

介绍几个视图

account view

ename sal job

sales view

ename sal job

research view

ename sal job

union运算

返回一个查询结果中有但又不重要的行,它将基表或视图中的记录合并在一起

所有部门中有哪些雇员工资超过2000

对应列的数据类型必须相同

select ename,sal

from account

where sal>2000

union

select ename,sal

from r esearch

where sal>2000

union

select ename,sal

from sales

where sal>2000;

intersect运算

返回查询结果中相同的部分

各个部门中有哪些相同的工种

select job

from account

intersect

select job

from research

intersect

select job from sales;

minus运算

返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。

有哪些工种在财会部中有,而在销售部中没有?

select job from account

minus

select job from sales;

子查询

slect ename,deptno

from emp

where deptno=

(select deptno

from emp

where ename='smith');

多级子查询

select ename,job,sal

from emp

where job=

(select job

from emp

where ename='clark')

or sal>

(select sal

from emp

where ename='clark');

多个基表与子查询

select ename,job,sal

from emp,dept

where loc='new york'

and emp.deptno=dept.deptno

and sal>

(select sal

from emp

where ename='scott');

子查询中使用聚组函数

select ename,hiredate

from emp

where hiredate=

(select min(hiredate)

from emp);

------------

8 授权

系统权限

DBA 所有权限

RESOURCE 注册,创建新的基表

CONNECT,注册,查询

只有DBA才有权创建新的用户

grant connect to scott

identified by tiger;

DBA或用户自己可以改变用户口令

grant connect to scott

identified by leopard;

基表权限1

有两种方法获得对基表操作的权限

创建自己的基表

获得基表创建用户的许可

grant select,insert

on emp

to scott;

这些权限有

select insert update delete alter index

把所有权限授于他人

grant all on emp to scott;

同义词

select *

from scott.emp

创建同义词

为用户allen的EMP基表创建同义词employee

create synonym employee

for allen.emp

基表权限2

你可以使其他用户有这样的权力,即其他用户可以把你的基表权限授予他人

grant all

on emp

to scott

with grant option;

收回权限

系统权限 只有被DBA收回

基表权限 随时都可以收回

revoke insert

on emp

from scott;

---------

9 索引

建立索引

create inde x emp_ename

on emp(ename);

删除索引

drop index emp_ename;

关于索引

只对较大的基表建立索引(至少50条记录)

建立索引之前插入数据

对一个基表可建立任意多个索引

一般是在作为主键的列上建立索引

建立索引之后,不影响SQL命令的执行

建立索引之后,ORACLE自动维护和使用索引

保证数据唯一性 提高执行速度的同时,索引还可以保证每个记录中的每个列值是不重复的。

create unique index emp_empno

on emp(empno);

--------

练习和答案

有没有工资比奖金多的雇员?如果有,按工资的降序排列。 如果有两个以上的雇员工资相同,按他们的名字排序。 select ename employee,sal salary,comm commisi on

from emp

where sal>comm

order by sal desc,ename;

列出有关雇员姓名、奖金占收百分比的信息。

要求显示时列名意义明确,按雇员姓名排序,不包括奖金未知的雇员。

select ename employee,(comm/(comm+sal))*100 incentive

from emp

where comm is not null

order by ename;

在chicago(部门30)工作的所有雇员的工资上涨10%。 update emp

set sal=1.1*sal

where deptno=30;

update emp

set sal=1.1*sal

where deptno=(selec t deptno

from dept

where loc='ch icago');

为hitech公司新建一个部门,编号为50,其它信息均不可知。

insert into dept(dname,deptno)

values('faclities',50);

创建视图,三个列名,其中不包括职员信息

create view employee("employee name", "employee number",

"employee job")

as select ename,empno,j ob

from emp

where job!='clerk';

制作工资报表,包括雇员姓名、受雇时间(按星期计算),工资和部门编号,

一页显示一个部门的信息,每页尾,显示该页的工资之和以及受雇时间之和,

报表结尾处,显示所有雇员的工资总和以及受雇时间总和, 工资按美元计算,受雇时间按星期计算,每页的上方应有标题。

ttitle 'service'

break on deptno on page on report

compute sum of sal on deptno

compute sum of sal on report

compute sum of service_length on deptno

compute sum of service_length on report column sal format $99,999.00

column service_length format 9999

select deptno,ename employee,(sysdate-hiredate)/7 service_length,sal

from emp

order by deptno;

制作报表,包括雇员姓名、总收入和受佣日期,

且:姓名的第一个字母必须大写,雇佣日期格式为

MM/DD/YYYY,

总收入包括没有奖金的雇员的总收入,姓名按字母顺序排列。 col "hire date"format A12

col "employee" format A10

col "compensation" format $99,999.00

select initcap(ename) "employee",

(sal+nvl(comm,0)) "com pensation",

to_char(hiredate,'MM/DD/YYYY') "hire date"

from emp

order by ename;

列出有超过7个周边国家的国家名字和面积。

select nation,area

from nation

where code in

(select nation_code

from border

group by nation_code

having count(*)>7);

列出所有面积大于等于日本的岛国的国名和人口。

select nation,population

from nation,bo rder

where code=nation_code(+)

and nation_code is null

and area>=

(select area

from nation

where upper(nation)='JAPAN');

列出所有边界在其它国家中的国名,并且显示其边界国家名字。

break on nation

select nation1.nation,

nation2.nation borderin_country

from nation nation1,bor der,nation nation2 where nation1.code=border.nation_code

and border.border_code=nation2.code

order by nation1.nation;

-----------

-----------

PL/SQL

2 PL/SQL的块结构和数据类型

块结构的特点

嵌套

begin

......

begin ......

exception

......

end;

exception

......

end;

标识符:

不能超过30个字符

第一个字符必须为字母

其余字符可以是字母,数字,$,_,或#

不区分大小写形式

如果用双引号括起来,则字符顺序可以任意排列,并区分大小写形式

无SQL保留字

数据类型

数字型:

整数,实数,以及指数

字符串:

用单引号括起来

若在字符串表示单引号,则使用两个单引号

字符串长度为零(两个单引号之间没有字符),则表示NULL

字符:

长度为1的字符串

数据定义

语法

标识符[常数> 数据类型[NOT NULL>[:=PL/SQL表达式>;

':='表示给变量赋值

数据类型包括

数字型 number(7,2)

字符型 char(120)

日期型 date

布尔型 boolean(取值为true,false或null,不存贮在数据库中)

日期型

anniversary date:='05-JUL-95';

project_completion date;

布尔型

over_budget boolean not null:=false;

available boolean;

(初始值为NULL)

%type类型匹配

books_printed number(6);

books_sold book_printed%type;

manager_name emp.ename%type;

变量赋值

变量名:=PL/SQL表达式

numvar:=5;

boolvar:=true;

datevar:='11-JUN-87';

字符型、数字型表达式中的空值

null+<数字>=null(空值加数字仍是空值)

null><数字>=null(空值与数字进行比较,结果仍是空值) null||'字符串'='字符串'(null即'')

(空值与字符串进行连接运算,结果为原字符串)

变量作用范围

标识符在宣言它的块中有效

标识符如果不在子块中重新定义,则在PL/SQL块的所有子块中同样有效

重新定义后的标识符,作用范围仅在本子块中有效

declare

e_mess char(80);

begin

/*子块1*/

declare

v1 number(4);

begin

select empno into v1 from emp

where job='president';

exception

when too_many_rows then

insert into job_errors

values('more than one president');

end;

/*子块2*/

declare

v1 number(4);

begin

select empno into v1 from emp

where job='manager';

exception

when too_many_rows then

insert into job_errors

values('more than one manager');

end;

exception

when others then

e_mess:=substr(sqlerrm,1,80);

insert into general errors values(e_mess); end;

---------

3 SQL和PL/SQL

插入

declare

my_sal number(7,2):=3040.55;

my_ename char(25):='wan da';

my_hiredate date:='08-SEP-88';

begin

insert into emp

(empno,enmae,job,hiredate,sal,deptno)

values(2741,my_ename,'cab driver',my_hiredate,my _sal,20);

end; 删除

declare

bad_child_type char(20):='naughty';

begin

delete from santas_gift_list whe re

kid_rating=bad_child_type;

end;

事务处理

commit[WORK>;

rollback[WORK>;

(关键字WORK可选,但对命令执行无任何影响) savepoint 标记名;(保存当前点)

在事务中标记当前点

rollback [WORK> to [SAVEPOINT> 标记名;(回退到当前保存点)

取消savepoint命令之后的所有对数据库的修改

关键字WORK和SAVEPOINT为可选项,对命令执行无任何影响

函数

PL/SQL块中可以使用SQL命令的所有函数

insert into phonebook(lastname) value(upper(my_l astname));

select avg(sal) into avg_sal from emp;

对于非SQL命令,可使用大多数个体函数

不能使用聚组函数和参数个数不定的函数,如

x:=sqrt(y);

lastname:=upper(lastname);

age_diff:=months_between(birthday1,birthday2)/12;

赋值时的数据类型转换

4种赋值形式:

变量名:=表达式

insert into 基表名 values(表达式1,表达式2,...); update 基表名 set 列名=表达式;

select 列名 into 变量名 from ...;

数据类型间能进行转换的有:

char转成number

number转成char

char转成date

date转成char

char_var:=nm_var;

数字型转换成字符型

date_var:='25-DEC-88';

字符型转换成日期型

insert into 表名

(num_col) values('604badnumber');

错误,无法成功地转换数据类型

---------

4 条件控制

declare

num_jobs number(4);

begin

select count(*) into num_jobs from auditions where actorid=&&actor_id and called_back='yes';

if num_jobs>100 then

update act or set actor_rating='word class' where actorid=&&actor_id;

elsif num_job=75 then

update actor set actor_rating='daytime soaps' where actorid=&&actor_id;

else

update act or set actor_rating='waiter'

where actorid=&&actor_id;

end if;

end if;

commit;

end;

--------

5 循环

语法

loop

......

end loop;

exit;(退出循环)

exit [when>;(退出循环,当满足WHEN时)

例1

declare

ctr number(3):=0;

begin

loop

insert into table1 values('tastes great');

insert into table2 values('less filling');

ctr:=ctr+1;

exit when ctr=100;

end loop;

end;

(注:如果ctr取为NULL,循环无法结束)

例2

FOR语法

for 变量<范围> loop

......

end loop;

declare

my_index char(20):='fettucini alfred o';

bowl char(20);

begin

for my_index in reverse 21..30 loop

insert into temp(coll) values(my_index);

/*循环次数从30到21*/

end loop;

bowl:=my_index;

end;

跟在in reverse后面的数字必须是从小到大的顺序,必须是整数,不能是变量或表达式

----------

6 游标 显式游标

打开游标

open <游标名>

open co lor_cur;

游标属性

%notfound

%found

%rowcount

%isopen

fetch my_cur into my_var;

while my_cur %found loop

(处理数据)

fetch my_cur into my_var;

exit when my_cur %rowcount=10;

end loop;

%notfound属性

取值情况如下:

fetch操作没有返回记录,则取值为true

fetch操作返回一条记录,则取值为false

对游标无fetch操作时,取值为null

<游标名> %notfound

if color_cur %notfound then...

注:如果没有fetch操作,则<游标名> %notfound将导致出错,

因为%notfound的初始值为NULL。

关闭游标

close <游标名>

close color_cur;

游标的FOR循环

语法

for <记录名> in <游标名> loop

<一组命令>

end loo p;

其中:

索引是建立在每条记录的值之上的

记录名不必声明

每个值对应的是记录名,列名

初始化游标指打开游标

活动集合中的记录自动完成FETCH操作

退出循环,关闭游标

隐式游标

隐式游标是指SQL命令中用到的,没有明确定义的游标 insert,update,delete,select语句中不必明确定义游标

调用格式为SQL%

存贮有关最新一条SQL命令的处理信息

隐式游标的属性

隐式游标有四个属性

SQL%NOTFOUND

SQL%FOUND

SQL%ROWCOUNT:隐式游标包括的记录数

例:

delete from baseball_team where batting_avg<1 00;

if sql%rowcount>5 thn

insert into temp

values('your team need s help');

end if;

SQL%ISOPEN:取值总为FALSE。SQL命令执行完毕,PL/SQL 立即关闭隐式游标。

---------

7 标号

GOTO语句

用法:

goto you_are_here;

其中you_are_here是要跳转的语句标号

标号必须在同一组命令,或是同一块中使用

正确的使用

<>(标号)

x:=x+1

if a>b then

b:=b+c;

goto dinner;

end if;

错误的使用

goto jail;

if a>b then

b:=b+c;

<>(标号)

x:=x+1;

end if;

标号:解决意义模糊

标号可用于定义列值的变量

<>

declare

deptno number:=20;

begin

update emp set sal=sal*1.1

where deptno=sample.deptno;

commit;

end sample;

如果不用标号和标号限制符,这条命令将修改每条记录。

----------

8 异常处理

预定义的异常情况

任何ORACLE错误都将自动产生一个异常信息

一些异常情况已命名,如:

no_data_found 当SELECT语句无返回记录时产生

too_many_rows 没有定义游标,而SELECT语句返回多条记录时产生

whenever notfound 无对应的记录

用户定义的异常情况 由用户自己获取

在DECLARE部分定义:

declare

x number;

something_isnt_right exception;

用户定义的异常情况遵循一般的作用范围规则

条件满足时,获取异常情况:raise something_isnt_right 注意:同样可以获取预定义的异常情况

exception_init语句

允许为ORACLE错误命名

调用格式:

pragma exception_init(<表达式>,);

declare

deadlock_detected exception;

pragma exception_init(deadlock_detected,-60); raise语句

单独使用RAISE命令,可再一次获取当前的异常情况(就象异常情况被重复处理了一样)。

在异常处理中,此语句只能单独使用。

异常处理标识符

一组用于处理异常情况的语句:

exception

when <表达式> or [表达式...> then

<一组语句>

...

when others then--最后一个处理

<一组语句>

end;既结束PL/SQL块部分,也结束异常处理部分

--------

练习与答案

1:

接收contract_no和item_no值,在inventory表中查找,如果产品:

已发货,在arrival_date中赋值为今天后的7天

已订货,在arrival_date中赋值为今天后的一个月

既无订货又无发货,则在arrival_date中赋值为今天后的两个月,

并在order表中增加一条新的订单记录。

product_status的列值为'shipped'和'ordered'

inventory:

product_id number(6)

product_description char(30)

product_status char(20)

std_shipping_qty number(3)

contract_item:

contract_no number(12)

item_no number(6)

arrival_date date

order:

order_id number(6)

product_id number(6)

qty number(3)

答案:

declare

i_product_id inventory.product_id%type;

i_product_description inventory.product_description %type;

i_product_status inventory.product_status%type; i_std_shipping_qty inventory.std_shipping_qty%type ;

begin

select product_id,product_description,product_status ,std_shipping_qty

into i_product_id,i_product_description,

i_product_status,i_std_shipping_qty

from inventory

where product_id=(

select product_id

from contract_item

where contract_no=&&cont ractno and item_no=& &itemno);

if i_product_status='shipped' then

update contract_item

set arrival_date=sysdate+7

where item_no=&&itemno and contra ct_no=&&con tractno;

elsif i_product_status='ordered' then

update contract_item

set arrival_date=add_mon ths(sysdate,1)

where item_no=&&itemno and contract_no=&&con tractno;

else

update contract_item

set arrival_date=add_months(sysdate,2)

where item_n o=&&itemno and contract_no=&&con tractno;

insert into orders

values(100,i_product_id,i_std_shipping_qty);

end if;

end if;

commit;

end;

2:

1.找出指定部门中的所有雇员

2.用带'&'的变量提示用户输入部门编号

3.把雇员姓名及工资存入prnttable表中,基结构为: create table prnttable

(seq number(7),l ine char(80));

4.异常情况为,部门中奖金不为空值的雇员信息才能存入prnttable表中。

答案:

declare

cursor emp_cur is

select ename,sal,comm

from emp where deptno=&dno;

emp_rec emp_cur%rowtype; null_commission exception;

begin

open emp_cur;

fetch emp_cur into emp_rec;

while (em p_cur%found) loop

if emp_https://www.doczj.com/doc/0715412783.html,m is null then

begin

close emp_cur;

raise null_commiss ion;

end;

end if;

fetch emp_cur into emp_rec;

end loop;

close emp_sur;

exception

when null_commission then

open emp_cur;

fetch emp_cur into emp_rec;

while (emp_cur%found) loop

if emp_https://www.doczj.com/doc/0715412783.html,m is not null then

insert into temp values(emp_rec.sal,emp_rec.ena me);

end if;

fetch emp_cur into emp_rec;

end loop;

close emp_cur;

commit;

end;

Java研究组织 - 版权所有 2002-2002

RE:ORACLE数据库对象与用户管理(转)

作者:UB时间:2003-08-14 21:06:59[修改][回复][删除]

ORACLE数据库对象与用户管理

一、ORACLE数据库的模式对象的管理与维护

本节的主要内容是关于ORACLE数据库的模式对象的管理与维护,这些模式对象包括:表空间、表、视图、索引、序列、同义词、聚集和完整性约束。对于每一个模式对象,首先描述了它的定义,说明了它的功能,最后以基于SQL语言的实例说明如何对它们进行管理于维护。

1.1 表空间

由于表空间是包含这些模式对象的逻辑空间,有必要先对它进行维护。

创建表空间

SQL>CREATE TABLESPACE jxzy

>DATAFILE …/usr/oracle/dbs/jxzy.dbf?

>ONLINE;

修改表空间

SQL>ALTER TABLESPACE jxzy OFFLINE NORMAL;

SQL>ALTER TABLESPACE jxzy

>RENAME DATAFILE …/usr/oracle/dbs/jxzy.dbf?

>TO …/usr/oracle/dbs/jxzynew.dbf?

>ONLINE

SQL>CREATE TABLESP ACE jxzy ONLINE

删除表空间

SQL>DROP TABLESPACE jxzy

>INCLUDING CONTENTS

1. 2 表维护

表是数据库中数据存储的基本单位,一个表包含若干列,每列具有列名、类型、长度等。

表的建立

SQL>CREATE TABLE jxzy.switch(

>OFFICE_NUM NUMBER(3,0) NOT NULL,

>SWITCH_CODE NUMBER(8,0) NOT NULL,

>SWITCH_NAME VARCHAR2(20) NOT NULL);

表的修改

SQL>ALTER TABLE jxzy.switch

>ADD (DESC VARCHAR2(30));

表的删除

SQL>DROP TABLE jxzy.switch

>CASCADE CONSTRAINTS

//删除引用该表的其它表的完整性约束

1. 3 视图维护

视图是由一个或若干基表产生的数据集合,但视图不占存储空间。建立视图可以保护数据安全(仅让用户查询修改可以看见的一些行列)、简化查询操作、保护数据的独立性。

视图的建立

SQL>CREATE VIEW jxzy.pole_well_view AS

>(SELECT pole_path_num AS path,

pole AS device_num FROM pole

>UNION

>SELECT pipe_path_num AS path,

> well AS device_num FROM well);视图的替换

SQL>REPLACE VIEW jxzy.pole_well_view AS

>(SELECT pole_path_num AS path,

pole AS support_device FROM pole

>UNION

>SELECT pipe_path_num AS path,

well AS support_device FROM well);

视图的删除

SQL>DROP VIEW jxzy.pole_well_view;

1.4 序列维护

序列是由序列发生器生成的唯一的整数。

序列的建立

SQL>CREATE SEQUENCE jxzy.sequence_cable

>START WITH 1

>INCREMENT BY 1

>NO_MAXVALUE;

建立了一个序列,jxzy.sequence_cable.currval返回当前值,jxzy.sequence_cable.nextval 返回当前值加1后的新值

序列的修改

SQL>ALTER SEQUENCE jxzy.sequence_cable

>START WITH 1 //起点不能修改,若修改,应先删除,然后重新定义

>INCTEMENT BY 2

>MAXVALUE 1000;

序列的删除

SQL>DROP SEQUENCE jxzy.sequence_cable

1. 5 索引维护

索引是与表相关的一种结构,它是为了提高数据的检索速度而建立的。因此,为了提高表上的索引速度,可在表上建立一个或多个索引,一个索引可建立在一个或几个列上。

对查询型的表,建立多个索引会大大提高查询速度,对更新型的表,如果索引过多,会增大开销。

索引分唯一索引和非唯一索引

索引的建立

SQL>CREATE INDEX jxzy.idx_switch

>ON switch(switch_name)

>TABLESPACE jxzy;

索引的修改

SQL>ALTER INDEX jxzy.i dx_switch

>ON switch(office_num,switch_name)

>TABLESPACE jxzy;

索引的删除

SQL>DROP INDEX jxzy.idx_switch;

1. 6 完整性约束管理

数据库数据的完整性指数据的正确性和相容性。数据完整型检查防止数据库中存在不符合语义的数据。

完整性约束是对表的列定义一组规则说明方法。ORACLE提供如下的完整性约束.

a. NOT NULL 非空

b. UNIQUE 唯一关键字

c. PRIMATY KEY 主键一个表只能有一个,非空

d. FOREIGA KEY 外键

e.CHECK 表的每一行对指定条件必须是true或未知(对于空值)

例如:

某列定义非空约束

SQL>ALTER TABLE office_organization

>MODIFY(desc VARCHAR2(20)

>CONSTRAINT nn_desc NOT NULL)

某列定义唯一关键字

SQL>ALTER TABLE office_organization

>MODIFY(office_name VATCHAR2(20)

>CONSTRAINT uq_officename UNIQUE)

定义主键约束,主键要求非空

SQL>CREATE TABLE switch(switch_code NUMBER( 8)

>CONSTRAINT pk_switchcode PRIMARY KEY,)

使主键约束无效

SQL>ALTER TABLE switch DISABLE PRIMARY KE Y

定义外键

SQL>CREATE TABLE POLE(pole_code NUMBER(8), >office_num number(3)>CONSTRAINT fk_officenum

>REFERENCES office_organization(office_num)

>ON DELETE CASCADE);

定义检查

SQL>CREATE TABLE office_organization(

>office_num NUMBER(3),

>CONSTRAINT check_officenum

>CHECK (office_num BETWE EN 10 AND 99); 二、ORACLE数据库用户与权限管理

ORACLE是多用户系统,它允许许多用户共享系统资源。为了保证数据库系统的安全,数据库管理系统配置了良好的安全机制。

2. 1 ORACLE数据库安全策略

建立系统级的安全保证

系统级特权是通过授予用户系统级的权利来实现,系统级的权利(系统特权)包括:建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户,也可以随时回收。ORACLE 系统特权有80多种。

建立对象级的安全保证

对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作(查询、增、删改)的权利来实现。

建立用户级的安全保证

用户级安全保障通过用户口令和角色机制(一组权利)来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组,为每个用户建立角色,然后把角色分配给用户,具有同样角色的用户有相同的特权。

2.2 用户管理

ORACLE用户管理的内容主要包括用户的建立、修改和删除

用户的建立

SQL>CREATE USER jxzy

>IDENTIFIED BY jxzy_password

>DEFAULT TA BLESPACE syst em

>QUATA 5M ON system; //供用户使用的最大空间限额

用户的修改

SQL>CREATE USER jxzy

>IDENTIFIED BY jxzy_pw

>QUATA 10M ON system;

删除用户及其所建对象

SQL>DROP USER jxzy CASCADE; //同时删除其建立的实体

2.3系统特权管理与控制

ORACLE 提供了80多种系统特权,其中每一个系统特权允许用户执行一个或一类数据库操作。

授予系统特权

SQL>GRANT CREATE USER,ALTER USER,DROP U SER

>TO jxzy_new

>WITH ADMIN OPTION;

回收系统特权

SQL>REVOKE CREATE USER,ALTER USER,DROP USER

>FROM jxzy_new

//但没有级联回收功能

显示已被授予的系统特权(某用户的系统级特权)

SQL>SELECT*FROM sys.dba_sys_privs

2.4 对象特权管理与控制

ORACLE对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行(存储过程)、引用(其它表字段作为外键)、索引等。

授予对象特权

SQL>GRANT SELECT,INSERT(office_num,office_nam e),

>UPDATE(desc)ON office_organization

>TO new_adminidtrator

>WITH GRANT OPTION;

//级联授权

SQL>GRANT ALL ON office_organizati on

>TO new_administrator

回收对象特权

SQL>REVOKE UPDATE ON office_orgaization

>FROM new_administrator

//有级联回收功能

SQL>REVOKE ALL ON office_organization

>FROM new_administrator

显示已被授予的全部对象特权 SQL>SELECT*FROM sys.dba_tab_privs

2.5 角色的管理

ORACLE的角色是命名的相关特权组(包括系统特权与对象特权),ORACLE用它来简化特权管理,可把它授予用户或其它角色。

ORACLE数据库系统预先定义了CONNECT 、RESOURCE、 DBA、 EXP_FULL_DATABASE、

IMP_FULL_DATABASE五个角色。CONNECT具有创建表、视图、序列等特权;RESOURCE具有创建过程、触发器、表、序列等特权、DBA具有全部系统特权;

EXP_FULL_DATABASE、 IMP_FULL_DATABASE具有卸出与装入数据库的特权。

通过查询sys.dba_sys_privs可以了解每种角色拥有的权利。授予用户角色

SQL>GRANT DBA TO new_administractor

>WITH GRANT OPTION;

作者:UB时间:2003-08-14 21:06:59[修改][回复][删除]

ORACLE数据库对象与用户管理

一、ORACLE数据库的模式对象的管理与维护

本节的主要内容是关于ORACLE数据库的模式对象的管理与维护,这些模式对象包括:表空间、表、视图、索引、序列、同义词、聚集和完整性约束。对于每一个模式对象,首先描述了它的定义,说明了它的功能,最后以基于SQL语言的实例说明如何对它们进行管理于维护。

1.1 表空间

由于表空间是包含这些模式对象的逻辑空间,有必要先对它进行维护。

创建表空间

SQL>CREATE TABLESPACE jxzy

>DATAFILE …/usr/oracle/dbs/jxzy.dbf?

>ONLINE;

修改表空间

SQL>ALTER TABLESPACE jxzy OFFLINE NORMAL; SQL>ALTER TABLESPACE jxzy

>RENAME DATAFILE …/usr/oracle/dbs/jxzy.dbf?

>TO …/usr/oracle/dbs/jxzynew.dbf?

>ONLINE

SQL>CREATE TABLESPACE jxzy ONLINE

删除表空间

SQL>DROP TABLESPACE jxzy

>INCLUDING CONTENTS

1. 2 表维护

表是数据库中数据存储的基本单位,一个表包含若干列,每列具有列名、类型、长度等。

表的建立

SQL>CREATE TABLE jxzy.switch(

>OFFICE_NUM NUMBER(3,0) NOT NULL,

>SWITCH_CODE NUMBER(8,0) NOT NULL,

>SWITCH_NAME VARCHAR2(20) NOT NULL);

表的修改

SQL>ALTER TABLE jxzy.switch

>ADD (DESC VARCHAR2(30));

表的删除

SQL>DROP TABLE jxzy.switch

>CASCADE CONSTRAINTS

//删除引用该表的其它表的完整性约束

1. 3 视图维护

视图是由一个或若干基表产生的数据集合,但视图不占存储空间。建立视图可以保护数据安全(仅让用户查询修改可以看见的一些行列)、简化查询操作、保护数据的独立性。

视图的建立

SQL>CREATE VIEW jxzy.pole_well_view AS

>(SELECT pole_path_num AS path,

pole AS device_num FROM pole

>UNION

>SELECT pipe_path_num AS path,

> well AS device_num FROM well);

视图的替换

SQL>REPLACE VIEW jxzy.pole_well_view AS

>(SELECT pole_path_num AS path,

pole AS support_device FROM pole

>UNION

>SELECT pipe_path_num AS path,

well AS support_device FROM well); 视图的删除

SQL>DROP VIEW jxzy.pole_well_view;

1.4 序列维护

序列是由序列发生器生成的唯一的整数。

序列的建立

SQL>CREATE SEQUENC E jxzy.sequence_cable

>START WITH 1

>INCREMENT BY 1

>NO_MAXVALUE;

建立了一个序列,jxzy.sequence_cable.currval返回当前值,jxzy.sequence_cable.nextval 返回当前值加1后的新值

序列的修改

SQL>ALTER SEQUENCE jxzy.sequence_cable

>START WITH 1 //起点不能修改,若修改,应先删除,然后重新定义

>INCTEMENT BY 2

>MAXVALUE 1000;

序列的删除

SQL>DROP SEQUENCE jxzy.sequence_cable

1. 5 索引维护

索引是与表相关的一种结构,它是为了提高数据的检索速度而建立的。因此,为了提高表上的索引速度,可在表上建立一个或多个索引,一个索引可建立在一个或几个列上。

对查询型的表,建立多个索引会大大提高查询速度,对更新型的表,如果索引过多,会增大开销。

索引分唯一索引和非唯一索引

索引的建立

SQL>CREATE INDEX jxzy.idx_switch

>ON switch(switch_name)

>TABLESPACE jxzy;

索引的修改

SQL>ALTER INDEX jxzy.idx_switch

>ON switch(office_num,switch_name)

>TABLESPACE jxzy;

索引的删除

SQL>DROP INDEX jxzy.idx_switch;

1. 6 完整性约束管理

数据库数据的完整性指数据的正确性和相容性。数据完整型检查防止数据库中存在不符合语义的数据。

完整性约束是对表的列定义一组规则说明方法。ORACLE提供如下的完整性约束.

a. NOT NULL 非空

b. UNIQUE 唯一关键字

c. PRIMATY KEY 主键一个表只能有一个,非空

d. FOREIGA KEY 外键

e.CHECK 表的每一行对指定条件必须是true或未知(对于空值)

例如:

某列定义非空约束

SQL>ALTER TABLE office_organization

>MODIFY(desc VARCHAR2(20)

>CONSTRAINT nn_desc NOT NULL)

某列定义唯一关键字

SQL>ALTER TABLE office_organization

>MODIFY(office_name VATCHAR2(20)

>CONSTRAINT uq_officename UNIQUE)

定义主键约束,主键要求非空

SQL>CREATE TABLE switch(switch_code NUMBER( 8)

>CONSTRAINT pk_switchcode PR IMARY KEY,)

使主键约束无效

SQL>ALTER TABLE switch DISABLE PRI MARY KE Y

定义外键

SQL>CREATE TABLE POLE(pole_code NUMBER(8), >office_num number(3)

>CONSTRAINT fk_officenum

>REFERENCES office_organization(office_num)

>ON DELETE CASCADE);

定义检查

SQL>CREATE TABLE office_organization(

>office_num NUMBER(3),>CONSTRAINT check_officenum

>CHECK (office_num BETWEEN 10 AND 99);

二、ORACLE数据库用户与权限管理

ORACLE是多用户系统,它允许许多用户共享系统资源。为了保证数据库系统的安全,数据库管理系统配置了良好的安全机制。

2. 1 ORACLE数据库安全策略

建立系统级的安全保证

系统级特权是通过授予用户系统级的权利来实现,系统级的权利(系统特权)包括:建立表空间、建立用户、修改用户的权利、删除用户等。系统特权可授予用户,也可以随时回收。ORACLE 系统特权有80多种。

建立对象级的安全保证

对象级特权通过授予用户对数据库中特定的表、视图、序列等进行操作(查询、增、删改)的权利来实现。

建立用户级的安全保证

用户级安全保障通过用户口令和角色机制(一组权利)来实现。引入角色机制的目的是简化对用户的授权与管理。做法是把用户按照其功能分组,为每个用户建立角色,然后把角色分配给用户,具有同样角色的用户有相同的特权。

2.2 用户管理

ORACLE用户管理的内容主要包括用户的建立、修改和删除

用户的建立

SQL>CREATE USER jxzy

>IDENTIFIED BY jxzy_password

>DEFAULT TABLESPACE system

>QUATA 5M ON system; //供用户使用的最大空间限额

用户的修改

SQL>CREATE USER jxzy

>IDENTIFIED BY jxzy_pw

>QUATA 10M ON system;

删除用户及其所建对象

SQL>DROP USER jxzy CASCADE; //同时删除其建立的实体

2.3系统特权管理与控制

ORACLE 提供了80多种系统特权,其中每一个系统特权允许用户执行一个或一类数据库操作。

授予系统特权

SQL>GRANT CREATE USER,ALTER USER,DROP U SER

>TO jxzy_new

>WITH ADMIN OPTION;

回收系统特权

SQL>REVOKE CREATE USER,ALTER USER,DROP USER

>FROM jxzy_new

//但没有级联回收功能

显示已被授予的系统特权(某用户的系统级特权)

SQL>SELECT*FROM sys.dba_sys_privs

2.4 对象特权管理与控制

ORACLE对象特权指用户在指定的表上进行特殊操作的权利。这些特殊操作包括增、删、改、查看、执行(存储过程)、引用(其它表字段作为外键)、索引等。

授予对象特权

SQL>GRANT SELECT,INSERT(office_num,office_nam e),

>UPDATE(desc)ON office_organization

>TO new_adminidtrator

>WITH GRANT OPTION;

//级联授权

SQL>GRANT ALL ON of fice_organization

>TO new_administrator

回收对象特权

SQL>REVOKE UPDATE ON office_orgaization

>FROM new_administrator

//有级联回收功能

SQL>REVOKE ALL ON office_organization

>FROM new_adminis trator

显示已被授予的全部对象特权

SQL>SELECT*FROM sys.dba_tab_privs

2.5 角色的管理

ORACLE的角色是命名的相关特权组(包括系统特权与对象特权),ORACLE用它来简化特权管理,可把它授予用户或其它角色。

ORACLE数据库系统预先定义了CONNECT 、RESOURCE、 DBA、 EXP_FULL_DATABASE、

IMP_FULL_DATABASE五个角色。CONNECT具有创建表、视图、序列等特权;RESOURCE具有创建过程、触发器、表、序列等特权、DBA具有全部系统特权;EXP_FULL_DATABASE、 IMP_FULL_DATABASE具有卸出与装入数据库的特权。

通过查询sys.dba_sys_privs可以了解每种角色拥有的权利。授予用户角色

SQL>GRANT DBA TO new_administractor

>WITH GRANT OPTION;

例子,如何调用身份证函数,如返回身份证的性别:【上一篇】验证身份证的有效性及得到身份证相关信息:【下一篇】验证身份证的有效性及得到身份证相关信息:/*

参数说明

@vidcard:需要处理的身份证号

@ixb:身份证中需要对性别进行验证的1男0女-1表示不进行性别验证

@dtoday:今天日期,用于计算年龄和验证身份证的有效性

返回表字段说明

idcard:原身份证号

xym:校验码1成功,0失败

xx:校验信息

newidcard:新身份证号,用于15位转18位

csny:出生年月

nl_y:虚岁年龄

nl_m:实际年龄,按月

nl_d:实际年龄,按天

xb:性别

csd:出生地

xz:星座

sx:生宵

调用方式

declare @d datetime

set @d=getdate()

select * from dbo.fun_id_card('身份证号',-1,@d)

*/

create function fun_id_card(@vidcard varchar(18),@ixb int,@dtoday datetime)

returns @retidcardreports table(idcard varchar(18) primary key,

xym int not null,

xx varchar(100) not null,

newidcard varchar(18) not null,

csny varchar(8) not null,

nl_y int not null,

nl_m float not null,

nl_d float not null,

xb int not null,

xb_c varchar(4) not null,

csd varchar(100) not null,

xz varchar(20) not null,

sx varchar(4) not null

)

as

begin

declare @new_id_card varchar(18)

declare @birthday varchar(8)

declare @nl_y int

declare @nl_m float

declare @nl_d float

declare @xym int

declare @xx varchar(100)

declare @isdate int

declare @num varchar(17)

declare @i int

declare @sum int

declare @verifycode varchar(1)

declare @m int

declare @xb int

declare @xb_c varchar(4)

declare @csd varchar(100)

declare @xz varchar(10)

declare @sx varchar(2)

set @xym=1

set @xx='身份证合法'

If Len(@vidcard) < 15 Or Len(@vidcard) = 16 Or

Len(@vidcard) = 17 Or Len(@vidcard) > 18

begin

set @xym=0

set @xx='身份证只允许有15位号码或18位号码'

end

If Len(@vidcard) = 18 set @num = left(@vidcard, 17)

else If Len(@vidcard) = 15 set @num = Left(@vidcard, 6) + '19' + Right(@vidcard, 9)

else set @num=''

If (IsNumeric(@num)=0) and (@xym=1)

begin

set @xym=0

set @xx='身份证除最后一位外,必须为数字'

End

if @xym=1 select @birthday=case len(@vidcard) when 18 then substring(@vidcard,7,8) when 15 then

'19'+substring(@vidcard,7,6) end

else select @birthday= ''

select @isdate=isdate(@birthday)

if @xym=1

begin

if @isdate=0

begin

set @xym=0

set @xx='身份证出生日期无效'

set @birthday= ''

end

else if (DateDiff(yyyy,@dtoday,cast(@birthday as datetime))<-140) or

(DateDiff(dd,@dtoday,cast(@birthday as datetime))>1)

begin

set @xym=0

set @xx='身份证出生日期范围无效'

end

end

if @xym=1

begin

select @nl_y=datediff(yyyy, @birthday, @dtoday)+1

select @nl_m=case len(@vidcard) when 18 then

cast(datediff(mm,substring(@vidcard,7,8),@dtoday) as real)/12

else

cast(datediff(mm,substring(@vidcard,7,6),@dtoday) as real)/12 end

select @nl_d=datediff(yyyy, @birthday, @dtoday) +

1.0 * datediff(dd, dateadd(yyyy, datediff(yyyy, @birthday, @dtoday), @birthday),@dtoday) /

case when (year(@dtoday) %

4)+(year(@dtoday) % 400) = 0 then 366 else 365 end

end

else select @nl_y=0,@nl_m=0,@nl_d=0

if @xym=1

begin

set @m=cast(right(@num,3) as int) % 2

select @xb=case @m when 0 then 0 else 1

end,@xb_c=case @m when 0 then '女' else '男' end if (@ixb<>-1) and (@ixb<>@xb)

begin

set @xym=0

set @xx='性别有误'

end

end

else select @xb=-1,@xb_c='未知'

set @new_id_card=''

if @xym=1

begin

set @sum=0

set @i=18

while @i>=1

begin

select

@sum=@sum+(power(2,(@i-1))%11)*cast(substring(@num ,19-@i,1) as int)

select @i=@i-1

end

select @sum=@sum%11

select @verifycode=case @sum when 0 then '1' when 1 then '0' when 2 then 'X' else rtrim(12-@sum) end if (@verifycode<>right(@vidcard,1)) and

(len(@vidcard)=18)

begin

set @xym=0

set @xx='身份证校验码错误'

end

else set @new_id_card=@num+@verifycode

end

set @csd=''

if @xym=1

begin

select @csd=isnull(f_dqmc,'') from tbda_dq where

f_dqbm=left(@vidcard,2)

if right(@vidcard,4)<>'0000' select @csd=@csd+

isnull(f_dqmc,'') from tbda_dq where

f_dqbm=left(@vidcard,4)

if right(@vidcard,2)<>'00' select @csd=@csd+

isnull(f_dqmc,'') from tbda_dq where

f_dqbm=left(@vidcard,6)

end

set @xz=''

set @sx=''

INSERT into

@retidcardreports(idcard,xym,xx,newidcard,csny,nl_y,nl_m, nl_d,xb,xb_c,csd,xz,sx) select

@vidcard,@xym,@xx,@new_id_card,@birthday,@nl_y,@nl _m,@nl_d,@xb,@xb_c,@csd,@xz,@sx

RETURN

end

SQLServer(多语句表值函数代码)

SQLServer(多语句表值函数代码) 代码如下: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE FUNCTION [dbo].[ufnGetContactInformation](@ContactID int) RETURNS @retContactInformation TABLE ( -- Columns returned by the function [ContactID] int PRIMARY KEY NOT NULL, [FirstName] [nvarchar](50) NULL, [LastName] [nvarchar](50) NULL, [JobTitle] [nvarchar](50) NULL, [ContactType] [nvarchar](50) NULL ) AS -- Returns the first name, last name, job title and contact type for the specified contact. BEGIN

DECLARE @FirstName [nvarchar](50), @LastName [nvarchar](50), @JobTitle [nvarchar](50), @ContactType [nvarchar](50); -- Get common contact information SELECT @ContactID = ContactID, @FirstName = FirstName, @LastName = LastName FROM [Person].[Contact] WHERE [ContactID] = @ContactID; SET @JobTitle = CASE -- Check for employee WHEN EXISTS(SELECT * FROM [HumanResources].[Employee] e WHERE e.[ContactID] = @ContactID) THEN (SELECT [Title] FROM [HumanResources].[Employee] WHERE [ContactID] = @ContactID) -- Check for vendor

ORACLE常用SQL语句大全

ORACLE常用SQL语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:/mssql7backup/MyNwind_1.dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not nul l],..) 根据已有的表创建新表: A:select * into table_new from table_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only<仅适用于Oracle> 5、说明:删除表 drop table tablename

6、说明:增加一个列,删除一个列 A:alter table tabname add column col type B:alter table tabname drop column colname 注:DB2DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、添加主键: Alter table tabname add primary key(col) 删除主键: Alter table tabname drop primary key(col) 8、创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、创建视图:create view viewname as select statement 删除视图:drop view viewname 10、几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 11、几个高级查询运算词 A:UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B:EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C:INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 12、使用外连接

SQLSERVER操作命令

SQLSERVER数据库操作 ******操作前,请确定SQL的服务已经开启******** 一:登录进入sql数据库 1、开始---所有程序---Microsoft SQL Server 2005---SQL Server Management Studio Express 2、此时出现“连接到服务器”的对话框, “服务器名称”设置为SQL数据库所在机器的IP地址 “身份验证”设置为SQL Server身份验证或者Windows 身份验证 填写登录名和密码后,点击“连接”按钮,即可进入到SQL数据库操作界面。 二:新建数据库 登录进去后,右击“数据库”,选择—“新建数据库” 设置数据库名称,在下面的选项卡中还可以设置数据库的初始大小,自动增长,路径。 点击确定,一个数据库就建好了。 三:如何备份的数据库文件。 登录进入后,右击相应的需要备份数据库----选择“任务” 目标下的备份到,点击“添加”按钮可以设置备份数据库保存的路径。 四:如何还原备份的数据库文件。(以本地机器为例子) 1、设置服务器名称,点击右边的下拉框的三角,选择“浏览更多…”。 此时出现查找服务器对话框,选择“本地服务器”---点开“数据库引擎”前面 的三角---选中出现的服务器名称—确定。 (注:可以在“网络服务器”选项卡中设置网络服务器) 2、设置身份验证,选择为“windows身份验证” 3、点击连接按钮,进入数据库管理页面 4、右击“数据库”,选择“还原数据库”,出现还原数据库的对话框 还原的目标----目标数据库,这里设置数据库的名字 还原的源----选择“源设备”,在弹出的对话框中点击“添加”按钮,找到所备 份的数据库文件,确定。 5、此时,在还原数据库对话框中会出现所还原的数据库的信息。在前面选中所需还 原的数据库。确定。 6、为刚刚还原的数据库设置相应的用户。 a点开“安全性”---右击“登录名”---新建登录名 b 设置登录名(假如为admin),并设置为SQL Server身份验证,输入密码,去除 “强制实施密码策略”前的勾。 C 找到导入的数据库,右击此数据库----选择“属性”,在选择页中,点击“文件” 设置所有者,点击右边的按钮,选择“浏览”,找到相应的用户(如admin)。确 定。。 7、此时重新以admin的身份进入,就可操作相应的数据库。

oracle中常用函数大全

oracle中常用函数大全 1、数值型常用函数 函数返回值样例显示 ceil(n) 大于或等于数值n的最小整数select ceil(10.6) from dual; 11 floor(n) 小于等于数值n的最大整数select ceil(10.6) from dual; 10 mod(m,n) m除以n的余数,若n=0,则返回m select mod(7,5) from dual; 2 power(m,n) m的n次方select power(3,2) from dual; 9 round(n,m) 将n四舍五入,保留小数点后m位select round(1234.5678,2) from dual; 1234.57 sign(n) 若n=0,则返回0,否则,n>0,则返回1,n<0,则返回-1 select sign(12) from dual; 1 sqrt(n) n的平方根select sqrt(25) from dual ; 5 2、常用字符函数 initcap(char) 把每个字符串的第一个字符换成大写select initicap('mr.ecop') from dual; Mr.Ecop lower(char) 整个字符串换成小写select lower('MR.ecop') from dual; mr.ecop replace(char,str1,str2) 字符串中所有str1换成str2 select replace('Scott','s','Boy') from dual; Boycott substr(char,m,n) 取出从m字符开始的n个字符的子串select substr('ABCDEF',2,2) from dual; CD length(char) 求字符串的长度select length('ACD') from dual; 3 || 并置运算符select 'ABCD'||'EFGH' from dual; ABCDEFGH 3、日期型函数 sysdate当前日期和时间select sysdate from dual;

sqlserver日期时间函数

sql server日期时间函数 Sql Server中的日期与时间函数 1. 当前系统日期、时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 例如:向日期加上2天 select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000 3. datediff 返回跨两个指定日期的日期和时间边界数。 select datediff(day,'2004-09-01','2004-09-18') --返回:17 4. datepart 返回代表指定日期的指定日期部分的整数。 SELECT DATEPART(month, '2004-10-15') --返回 10 5. datename 返回代表指定日期的指定日期部分的字符串 SELECT datename(weekday, '2004-10-15') --返回:星期五 6. day(), month(),year() --可以与datepart对照一下 select 当前日期=convert(varchar(10),getdate(),120) ,当前时间=convert(varchar(8),getdate(),114) select datename(dw,'2004-10-15') select 本年第多少周=datename(week,'2004-10-15') ,今天是周几=datename(weekday,'2004-10-15') 函数参数/功能 GetDate( ) 返回系统目前的日期与时间 DateDiff (interval,date1,date2) 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1 DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期 DatePart (interval,date) 返回日期date中,interval指定部分所对应的整数值

sqlserver常用函数

Sql Server 常用函数 1,统计函数avg, count, max, min, sum 2, 3,多数聚会不统计值为null的行。可以与distinct一起使用去掉重复的行。可以与group by 来分组4, 5, 2,数学函数 6, 7, SQRT 8, ceiling(n) 返回大于或者等于n的最小整数 9, floor(n), 返回小于或者是等于n的最大整数 10,round(m,n), 四舍五入,n是保留小数的位数 11,abs(n) 12,sign(n), 当n>0, 返回1,n=0,返回0,n<0, 返回-1 13,PI(), 3.1415.... 14,rand(),rand(n), 返回0-1之间的一个随机数 15,3,字符串函数 16, 17,ascii(), 将字符转换为ASCII码, ASCII('abc') = 97 18,char(), ASCII 码转换为字符 19,low(),upper() 20,str(a,b,c)转换数字为字符串。a,是要转换的字符串。b是转换以后的长度,c是小数位数。 str(123.456,8,2) = 123.46 21,ltrim(), rtrim() 去空格 22,left(n), right(n), substring(str, start,length) 截取字符串 23,charindex(子串,母串),查找是否包含。返回第一次出现的位置,没有返回0 24,patindex('%pattern%', expression) 功能同上,可是使用通配符 25,replicate('char', rep_time), 重复字符串 26,reverse(char),颠倒字符串 27,replace(str, strold, strnew) 替换字符串 28,space(n), 产生n个空行 29,stuff(), SELECT STUFF('abcdef', 2, 3, 'ijklmn') ='aijklmnef', 2是开始位置,3是要从原来串中删除的字符长度,ijlmn是要插入的字符串。 30,3,类型转换函数: 31, 32,cast, cast( expression as data_type), Example: 33,SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales FROM titles WHERE CAST(ytd_sales AS char(20)) LIKE '3%' 34,convert(data_type, expression) 35,4,日期函数 36, 37,day(), month(), year() 38,dateadd(datepart, number, date), datapart指定对那一部分加,number知道加多少,date指定在谁的基础上加。datepart的取值包括,

oracle 经典SQL语句大全

一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1. dat' --- 开始备份 BACKUP DATABASE pubs TO testBack 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键:Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1

Oracle查询语句基本命令一

oracle查询语句大全--基本命令大全一 1.create user username identified by password;//建用户名和密码oracle ,oracle 2.grant connect,resource,dba to username;//授权grant connect,resource,dba,sysdba to username; 3.connect username/password//进入。 4.select table_name,column_name from user_tab_columns where table_name='mview_log';//查询表中的表名,字段名等等。 5. 如何执行脚本SQL文件? SQL>@PATH/filename.sql; 6.Oracle oledb 提供者在command中执行多条SQL语句与SQL SERVER有少许差别,SQL Server只需使用";"分割多条SQL语句,而Oracle需要遵守ORACLE调用规范,即除分号分割外,还需以begin /end;包围语句体. 使用C#描述应如下所示: https://www.doczj.com/doc/0715412783.html,mandText = "begin INSERT INTO GROUP_INFO (GROUP_ID, GROUP_NAME) V ALUES (1, \'2\'); INSERT INTO GROUP_INFO(GROUP_ID, GROUP_NAME) V ALUES (2, \'2\'); end;"; 7.查询用户下的表的信息select distinct table_name from user_tab_columns; 8.如何搜索出前N条记录?Select a.*,rownum from (select * from cardkind order by cardkind ) a where rownum show user 3、查看系统拥有哪些用户SQL> select * from all_users; 4、新建用户并授权 SQL> create user a identified by a;(默认建在SYSTEM表空间下) SQL> grant connect,resource to a; 5、连接到新用户SQL> conn a/a

SQLSERVER函数大全

SQL SERVER函数大全 SQL SERVER命令大全 SQLServer和Oracle的常用函数对比 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from dual 3.取整(小) S:select floor(-1.001) value O:select floor(-1.001) value from dual 4.取整(截取) S:select cast(-1.002 as int) value O:select trunc(-1.002) value from dual 5.四舍五入 S:select round(1.23456,4) value 1.23460 O:select round(1.23456,4) value from dual 1.2346 6.e为底的幂 S:select Exp(1) value 2.7182818284590451 O:select Exp(1) value from dual 2.71828182 7.取e为底的对数 S:select log(2.7182818284590451) value 1 O:select ln(2.7182818284590451) value from dual; 1 8.取10为底对数 S:select log10(10) value 1 O:select log(10,10) value from dual; 1 9.取平方 S:select SQUARE(4) value 16 O:select power(4,2) value from dual 16

SQLServer用户自定义函数详细介绍

SQL Server用户自定义函数 用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过EXECUTE 命令来执行。在 SQL Server 中根据函数返回值形式的不同将用户自定义函数分为三种类型: (1) 标量函数 标量函数返回一个确定类型的标量值,其返回值类型为除 TEXT 、 NTEXT 、IMAGE 、 CURSOR 、 TIMESTAMP 和 TABLE 类型外的其它数据类型。函数体语句定义 在 BEGIN-END 语句内。在 RETURNS 子句中定义返回值的数据类型,并且函数的最后一条语句必须为 Return 语句。创建标量函数的格式: Create Function 函数名(参数) Returns 返回值数据类型 [With {Encryption|Schemabinding}] [AS] BEGIN SQL 语句 ( 必须有 Return 子句 ) END 举例: ******************************************************************* CREATE FUNCTION dbo.Max ( @a int, @b int ) RETURNS int AS BEGIN DECLARE @max int IF @a>@b SET @max=@a ELSE SET @max=@b Return @max END *******************************************************************调用标量函数可以在 T-SQL 语句中允许使用标量表达式的任何位置调用返 回标量值(与标量表达式的数据类型相同)的任何函数。必须使用至少由两部分组成名称的函数来调用标量值函数,即架构名 . 对象名,如 dbo.Max(12,34) 。 (2) 内联表值函数 内联表值型函数以表的形式返回一个返回值,即它返回的是一个表。内联表 值型函数没有由 BEGIN-END 语句括起来的函数体。其返回的表是由一个位于RETURN 子句中的 SELECT 命令从数据库中筛选出来。内联表值型函数功能相当 于一个参数化的视图。

sql 语句大全

oracle数据库性能监控的SQL 1. 监控事例的等待 SQL> SELECT EVENT,SUM(DECODE(WAIT_TIME,0,0,1)) "PREV",SUM(DECODE(WAIT_TIME,0,1,0)) "CURR",COUNT(*) "TOT" FROM V$SESSION_WAIT GROUP BY EVENT ORDER BY 4; 2. 回滚段的争用情况 SQL> SELECT NAME, WAITS, GETS, WAITS/GETS "RATIO" FROM V$ROLLSTAT A, V$ROLLNAME B WHERE https://www.doczj.com/doc/0715412783.html,N = https://www.doczj.com/doc/0715412783.html,N; 3. 监控表空间的 I/O 比例 SQL> SELECT DF.TABLESPACE_NAME NAME,DF.FILE_NAME "FILE",F.PHYRDS PYR, F.PHYBLKRD PBR,F.PHYWRTS PYW, F.PHYBLKWRT PBW FROM V$FILESTAT F, DBA_DATA_FILES DF WHERE F.FILE# = DF.FILE_ID ORDER BY DF.TABLESPACE_NAME; 4. 监控文件系统的 I/O 比例 SQL> SELECT SUBSTR(A.FILE#,1,2) "#", SUBSTR(https://www.doczj.com/doc/0715412783.html,,1,30) "NAME", A.STATUS,A.BYTES, B.PHYRDS,B.PHYWRTS FROM V$DATAFILE A, V$FILESTAT B WHERE A.FILE# = B.FILE#; 5.在某个用户下找所有的索引 SQL> SELECT USER_INDEXES.TABLE_NAME, USER_INDEXES.INDEX_NAME,UNIQUENESS, COLUMN_NAME FROM USER_IND_COLUMNS, USER_INDEXES WHERE USER_IND_COLUMNS.INDEX_NAME = USER_INDEXES.INDEX_NAME AND USER_IND_COLUMNS.TABLE_NAME = USER_INDEXES.TABLE_NAME ORDER BY USER_INDEXES.TABLE_TYPE, USER_INDEXES.TABLE_NAME, USER_INDEXES.INDEX_NAME, COLUMN_POSITION; 6. 监控 SGA 的命中率 SQL> SELECT A.VALUE + B.VALUE "LOGICAL_READS", C.VALUE "PHYS_READS", ROUND(100 * ((A.VALUE+B.VALUE)-C.VALUE) / (A.VALUE+B.VALUE)) "BUFFER HIT RATIO" FROM V$SYSSTAT A, V$SYSSTAT B, V$SYSSTAT C WHERE A.STATISTIC# = 38 AND B.STATISTIC# = 39 AND C.STATISTIC# = 40; 7. 监控 SGA 中字典缓冲区的命中率 SQL> SELECT PARAMETER, GETS,GETMISSES , GETMISSES/(GETS+GETMISSES)*100 "MISS RATIO",(1-(SUM(GETMISSES)/ (SUM(GETS)+SUM(GETMISSES))))*100 "HIT RATIO" FROM V$ROWCACHE WHERE GETS+GETMISSES <>0 GROUP BY PARAMETER, GETS, GETMISSES; 8. 监控 SGA 中共享缓存区的命中率,应该小于1% SQL> SELECT SUM(PINS) "TOTAL PINS", SUM(RELOADS) "TOTAL RELOADS", SUM(RELOADS)/SUM(PINS) *100 LIBCACHE FROM V$LIBRARYCACHE; SQL> SELECT SUM(PINHITS-RELOADS)/SUM(PINS) "HIT RADIO",SUM(RELOADS)/SUM(PINS)

oracle命令大全

1.create user username identified by password;//建用户名和密码oracle ,oracle 2.grant connect,resource,dba to username;//授权 grant connect,resource,dba,sysdba to username; 3.connect username/password//进入。 4.select table_name,column_name from user_tab_columns where table_name='mview_log';//查询表中的表名,字段名等等。 5. 如何执行脚本SQL文件? SQL>@PATH/filename.sql; 6.Oracle oledb 提供者在command中执行多条SQL语句与SQL SERVER有少许差别,SQL Server 只需使用";"分割多条SQL语句,而Oracle需要遵守ORACLE调用规范,即除分号分割外,还需以begin /end;包围语句体. 使用C#描述应如下所示: https://www.doczj.com/doc/0715412783.html,mandText = "begin INSERT INTO GROUP_INFO (GROUP_ID, GROUP_NAME) VALUES (1, \'2\'); INSERT INTO GROUP_INFO(GROUP_ID, GROUP_NAME) VALUES (2, \'2\'); end;"; 7.查询用户下的所有表 select distinct table_name from user_tab_columns; 8.如何搜索出前N条记录?Select a.*,rownum from (select * from cardkind order by cardkind ) a where rownum show user 3、查看系统拥有哪些用户 SQL> select * from all_users; 4、新建用户并授权 SQL> create user a identified by a;(默认建在SYSTEM表空间下) SQL> grant connect,resource to a; 5、连接到新用户 SQL> conn a/a 6、查询当前用户下所有对象 SQL> select * from tab; 7、建立第一个表 SQL> create table a(a number); 8、查询表结构 SQL> desc a 9、插入新记录 SQL> insert into a values(1); 10、查询记录 SQL> select * from a;

sqlserver日期函数

sqlserver日期函数 SQLServer时间日期函数详解,SQLServer,时间日期, 1. 当前系统日期、时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的datetime 值 例如:向日期加上2天 select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:0 0.000 3. datediff 返回跨两个指定日期的日期和时间边界数。 select datediff(day,'2004-09-01','2004-09-18') --返回:17 select datediff(day,'2004-09-18','2004-09-01') --返回:-17 4. datepart 返回代表指定日期的指定日期部分的整数。 SELECT DATEPART(month, '2004-10-15') --返回10 5. datename 返回代表指定日期的指定日期部分的字符串 SELECT datename(weekday, '2004-10-15') --返回:星期五 6. day(), month(),year() --可以与datepart对照一下 select 当前日期=convert(varchar(10),getdate(),120) ,当前时间=convert(varchar(8),getdate(),114) select datename(dw,'2004-10-15') select 本年第多少周=datename(week,'2004-10-15') ,今天是周几=datename(weekday,'2004-10-15') 函数参数/功能 GetDate( ) 返回系统目前的日期与时间 DateDiff (interval,date1,date2) 以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1 DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日期 DatePart (interval,date) 返回日期date中,interval指定部分所对应的整数值DateName (interval,date) 返回日期date中,interval指定部分所对应的字符串名称 参数interval的设定值如下: 值缩写(Sql Server)(Access 和ASP) 说明 Year Yy yyyy 年1753 ~ 9999 Quarter Qq q 季1 ~ 4 Month Mm m 月1 ~ 12

oracle查询语句大全

oracle查询语句大全oracle 基本命令大全一 1.create user username identified by password;//建用户名和密码oracle ,oracle 2.grant connect,resource,dba to username;//授权grant connect,resource,dba,sysdba to username; 3.connect username/password//进入。 4.select table_name,column_name from user_tab_columns where table_name='mview_log';//查询表中的表名,字段名等等。 5. 如何执行脚本SQL文件? SQL>@PA TH/filename.sql; 6.Oracle oledb 提供者在command中执行多条SQL语句与SQL SERVER有少许差别,SQL Server只需使用";"分割多条SQL语句,而Oracle需要遵守ORACLE调用规范,即除分号分割外,还需以begin /end;包围语句体. 使用C#描述应如下所示: https://www.doczj.com/doc/0715412783.html,mandText = "begin INSERT INTO GROUP_INFO (GROUP_ID, GROUP_NAME) V ALUES (1, \'2\'); INSERT INTO GROUP_INFO(GROUP_ID, GROUP_NAME) V ALUES (2, \'2\'); end;"; 7.查询用户下的所有表select distinct table_name from user_tab_columns; 8.如何搜索出前N条记录?Select a.*,rownum from (select * from cardkind order by cardkind ) a where rownum show user 3、查看系统拥有哪些用户 SQL> select * from all_users; 4、新建用户并授权 SQL> create user a identified by a;(默认建在SYSTEM表空间下)

SQLServer2005函数大全

SQL Server 2005 函数大全 字符串函数 (2) 日期和时间函数 (3) 日期部分 (5) 数学函数 (6) 数据类型转换函数 (7) 日期类型数据转换为字符数据类型的日期格式的部分样式表 (8) 系统函数 (11) 排名函数 (11) 聚合函数 (12)

字符串函数 表达式:是常量、变量、列或函数等与运算符的任意组合。以下参数中表达式类型是指表达式经运算后返回的值的类型 函数名称参数示例说明 ascii (字符串表达式) select ascii('abc') 返回 97返回字符串中最左侧的字符的ASCII码。 char(整数表达式) select char(100) 返回 d 把ASCII 码转换为字符。 介于0 和255 之间的整数。如果该整数表达式不在此范围内,将返回NULL 值。 charindex (字符串表达式1,字符串表达式 2[,整数表达式]) select charindex('ab','BCabTabD')返回3 select charindex('ab','BCabTabD',4)返回6 在字符串2中查找字符串1,如果存在返回第一个匹配的 位置,如果不存在返回0。如果字符串1和字符串2中有一个 是null则返回null。 可以指定在字符串2中查找的起始位置。 difference (字符串表达式1,字符串表达式2) select difference('Green','Greene')返回4 返回一个0到4的整数值,指示两个字符表达式的之间的相似程度。0 表示几乎不同或完全不同,4表示几乎相同或完全相同。注意相似并不代表相等 left (字符串表达式,整数表达式) select left('abcdefg',2) 返回 ab返回字符串中从左边开始指定个数的字符。 right (字符串表达式,整数表达式) select right('abcdefg',2) 返回fg返回字符串中从右边开始指定个数的字符。 len(字符串表达式) select len('abcdefg')返回 7 select len('abcdefg ') 返回7 返回指定字符串表达式的字符数,其中不包含尾随空格。lower (字符串表达式) select lower('ABCDEF')返回 abcdef返回大写字符数据转换为小写的字符表达式。 upper (字符串表达式) select upper('abcdef')返回 ABCDEF返回小写字符数据转换为大写的字符表达式。 ltrim (字符串表达式) select ltrim(' abc')返回 abc返回删除了前导空格之后的字符表达式。 rtrim(字符串表达式) select rtrim('abc ')返回 abc返回删除了尾随空格之后的字符表达式。 patindex (字符串表达式1,字符串表达式2) select patindex('%ab%','123ab456')返回4 select patindex('ab%','123ab456')返回0 select patindex('___ab%','123ab456')返回1 select patindex('___ab_','123ab456')返回0 在字符串表达式1中可以使用通配符,此字符串的第一个 字符和最后一个字符通常是%。 %表示任意多个字符,_表示任意字符 返回字符串表达式2中字符串表达式1所指定模式第一次出现 的起始位置。没有找到返回0 reverse (字符串表达式) select reverse('abcde')返回 edcba返回指定字符串反转后的新字符串space (整数表达式) select'a'+space(2)+'b' 返回 a b返回由指定数目的空格组成的字符串。

Oracle数据库语句大全

Oracle数据库语句大全 一.入门部分 1.创建表空间 create tablespace schooltbs datafile ‘D:\oracle\datasource\schooltbs.dbf’ size 10M autoextend on; 2.删除表空间 drop tablespace schooltbs[including contents and datafiles]; 3.查询表空间基本信息 select *||tablespace_name from DBA_TABLESPACES; 4.创建用户 create user lihua identified by lihua default tablespace schooltbs temporary tablespace temp; 5.更改用户 alter user lihua identified by 123 default tablespace users; 6.锁定用户 alter user lihua account lock|unlock; 7.删除用户 drop user lihua cascade;--删除用户模式 8.oracle数据库中的角色 connect,dba,select_catalog_role,delete_catalog_role,execute_catalo g_role,exp_full_database,imp_full_database,resource 9.授予连接服务器的角色 grant connect to lihua; 10.授予使用表空间的角色 grant resource to lihua with grant option;--该用户也有授权的权限 11.授予操作表的权限 grant select,insert on user_tbl to scott;--当前用户 grant delete,update on https://www.doczj.com/doc/0715412783.html,er_tbl to scott;--系统管理员 二.SQL查询和SQL函数 1.SQl支持的命令: 数据定义语言(DDL):create,alter,drop 数据操纵语言(DML):insert,delete,update,select 数据控制语言(DCL):grant,revoke 事务控制语言(TCL):commit,savepoint,rollback 2.Oracle数据类型 字符,数值,日期,RAW,LOB 字符型 char:1-2000字节的定长字符

相关主题
文本预览
相关文档 最新文档