刚接触oracle 希望了解一些sqlplus里的常用命令!!这里只开个头: 大家有何高见; 请不吝赐教~~! 还发现一个问题, 这个板块竟然没有精华帖子~?建表语句
create table students(stuid int);多个属性时 可以这样:CREATE TABLE A103AREASTRU (
ID NUMBER(10, 0),
ENGFLDNAME VARCHAR2(30),
CHNFLDNAME VARCHAR2(40),
FLDTYPE VARCHAR2(10),
FLDLENGTH NUMBER(10, 0),
FLDDEC NUMBER(2, 0),
DEFAULTVALUE VARCHAR2(254),
RELAMASTER VARCHAR2(100)
);插入记录:
insert into students values(1001);查询:
select * from students;删除表:
drop table students;查询数据库里有哪些表:
select * from tab;
create table students(stuid int);多个属性时 可以这样:CREATE TABLE A103AREASTRU (
ID NUMBER(10, 0),
ENGFLDNAME VARCHAR2(30),
CHNFLDNAME VARCHAR2(40),
FLDTYPE VARCHAR2(10),
FLDLENGTH NUMBER(10, 0),
FLDDEC NUMBER(2, 0),
DEFAULTVALUE VARCHAR2(254),
RELAMASTER VARCHAR2(100)
);插入记录:
insert into students values(1001);查询:
select * from students;删除表:
drop table students;查询数据库里有哪些表:
select * from tab;
解决方案 »
- 考虑到表频繁地插入和删除记录的情况,用序列(SEQUENCE)创建的主键值可以重复利用么?
- 问个按时间段汇总统计的问题
- 请教关于库存中的出入库单号和相关单据2个属性
- 请教sqlserver移植到oracle的问题
- 1064 - You have an error in your SQL syntax
- 求救!外部数据窗口如何生成Graph统计图?
- IMP-00015: 由于对象已存在, 下列语句失败:
- 如果我刚刚delete了一张表,想把数据找回来,有没有办法呢?
- 请教一个有关Oracle9的问题
- net manager配置问题
- 在安装oracle数据库时 data_warehouse错误
- oracle 自带的SQL PLUS登录不上?
ORACLE的基本语法集锦
-- 表
create table test (names varchar2(12),
dates date,
num int,
dou double);
-- 视图
create or replace view vi_test as
select * from test; -- 同义词
create or replace synonym aa
for dbusrcard001.aa; -- 存储过程
create or replace produce dd(v_id in employee.empoy_id%type)
as
begin
end
dd; -- 函数
create or replace function ee(v_id in employee%rowtype) return varchar(15)
is
var_test varchar2(15);
begin
return var_test;
exception when others then
end -- 三种触发器的定义
create or replace trigger ff
alter delete
on test
for each row
declare
begin
delete from test;
if sql%rowcount < 0 or sql%rowcount is null then
rais_replaction_err(-20004,"错误")
end if
end
create or replace trigger gg
alter insert
on test
for each row
declare
begin
if :old.names = :new.names then
raise_replaction_err(-2003,"编码重复");
end if
end
create or replace trigger hh
for update
on test
for each row
declare
begin
if updating then
if :old.names <> :new.names then
reaise_replaction_err(-2002,"关键字不能修改")
end if
end if
end -- 定义游标
declare
cursor aa is
select names,num from test;
begin
for bb in aa
loop
if bb.names = "ORACLE" then
end if
end loop;
end -- 速度优化,前一语句不后一语句的速度快几十倍
select names,dates
from test,b
where test.names = b.names(+) and
b.names is null and
b.dates > date('2003-01-01','yyyy-mm-dd')
select names,dates
from test
where names not in ( select names
from b
where dates > to_date('2003-01-01','yyyy-mm-dd'))
-- 查找重复记录
select names,num
from test
where rowid != (select max(rowid)
from test b
where b.names = test.names and
b.num = test.num)
-- 查找表TEST中时间最新的前10条记录
select * from (select * from test order by dates desc) where rownum < 11 -- 序列号的产生
create sequence row_id
minvalue 1
maxvalue 9999999999999999999999
start with 1
increment by 1 insert into test values(row_id.nextval,....)
ORACLE的临时表在应用系统中有很大的作用,它可以让用户只能够操作各自的数据中而互不干扰,不用担心会破坏或影响其他SESSION/TRANSACTION的数据,这也是数据安全的一种解决方法 临时表分为SESSION、TRANSACTION两种,SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。 两种临时表的语法: create global temporary table 临时表名 on commit preserve|delete rows
用preserve时就是SESSION级的临时表,用delete就是TRANSACTION级的临时表 例:1、SESSION级临时表 --建立临时表 create global temporary table temp_tbl(col_a varchar2(30))
on commit preserve rows --插入数据 insert into temp_tbl values('test session table') --提交 commit --查询数据 select *from temp_tbl 可以看到数据'test session table'记录还在 --结束SESSION,重新登录,再查询数据select *from temp_tbl,这时候记录已不存在,因为系统在结束SESSION时自动清除记录 2、TRANSACTION级临时表 --建立临时表 create global temporary table temp_tbl(col_a varchar2(30))
on commit delete rows --插入数据 insert into temp_tbl values('test transaction table') --提交
commit
--查询数据 select *from temp_tbl 这时候可以看到刚才插入的记录'test transaction table'已不存在了;同样,如果不提交而直接结束SESSION,重新登录记录也不存在。
接分
SQL> set serveroutput onSQL> edit
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;2、查看表空间物理文件的名称及大小 select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;3、查看回滚段名称及大小 select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name ;4、查看控制文件 select name from v$controlfile;5、查看日志文件 select member from v$logfile;6、查看表空间的使用情况 select sum(bytes)/(1024*1024) as free_space,tablespace_name
from dba_free_space
group by tablespace_name; SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;7、查看数据库库对象 select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;8、查看数据库的版本 Select version FROM Product_component_version
Where SUBSTR(PRODUCT,1,6)='Oracle';9、查看数据库的创建日期和归档方式 Select Created, Log_Mode, Log_Mode From V$Database;
set linesize 1000
设置每行显示1000个字符
我原来都是 先创建一个数据库, 然后在这个数据库里 建一个表;各个数据库之间 独立; 可以方便的使用 use 数据库名字;切换create table borrow
(
borrowno int primary key,
bookno int,
studentno int,
foreign key (bookno) references books(bookno) on delete cascade on update cascade,
foreign key (studentno) references students(studentno) on delete cascade on update cascade,
borrowdate datetime,
returndate datetime,
action int,
comment varchar(10)
);像如上 设置 主键, 外键的做法;
oracle里可以吗??
SQL>conn/sys 用户名/密码 as dba
SQL>.....
sql>spool test.txt
sql>select * from v$datafile;
sql>spool off
oracle 是单库结果,可以通过不同的用户进行区分。
建立表的基本语法差不多
create table CUST
(
CUSTID NUMBER(9) not null,
CUSTNAME VARCHAR2(10),
CARDID VARCHAR2(20),
BIRTH DATE,
SEX VARCHAR2(1),
PHONE VARCHAR2(50),
ADDRESS VARCHAR2(100),
ID VARCHAR2(20)
);
alter table CUST
add constraint PK_CUST primary key (CUSTID)
SQL>start file_name
SQL>@ file_name
我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。
2. 对当前的输入进行编辑
SQL>edit
3. 重新运行上一次运行的sql语句
SQL>/
4. 将显示的内容输出到指定文件
SQL> SPOOL file_name
在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。
5. 关闭spool输出
SQL> SPOOL OFF
只有关闭spool输出,才会在输出文件中看到输出的内容。
6.显示一个表的结构
SQL> desc table_name
7. COL命令:
主要格式化列的显示形式。
该命令有许多选项,具体如下:
COL[UMN] [{ column|expr} [ option ...]]
Option选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
LIKE { expr|alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]|PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON|OFF
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
1). 改变缺省的列标题
COLUMN column_name HEADING column_heading
For example:
Sql>select * from dept;
DEPTNO DNAME LOC
---------- ---------------------------- ---------
10 ACCOUNTING NEW YORK
sql>col LOC heading location
sql>select * from dept;
DEPTNO DNAME location
--------- ---------------------------- -----------
10 ACCOUNTING NEW YORK
2). 将列名ENAME改为新列名EMPLOYEE NAME并将新列名放在两行上:
Sql>select * from emp
Department name Salary
---------- ---------- ----------
10 aaa 11
SQL> COLUMN ENAME HEADING ’Employee|Name’
Sql>select * from emp
Employee
Department name Salary
---------- ---------- ----------
10 aaa 11
note: the col heading turn into two lines from one line.
3). 改变列的显示长度:
FOR[MAT] format
Sql>select empno,ename,job from emp;
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
Sql> col ename format a40
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
4). 设置列标题的对齐方式
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}
SQL> col ename justify center
SQL> /
EMPNO ENAME JOB
---------- ---------------------------------------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
对于NUMBER型的列,列标题缺省在右边,其它类型的列标题缺省在左边
5). 不让一个列显示在屏幕上
NOPRI[NT]|PRI[NT]
SQL> col job noprint
SQL> /
EMPNO ENAME
---------- ----------------------------------------
7369 SMITH
7499 ALLEN
7521 WARD
6). 格式化NUMBER类型列的显示:
SQL> COLUMN SAL FORMAT $99,990
SQL> /
Employee
Department Name Salary Commission
---------- ---------- --------- ----------
30 ALLEN $1,600 300
7). 显示列值时,如果列值为NULL值,用text值代替NULL值
COMM NUL[L] text
SQL>COL COMM NUL[L] text
8). 设置一个列的回绕方式
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]
COL1
--------------------
HOW ARE YOU?
SQL>COL COL1 FORMAT A5
SQL>COL COL1 WRAPPED
COL1
-----
HOW A
RE YO
U?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW
ARE
YOU?
SQL> COL COL1 WORD_WRAPPED
COL1
-----
HOW A
9). 显示列的当前的显示属性值
SQL> COLUMN column_name
10). 将所有列的显示属性设为缺省值
SQL> CLEAR COLUMNS
8. 屏蔽掉一个列中显示的相同的值
BREAK ON break_column
SQL> BREAK ON DEPTNO
SQL> SELECT DEPTNO, ENAME, SAL
FROM EMP
WHERE SAL < 2500
ORDER BY DEPTNO;
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
9. 在上面屏蔽掉一个列中显示的相同的值的显示中,每当列值变化时在值变化之前插入n个空行。
BREAK ON break_column SKIP n
SQL> BREAK ON DEPTNO SKIP 1
SQL> /
DEPTNO ENAME SAL
---------- ----------- ---------
10 CLARK 2450
MILLER 1300
20 SMITH 800
ADAMS 1100
SQL> BREAK
11. 删除6、7的设置
SQL> CLEAR BREAKS
12. Set 命令:
该命令包含许多子命令:
SET system_variable value
system_variable value 可以是如下的子句之一:
APPI[NFO]{ON|OFF|text}
ARRAY[SIZE] {15|n}
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}
AUTOP[RINT] {ON|OFF}
AUTORECOVERY [ON|OFF]
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
BLO[CKTERMINATOR] {.|c}
CMDS[EP] {;|c|ON|OFF}
COLSEP {_|text}
COM[PATIBILITY]{V7|V8|NATIVE}
CON[CAT] {.|c|ON|OFF}
COPYC[OMMIT] {0|n}
COPYTYPECHECK {ON|OFF}
DEF[INE] {&|c|ON|OFF}
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]
ECHO {ON|OFF}
EDITF[ILE] file_name[.ext]
EMB[EDDED] {ON|OFF}
ESC[APE] {|c|ON|OFF}
FEED[BACK] {6|n|ON|OFF}
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}
FLU[SH] {ON|OFF}
HEA[DING] {ON|OFF}
HEADS[EP] {||c|ON|OFF}
INSTANCE [instance_path|LOCAL]
LIN[ESIZE] {80|n}
LOBOF[FSET] {n|1}
LOGSOURCE [pathname]
LONG {80|n}
LONGC[HUNKSIZE] {80|n}
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]
NEWP[AGE] {1|n|NONE}
NULL text
NUMF[ORMAT] format
NUM[WIDTH] {10|n}
PAGES[IZE] {24|n}
PAU[SE] {ON|OFF|text}
RECSEP {WR[APPED]|EA[CH]|OFF}
RECSEPCHAR {_|c}
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_
WRAPPED]|TRU[NCATED]}]
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}
SHOW[MODE] {ON|OFF}
SQLBL[ANKLINES] {ON|OFF}
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}
SQLCO[NTINUE] {> |text}
SQLN[UMBER] {ON|OFF}
SQLPRE[FIX] {#|c}
SQLP[ROMPT] {SQL>|text}
SQLT[ERMINATOR] {;|c|ON|OFF}
SUF[FIX] {SQL|text}
TAB {ON|OFF}
TERM[OUT] {ON|OFF}
TI[ME] {ON|OFF}
TIMI[NG] {ON|OFF}
TRIM[OUT] {ON|OFF}
TRIMS[POOL] {ON|OFF}
UND[ERLINE] {-|c|ON|OFF}
VER[IFY] {ON|OFF}
WRA[P] {ON|OFF}
1). 设置当前session是否对修改的数据进行自动提交
SQL>SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}
2).在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句
SQL> SET ECHO {ON|OFF}
3).是否显示当前sql语句查询或修改的行数
SQL> SET FEED[BACK] {6|n|ON|OFF}
默认只有结果大于6行时才显示结果的行数。如果set feedback 1 ,则不管查询到多少行都返回。当为off 时,一律不显示查询的行数
4).是否显示列标题
SQL> SET HEA[DING] {ON|OFF}
当set heading off 时,在每页的上面不显示列标题,而是以空白行代替
5).设置一行可以容纳的字符数
SQL> SET LIN[ESIZE] {80|n}
如果一行的输出内容大于设置的一行可容纳的字符数,则折行显示。
6).设置页与页之间的分隔
SQL> SET NEWP[AGE] {1|n|NONE}
当set newpage 0 时,会在每页的开头有一个小的黑方框。
当set newpage n 时,会在页和页之间隔着n个空行。
当set newpage none 时,会在页和页之间没有任何间隔。
7).显示时,用text值代替NULL值
SQL> SET NULL text
8).设置一页有多少行数
SQL> SET PAGES[IZE] {24|n}
如果设为0,则所有的输出内容为一页并且不显示列标题
9).是否显示用DBMS_OUTPUT.PUT_LINE包进行输出的信息。
SQL> SET SERVEROUT[PUT] {ON|OFF}
在编写存储过程时,我们有时会用dbms_output.put_line将必要的信息输出,以便对存储过程进行调试,只有将serveroutput变量设为on后,信息才能显示在屏幕上。
10).当SQL语句的长度大于LINESIZE时,是否在显示时截取SQL语句。
SQL> SET WRA[P] {ON|OFF}
当输出的行的长度大于设置的行的长度时(用set linesize n命令设置),当set wrap on时,输出行的多于的字符会另起一行显示,否则,会将输出行的多于字符切除,不予显示。
11).是否在屏幕上显示输出的内容,主要用与SPOOL结合使用。
SQL> SET TERM[OUT] {ON|OFF}
在用spool命令将一个大表中的内容输出到一个文件中时,将内容输出在屏幕上会耗费大量的时间,设置set termspool off后,则输出的内容只会保存在输出文件中,不会显示在屏幕上,极大的提高了spool的速度。
12).将SPOOL输出中每行后面多余的空格去掉
SQL> SET TRIMS[OUT] {ON|OFF}
13)显示每个sql语句花费的执行时间
set TIMING {ON|OFF}
14.修改sql buffer中的当前行中,第一个出现的字符串
C[HANGE] /old_value/new_value
SQL> l
1* select * from dept
SQL> c/dept/emp
1* select * from emp
15.编辑sql buffer中的sql语句
EDI[T]
16.显示sql buffer中的sql语句,list n显示sql buffer中的第n行,并使第n行成为当前行
L[IST] [n]
17.在sql buffer的当前行下面加一行或多行
I[NPUT]
18.将指定的文本加到sql buffer的当前行后面
A[PPEND]
SQL> select deptno,
2 dname
3 from dept;
DEPTNO DNAME
---------- --------------
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
SQL> L 2
2* dname
SQL> a ,loc
2* dname,loc
SQL> L
1 select deptno,
2 dname,loc
3* from dept
SQL> /
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
19.将sql buffer中的sql语句保存到一个文件中
SAVE file_name
20.将一个文件中的sql语句导入到sql buffer中
GET file_name
21.再次执行刚才已经执行的sql语句
RUN
or
/
22.执行一个存储过程
EXECUTE procedure_name
23.在sql*plus中连接到指定的数据库
CONNECT user_name/passwd@db_alias
24.设置每个报表的顶部标题
TTITLE
25.设置每个报表的尾部标题
BTITLE
26.写一个注释
REMARK [text]
27.将指定的信息或一个空行输出到屏幕上
PROMPT [text]
28.将执行的过程暂停,等待用户响应后继续执行
PAUSE [text]
Sql>PAUSE Adjust paper and press RETURN to continue.
29.将一个数据库中的一些数据拷贝到另外一个数据库(如将一个表的数据拷贝到另一个数据库)
COPY {FROM database | TO database | FROM database TO database}
{APPEND|CREATE|INSERT|REPLACE} destination_table
[(column, column, column, ...)] USING query
sql>COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST
create emp_temp
USING SELECT * FROM EMP
30.不退出sql*plus,在sql*plus中执行一个操作系统命令:
HOST
Sql> host hostname
该命令在windows下可能被支持。
31.在sql*plus中,切换到操作系统命令提示符下,运行操作系统命令后,可以再次切换回sql*plus:
!
sql>!
$hostname
$exit
sql>
该命令在windows下不被支持。
32.显示sql*plus命令的帮助
HELP
如何安装帮助文件:
Sql>@ ?sqlplusadminhelphlpbld.sql ?sqlplusadminhelphelpus.sql
Sql>help index
33.显示sql*plus系统变量的值或sql*plus环境变量的值
Syntax
SHO[W] option
where option represents one of the following terms or clauses:
system_variable
ALL
BTI[TLE]
ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|
TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]
LNO
PARAMETERS [parameter_name]
PNO
REL[EASE]
REPF[OOTER]
REPH[EADER]
SGA
SPOO[L]
SQLCODE
TTI[TLE]
USER
1) . 显示当前环境变量的值:
Show all
2) . 显示当前在创建函数、存储过程、触发器、包等对象的错误信息
Show error
当创建一个函数、存储过程等出错时,变可以用该命令查看在那个地方出错及相应的出错信息,进行修改后再次进行编译。
3) . 显示初始化参数的值:
show PARAMETERS [parameter_name]
4) . 显示数据库的版本:
show REL[EASE]
5) . 显示SGA的大小
show SGA
6). 显示当前的用户名
show user
常用SQL查询:
1、查看表空间的名称及大小
select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
from dba_tablespaces t, dba_data_files d
where t.tablespace_name = d.tablespace_name
group by t.tablespace_name;
2、查看表空间物理文件的名称及大小
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
3、查看回滚段名称及大小
select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name;
4、查看控制文件
select name from v$controlfile;
5、查看日志文件
select member from v$logfile;
6、查看表空间的使用情况
select sum(bytes)/(1024*1024) as free_space,tablespace_name
from dba_free_space
group by tablespace_name;
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;
7、查看数据库库对象
select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;
8、查看数据库的版本
Select version FROM Product_component_version
Where SUBSTR(PRODUCT,1,6)='Oracle';
9、查看数据库的创建日期和归档方式
Select Created, Log_Mode, Log_Mode From V$Database;
10、捕捉运行很久的SQL
column username format a12
column opname format a16
column progress format a8
select username,sid,opname,
round(sofar*100 / totalwork,0) || '%' as progress,
time_remaining,sql_text
from v$session_longops , v$sql
where time_remaining <> 0
and sql_address = address
and sql_hash_value = hash_value
11 楼的 说的很好;给出了例子; 若同时要求 设定多个主键 该怎么办呢?alter table CUST
add constraint PK_CUST primary key (CUSTID) 我如果把primary key , 改为 foreign 是不是 就设外键了;若一张表同时要求 设定多个外键 该怎么办呢?
训练1:创建和使用分区表。
--步骤1:创建按成绩分区的考生表,共分为3个区:
create table 考生
(考号 varchar2(5),
姓名 varchar2(30),
成绩 number(3)
)
partition by range(成绩)
(partition a values less than (300)
tablespace users,
partition b values less than (500)
tablespace users,
partition c values less than (maxvalue)
tablespace users
);
--步骤2:插入不同成绩的若干学生:
insert into 考生 values('10001','王明',280);
insert into 考生 values('10002','赵亮',730);
insert into 考生 values('10003','赵成',550);
insert into 考生 values('10004','黄凯',490);
insert into 考生 values('10005','马新',360);
insert into 考生 values('10006','杨丽',670);
--步骤3:检查A区中的考生:
select * from 考生 partition(a);
--步骤4:检查全部的考生:
select * from 考生;
4.5.1视图的概念
训练1:创建简单视图。创建图书作者视图:
--步骤1:创建图书作者视图:
create view 图书作者(书名,作者)
as select 图书名称,作者 from 图书;
--步骤2:查询视图全部内容
select * from 图书作者;
--步骤3:查询部分视图:
select 作者 from 图书作者;
训练2:创建清华大学出版社的图书视图:
--步骤1:创建清华大学出版社的图书视图:
create view 清华图书
as select 图书名称,作者,单价 from 图书 where 出版社编号='01';
--步骤2:查询图书视图:
select * from 清华图书;
--步骤3:删除视图:
drop view 清华图书;
新联3:修改作者视图,加入出版社名称。
--步骤1:重建图书作者视图:
create or replace view 图书作者(书名,作者,出版社)
as select 图书名称,作者,出版社名称 from 图书,出版社
where 图书.出版社编号=出版社.编号;
--步骤2:查询视图内容:
select * from 图书作者;
训练4:创建emp表的一个统计视图:
create view 统计表(部门名,最大工资,最小工资,平均工资)
as select dname,max(sal),min(sal),avg(sal)
from emp e,dept d
where e.deptno=d.deptno
group by dname;
--步骤2:查询统计表:
select * from 统计表;
训练5:创建只读视图
--步骤1:创建emp表的经理视图:
create or replace view manager
as select * from emp where job='MANAGER'
with read only;
--步骤2:进行删除:
delete from manager;
训练6:使用FORCE选项创建带有错误的视图:
create force view 班干部 as slelect * from 班级 where 职务 is not null;
【训练7】视图插入练习。
--步骤1:创建清华大学出版社的图书视图:
create or replace view清华图书
as select * from 图书where 出版社编号='01';
--步骤2:插入新图书:
insert into清华图书 values('A0005','软件工程','01','冯娟',5,27.3);
--步骤3:显示视图:
select * from清华图书;
--步骤4:显示基表
select * from 图书;
【训练8】使用WITH CHECK OPTION选项限制视图的插入。
--步骤1:重建清华大学出版社的图书视图,带WITH CHECK OPTION选项:
create or replace view清华图书
as select * from 图书where 出版社编号='01'
with check option;
--步骤2,插入新图书:
insert into清华图书
values('A0006','Oracle数据库','02','黄河',3,39.8);
【训练9】基表本身限制视图的插入。
--步骤1:重建图书价格视图:
create or replace view 图书价格
as select 图书名称,单价 from 图书;
--步骤2:插入新图书:
insert into 图书价格values('Oracle数据库',39.8);
【训练10】查看清华图书视图的定义:
select text from user_views whereview_name='清华图书';
【训练11】查看用户拥有的视图:
Select object_name
From user_objects
Where object_type ’VIEW’;
第5 章 数据操纵
5.1数据库操作语句
【训练1】插入数据:
INSERT INTO表名[(字段列表)] VALUES(表达式列表)
--表的部分字段插入练习。
Insert into emp(empno,ename,job)
Values (1000,’小李’,’CLERK’);
Select * from emp where empno=1000;
--时间字段的插入练习 Insert into emp(empno,ename,job,hiredate)
Values(1001,’小马’,’CLERK’,’10-1月-03’);
--表的全部字段的插入练习
Insert into dept
Values(50,’培训部’,’深圳’);
--插入空值练习
Insert into emp(empno,ename,job,sal) Values(1005,’杨华’,’CLERK’,null);
【训练2】复制数据:
INSERTINTO表名(字段列表)SELECT(字段名1,字段名2,…)FROM 另外的表名;
--通过其他表插入数据的练习
--创建一个新表manager
Create table manager
as select empno,ename,sal from emp where job ’MANAGER’;
--从emp表拷贝数据到manager
Insert into manager
Select empno,ename,sal From emp
Where job ’CLERK’;
Select * from manager;
【训练3】修改数据:
UPDATE 表名 SET字段名1表达式1,字段名2表达式2,…WHERE 条件;
--修改小李 (编号为1000)的工资为3000。
Update emp
Set sal=3000
Where empno=1000;
--将小李 (编号为1000)的雇佣日期改成当前系统日期,部门编号改为50。
Update emp
Set hiredate=sysdate,deptno=50
Where empno=1000;
--为所有雇员增加100元工资。
Update emp Set sal=sal+100;
【训练4】根据其他表修改数据:
UPDATE 表名
SET (字段名1,字段名2,…)=select (字段名1,字段1,字段名2,…)
from 另外的表名 WHERE 条件;
Update manager
Set (ename,sal)=(select ename,sal from emp where empno=7788)
Where empno=1000;
【训练5】删除数据:
DELETE FROM 表名WHERE 条件;
--删除雇员编号为1000的雇员
Delete from emp Where empno=1000;
Select * from emp Where empno=1000;
【训练6】删除表中的全部记录:
TRUNCATE TABLE 表名;
--彻底删除manager表的内容
Truncate table manager;
5.2数据库事务
【训练1】学习使用COMMIT和ROLLBACK。
--提交尚未提交的操作
Commit;
--显示SCOTT的现有工资
Select ename,sal
From emp
Where empno=7788; --修改雇员SCOTT的工资
Update emp
Set sal sal+100
Where empno=7788;
--显示修改后的SCOTT的工资
Select ename,sal
From emp Where empno=7788;
--假定修改操作后发现增加的工资应该为1000而不是100,为了取消刚做的操作,可以执行以下命令: rollback;
--显示回退后SCOTT的工资恢复为3000: select ename,sal
from emp
where empno=7788;
--重新修改雇员SCOTT的工资,工资在原有基础上增加1000:
update emp
set sal=sal+1000 where empno=7788;
--显示修改后SCOTT的工资:
select ename,sal
from emp where empno=7788;
--经查看修改结果正确,提交所做的修改:
commit;
【训练2】学习使用SAVEPOINT命令。 --插入一个雇员: insert into emp(empno,ename,job) values(3000,'小马','STUDENT'); --插入保存点,检查点的名称为PA: savepointpa; --插入另一个雇员:
insert into emp(empno,ename,job) values(3001,'小黄','STUDENT');
--回退到保存点PA,则后插入的小黄被取消,而小马仍然保留。 Rollback to pa; --提交所做的修改: commit;
delete 参照书表 inner join 借书表 on 参照书表.id = 借书表.id where 参照书表= 语文书