Oracle PL/SQL语言基础

PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL/SQL程序。

PL/SQL的优点

从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL/SQL的情形。PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句。

PL/SQL的优点如下:

. PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。

. PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型

. PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,具有很好的可重用性。

. 可以使用ORACLE数据工具管理存储在服务器中的PL/SQL程序的安全性。可以授权或撤销数据库其他用户访问PL/SQL程序的能力。

. PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何ORACLE能够运行的操作系统都是非常便利的

. 对于SQL,ORACLE必须在同一时间处理每一条SQL语句,在网络环境下这就意味作每一个独立的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而PL/SQL是以整个语句块发给服务器,这就降低了网络拥挤。

PL/SQL块结构

PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:

声明部分(Declaration section)

声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。

执行部分(Executable section)

执行部分是PL/SQL块中的指令部分,由关键字BEGIN开始,所有的可执行语句都放在这一部分,其他的PL/SQL块也可以放在这一部分。

异常处理部分(Exception section)

这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。

PL/SQL块语法

[DECLARE]

---declaration statements

BEGIN

---executable statements

[EXCEPTION]

---exception statements

END

PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,以END结束。注释由--标示。

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)数据类型没有内部组件,他们大致可分为以下四类:

. number

. character

. date/time

. boolean

表1显示了数字数据类型;表2显示了字符数据类型;表3显示了日期和布尔数据类型。

表1 Scalar Types:Numeric

表2 字符数据类型

表3 DATE和BOOLEAN

LOB数据类型

LOB(大对象,Large object) 数据类型用于存储类似图像,声音这样的大型数据对象,LOB数据对象可以是二进制数据也可以是字符数据,其最大长度不超过4G。LOB数据类型支持任意访问方式,LONG只支持顺序访问方式。LOB存储在一个单独的位置上,同时一个LOB定位符(LOB locator)存储在原始的表中,该定位符是一个指向实际数据的指针。在PL/SQL中操作LOB数据对象使用ORACLE提供的包DBMS_LOB.LOB数据类型可分为以下四类:

. BFILE

. BLOB

. CLOB

. NCLOB

操作符

与其他程序设计语言相同,PL/SQL有一系列操作符。操作符分为下面几类:

. 算术操作符

. 关系操作符

. 比较操作符

. 逻辑操作符

算术操作符如表4所示

关系操作符主要用于条件判断语句或用于where子串中,关系操作符检查条件和结果是否为true或false,表5是PL/SQL中的关系操作符

表6 显示的是比较操作符

表7.8显示的是逻辑操作符

[[The No.8 Picture.]]

执行部分

执行部分包含了所有的语句和表达式,执行部分以关键字BEGIN开始,以关键字EXCEPTION结束,如果EXCEPTION不存在,那么将以关键字END结束。分号分隔每一条语句,使用赋值操作符:=或SELECT INTO或FETCH INTO给每个变量赋值,执行部分的错误将在异常处理部分解决,在执行部分中可以使用另一个PL/SQL程序块,这种程序块被称为嵌套块

所有的SQL数据操作语句都可以用于执行部分,PL/SQL块不能再屏幕上显示SELECT语句的输出。SELECT语句必须包括一个INTO子串或者是游标的一部分,执行部分使用的变量和常量必须首先在声明部分声明,执行部分必须至少包括一条可执行语句,NULL是一条合法的可执行语句,事物控制语句COMMIT和ROLLBACK可以在执行部分使用,数据定义语言(Data Definition language)不能在执行部分中使用,DDL语句与EXECUTE IMMEDIATE一起使用或者是DBMS_SQL调用。

执行一个PL/SQL块

SQL*PLUS中匿名的PL/SQL块的执行是在PL/SQL块后输入/来执行,如下面的例子所示:

declare

v_comm_percent constant number:=10;

begin

update emp

set comm=sal*v_comm_percent

where deptno=10;

end

SQL> /

PL/SQL procedure successfully completed.

SQL>

命名的程序与匿名程序的执行不同,执行命名的程序块必须使用execute关键字:

create or replace procedure update_commission

(v_dept in number,v_pervent in number default 10) is

begin

update emp

set comm=sal*v_percent

where deptno=v_dept;

end

SQL>/

Procedure created

SQL>execute update_commission(10,15);

PL/SQL procedure successfully completed.

SQL>

如果在另一个命名程序块或匿名程序块中执行这个程序,那么就不需要EXECUTE关进字。

declare

v_dept number;

begin

select a.deptno

into v_dept

from emp a

where job='PRESIDENT'

update_commission(v_dept);

end

SQL>/

PL/SQL procedure successfully completed

SQL>

控制结构

控制结构控制PL/SQL程序流程的代码行,PL/SQL支持条件控制和循环控制结构。

语法和用途

IF..THEN

语法:

IF condition THEN

Statements 1;

Statements 2;

 ....

END IF

IF语句判断条件condition是否为TRUE,如果是,则执行THEN后面的语句,如果condition为false或NULL则跳过THEN到END IF之间的语句,执行END IF后面的语句。

IF..THEN...ELSE

语法:

IF condition THEN

Statements 1;

Statements 2;

 ....

ELSE

Statements 1;

Statements 2;

 ....

END IF

如果条件condition为TRUE,则执行THEN到ELSE之间的语句,否则执行ELSE到END IF之间的语句。

IF 可以嵌套,可以在IF 或IF ..ELSE语句中使用IF或IF..ELSE语句。

if (a>b) and (a>c) then

g:=a;

else

g:=b;

if c>g then

g:=c;

end if

end if

IF..THEN..ELSIF

语法:

IF condition1 THEN

statement1;

ELSIF condition2 THEN

statement2;

ELSIF condition3 THEN

statement3;

ELSE

statement4;

END IF;

statement5;

如果条件condition1为TRUE则执行statement1,然后执行statement5,否则判断condition2是否为TRUE,若为TRUE则执行statement2,然后执行statement5,对于condition3也是相同的,如果condition1,condition2,condition3都不成立,那么将执行statement4,然后执行statement5。

循环控制

循环控制的基本形式是LOOP语句,LOOP和END LOOP之间的语句将无限次的执行。LOOP语句的语法如下:

LOOP

statements;

END LOOP

LOOP和END LOOP之间的语句无限次的执行显然是不行的,那么在使用LOOP语句时必须使用EXIT语句,强制循环结束,例如:

X:=100;

LOOP

X:=X+10;

IF X>1000 THEN

EXIT;

END IF

END LOOP;

Y:=X;

此时Y的值是1010.

EXIT WHEN语句将结束循环,如果条件为TRUE,则结束循环。

X:=100;

LOOP

X:=X+10;

EXIT WHEN X>1000;

X:=X+10;

END LOOP;

Y:=X;

WHILE..LOOP

WHILE..LOOP有一个条件与循环相联系,如果条件为TRUE,则执行循环体内的语句,如果结果为FALSE,则结束循环。

X:=100;

WHILE X<=1000 LOOP

X:=X+10;

END LOOP;

Y=X;

FOR...LOOP

语法:

FOR counter IN [REVERSE] start_range....end_range LOOP

statements;

END LOOP;

LOOP和WHILE循环的循环次数都是不确定的,FOR循环的循环次数是固定的,counter是一个隐式声明的变量,他的初始值是start_range,第二个值是start_range+1,直到end_range,如果start_range等于end _range,那么循环将执行一次。如果使用了REVERSE关键字,那么范围将是一个降序。

X:=100;

FOR v_counter in 1..10 loop

x:=x+10;

end loop

y:=x;

如果要退出for循环可以使用EXIT语句。

标签

用户可以使用标签使程序获得更好的可读性。程序块或循环都可以被标记。标签的形式是<>。

标记程序块

<>

[DECLARE]

... ... ...

BEGIN

........

[EXCEPTION]

.......

END label_name

标记循环

<>

LOOP

.........

<>

loop

..........

<>

loop

....

EXIT outer_loop WHEN v_condition=0;

end loop innermost_loop;

..........

END LOOP inner_loop;

END LOOP outer_loop;

GOTO语句

语法:

GOTO LABEL;

执行GOTO语句时,控制会立即转到由标签标记的语句。PL/SQL中对GOTO语句有一些限制,对于块、循环、IF语句而言,从外层跳转到内层是非法的。

X :=100;

FOR V_COUNTER IN 1..10 LOOP

IF V_COUNTER =4 THEN

GOTO end_of_loop

END IF

X:=X+10;

<>

NULL

END LOOP

Y:=X;

注意:NULL是一个合法的可执行语句。

嵌套

程序块的内部可以有另一个程序块这种情况称为嵌套。嵌套要注意的是变量,定义在最外部程序块中的变量可以在所有子块中使用,如果在子块中定义了与外部程序块变量相同的变量名,在执行子块时将使用子块中定义的变量。子块中定义的变量不能被父块引用。同样GOTO语句不能由父块跳转道子块中,反之则是合法的。

《OUTER BLOCK》

DECLARE

A_NUMBER INTEGER;

B_NUMBER INTEGER;

BEGIN

--A_NUMBER and B_NUMBER are available here

<>

DECLARE

C_NUMBER INTEGER

B_NUMBER NUMBER(20)

BEGIN

C_NUMBER:=A_NUMBER;

C_NUMBER=OUTER_BLOCK.B_NUMBER;

END SUB_BLOCK;

END OUT_BLOCK;

小结

我们在这篇文章中介绍了PL/SQL的基础语法以及如何使用PL/SQL语言设计和运行PL/SQL程序块,并将PL/SQL程序整合到Oracle服务器中,虽然PL/SQL程序作为功能块嵌入Oracle数据库中,但PL/SQL与ORACLE数据库的紧密结合使得越来越多的Oracle数据库管理员和开发人员开始使用PL/SQL。

1、不安装oracle客户连接oracle 8的方法

请将以下文件拷贝到运行文件所在目录

一、odbc动态库 :

ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll

二、建立extra子目录,将msvcrt.dll文件拷贝到该子目录下

extra/msvcrt.dll

三、oracle动态库及配置文件

tnsnames.ora core35o.dll nasnsnt.dll nauntsnt.dll ncrnt.dll nlnt.dll nlsrtl32.dll nnfdnt.dll nnfnnt.dll nsnt.dll ntnt.dll nttnt.dll ciw32.dll ora73.dll otrace73.dll sqlnet.ora sqltnsnt.dll core35.dll

四、pb动态库

pbvm70.dll pbdwe70.dll pbo7370.dll pbo8470.dll pbodb70.dll libjcc.dll

oracle的客户端不安装让pb连上,我记得以前有帖子的,你可以搜索一下。
具体步骤。
(1).先在某机器上安装好客户端(最好安装在c盘);
(2).复制此客户端oracle目录下的所有文件作为独立的oracle安装文件;
(3).搜索注册表,找到 hkey_local_machine/software/oracle,把此项目及分支全部导出。
(4).打包好你的pb程序,并独立打包好oracle客户端和注册表导出文件。
(5).到干净的客户端,解开两个包,导入注册表文件,然后加入路径支持:
  path=%path%;"c:/ora817/bin"
这样处理,应该没有问题,因为我就是这样快速处理了几十个机器。

若不想搞注册表,你可以在程序中自己写注册表,构成oracle客户端必要的注册表支持,至于路径,手工添加应该不难。

至于oracle客户端那些文件不需要,这个不好说,你可以把那些bin目录下的所有exe删除,oracle document删除(7x兆)

至于定义oracle服务,找到 ora817/net80/admin/tnsname.ora,参照格式,程序中生成一个也不麻烦。

=======================================================
2、在oracle中返回游标结果集

你需要写到一个包中:
create or replace package pag_cs_power as

type c_type is ref cursor;
 
function fun_cs_getdictlist(
  v_dictindex in  varchar2) return c_type;

end pag_cs_power;

函数代码:

function fun_cs_getdictlist(
  v_dictindex in  varchar2) return c_type
     as
        c_cursor            c_type;
begin
   open c_cursor for
      select dictid,dictname from sys_dict where dictindex = v_dictindex;
   return c_cursor;
end fun_cs_getdictlist;
----------------------------------------------------------------------
3、p4机器安装oracle

(1)、将oracle安装软件拷贝到硬盘。
(2)、将  硬盘目录文件/stage/components/oracle.swd.jre/1.1.7.30/1
/datafiles/expanded/jre/win32/bin/symcjit.dll的文件改名为symcjit.old
(3).再运行setup.exe  文件进行安装。

-----------------------------------------------------------------------
4、单引号的插入问题

sql> insert into a values(''i''''m good'');       --两个''''可以表示一个''

sql> insert into a values(''i''||chr(39)||''m good''); --chr(39)代表字符''

sql> insert into a values(''a''||''&''||''b'');     

-----------------------------------------------------------------------
5、全数据库的导入与导出

exp username/password full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y

6、exp与imp的具体用法

exp username/password@mzbs_61 full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y

exp mzbs/mzbs@mzbs_61 file = c:/zzzzzzz.dmp grants = y rows = y
imp mzbs/mzbs@mzbs_61 file = c:/zzzzzzz.dmp grants = y ignore=y  full=y

(1)

exp参数:
关键字   说明(默认)  
----------------------------------------------
userid   用户名/口令
full   导出整个文件 (n)
buffer   数据缓冲区的大小
owner   所有者用户名列表
file   输出文件 (expdat.dmp)
tables   表名列表
compress  导入一个范围 (y)
recordlength  io 记录的长度
grants   导出权限 (y)
inctype   增量导出类型
indexes   导出索引 (y)
record   跟踪增量导出 (y)
rows   导出数据行 (y)
parfile   参数文件名
constraints  导出限制 (y)
consistent  交叉表一致性
log   屏幕输出的日志文件
statistics  分析对象 (estimate)
direct   直接路径 (n)
triggers  导出触发器 (y)
feedback  显示每 x 行 (0) 的进度
filesize  各转储文件的最大尺寸
query   选定导出表子集的子句

imp参数:
关键字   说明(默认)  
----------------------------------------------
userid   用户名/口令
full   导入整个文件 (n)
buffer   数据缓冲区大小
fromuser  所有人用户名列表
file   输入文件 (expdat.dmp)
touser   用户名列表
show   只列出文件内容 (n)
tables   表名列表
ignore   忽略创建错误 (n)
recordlength  io 记录的长度
grants   导入权限 (y)
inctype   增量导入类型
indexes   导入索引 (y)
commit   提交数组插入 (n)
rows   导入数据行 (y)
parfile   参数文件名
log   屏幕输出的日志文件
constraints  导入限制 (y)
destroy   覆盖表空间数据文件 (n)
indexfile  将表/索引信息写入指定的文件
skip_unusable_indexes 跳过不可用索引的维护 (n)
analyze   执行转储文件中的 analyze 语句 (y)
feedback  显示每 x 行 (0) 的进度
toid_novalidate  跳过指定类型 id 的校验
filesize  各转储文件的最大尺寸
recalculate_statistics 重新计算统计值 (n)

(2)

一、建立一个expdata.sql文件

userid=rmtafis/3       这里写你的用户名和密码
buffer=32768
owner=rmtafis         这里写导出的用户
file=e:/exp/rmtafis.dmp      导出的文件,可以是相对路径
rows=y
grants=y
compress=y
consistent=y

二、建立一个expdata.bat
exp parfile=expdata.sql
如果是805
exp80 parfile=expdata.sql
双击expdata.bat就导出数据了

7、如果在like的变量中,是以‘%’开头的话,是不会使用index的。反之,不是以‘%‘开头,而又有相应的index,是会使用index的。具体可以用plain plan来看一下。

8、复制空表结构
   create table new_table
as select * from old_table where 1=2;
   复制表(含记录)
   create table new_table
as select * from old_table ;

9、把一个用户下的表导入到另一个用户下,但需要改名

先用exp导出所有的表;
用imp将导出的表导入到新用户;
在新用户下,执行
  select ''rename table ''||tname||'' to new_''||tname||'';''
    from tab
   where tabtype=''table'';
将上面的查询结果保存到一个sql文件中,处理后执行就可以了。

10、审计步骤

修改参数文件init.ora,参数audit_trail值为true;
 重新启动数据库;
 打开审计audit session; (audit session by username)
 执行登录操作;
 察看审计结果:
   select * from dba_audit_session;
   select * from sys.aud$;
   select * from dba_audit_trail;
   select * from dba_audit_exists;
 关于审计:

为了使oracle8i的审计功能可用,必须在数据库参数文件中修改audit_trail初始参数,而这个修改并不支配oracle8i把生成的审计记录记入审计痕迹中,
由于状态,特权和模式对象已被修改,因而审计的默认值不可用,其参数应设置为none.下面列出了audit_trail 可用的参数

db_使数据库审计和全部直属审计记录到数据库审计的痕迹中
os_是数据库审计依据直属审计记入到操作系统的审计很集中
none_不可用

11、bfile的用法

(1)、create or replace directory
bfile_test
as
''/oracle/oradata/bfiles'';

(2)、grant read on directory bfile_test to scott;

(3)、host ls -l /oracle/oradata/bfiles/1.txt

(4)、connect scott/tiger
create table bfiles (id number, text bfile );

(5)、insert into bfiles values ( 1,
bfilename ( ''bfile_test'', ''1.txt'' ) );

12、如何在windows 2000下将oracle完全卸载?
 
一、系统环境:
(1)、操作系统:windows 2000 server,机器内存128m
(2)、数据库: oracle 8i r2 (8.1.6) for nt 企业版
(3)、安装路径:d:/oracle

二、卸载步骤:
(1)、开始->设置->控制面板->管理工具->服务
   停止所有oracle服务。

(2)、开始->程序->oracle - orahome81->oracle installation products->universal installer
   卸装所有oracle产品

(3)、运行regedit,选择hkey_local_machine/software/oracle,按del键删除这个入口。

(4)、运行regedit,选择hkey_local_machine/system/currentcontrolset/services,滚动这个列表,删除所有oracle入口

(5)、从桌面上、startup(启动)组、程序菜单中,删除所有有关oracle的组和图标

(6)、重新启动计算机,重起后才能完全删除oracle所在目录

(7)、删除与oracle有关的文件,选择oracle所在的缺省目录c:/oracle,删除这个入口目录及所有子目录,

  并从windows 2000目录(一般为c:/winnt)下删除以下文件

  oracle.ini、oradim80.ini

(8)、win.ini文件中若有[oracle]的标记段,删除该段

--------------------------------------------------------------------
13、如何使用sqlplus和svrmgrl运行脚本

(1)、用sqlplus调用:

c:/script.txt的内容
startup;

命令行:sqlplus internal/oracle @c:/script.txt

(2)、用svrmgrl调用:
c:/script.txt的内容

connect internal/oracle;
startup;

命令行:svrmgrl @c:/script.txt

--------------------------------------------------------------------
14、oracle的临时表

create global temporary table tablename (
   col1  varchar2(10),
   col2  number
) on commit preserve(delete) rows ;
这种临时表不占用表空间,而且不同的session之间互相看不到对方的数据
在会话结束后表中的数据自动清空,如果选了delete rows,则在提交的时候即清空数据,preserve则一直到会话结束

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

在oracle8i中,可以创建以下两种临时表:
(1)会话特有的临时表
   create global temporary <table_name> (<column specification>)
   on commit preserve rows;

(2)事务特有的临时表
   create global temporary <table_name> (<column specification>)
   on commit delete rows;
  create global temporary table mytemptable
所建的临时表虽然是存在的,但是你试一下insert 一条记录然后用别的连接登上去select,记录是空的,明白了吧,我把下面两句话再贴一下:
--on commit delete rows 说明临时表是事务指定,每次提交后oracle将截断表(删除全部行)
--on commit preserve rows 说明临时表是会话指定,当中断会话时oracle将截断表。
冲突的问题更本不用考虑.

临时表只是保存当前会话(session)用到的数据,数据只在事务或会话期间存在。

通过create global temporary table命令创建一个临时表,对于事务类型的临时表,
数据只是在事务期间存在,对于会话类型的临时表,数据在会话期间存在。

会话的数据对于当前会话私有。每个会话只能看到并修改自己的数据。dml锁不会加到
临时表的数据上。下面的语句控制行的存在性。
 
● on commit delete rows 表名行只是在事务期间可见
● on commit preserve rows 表名行在整个会话期间可见

可以对临时表创建索引,视图,出发器,可以用export和import工具导入导出表的
定义,但是不能导出数据。表的定义对所有的会话可见。

例如:
create global temporary table temp_tab1(
table_name varchar2(20),
primary_key varchar2(100),
field varchar2(1000))
on commit preserve rows;

create global temporary table temp_tab2(
table_name varchar2(20),
primary_key varchar2(100),
field varchar2(1000))
on commit delete rows;

15、如何使用oem
先启数据库服务,再启oracle manager服务。
否则重建档案资料库
如果还不行就把oraclehome/network/sqlnet.ora文件的内容
     sqlnet.authentication_services=(nts)
     改成sqlnet.authentication_services=(none)

登录 sysman/oem_temp

16、tns:没有监听器的问题。

(1)查一下监听服务是否启动,
   如果没有启动,则运行lsnrctrl start。
(2)查看一下 listener.ora内监听的服务器名、服务器ip、数据库名是否正确。
(3)查看一下 tnsnames.ora内服务器名、服务器ip、数据库名是否正确。

17、linux、unix下自动启动oracle服务

(1)

!/bin/sh

# chkconfig: 345 51 49
# description: starts the oracle dabase deamons
#

ora_home=/u01/app/oracle/product/8.1.7
ora_owner=oracle
case "$1" in
''start'')
echo -n "starting oracle8i: "
su - $ora_owner -c $ora_home/bin/dbstart
touch /var/lock/subsys/oracle8i
echo
;;

''stop'')

echo -n "shutting down oracle8i: "
su - $ora_owner -c $ora_home/bin/dbshut
rm -f /var/lock/subsys/oracle8i
echo
;;

''restart'')

echo -n "restarting oracle8i: "
$0 stop
$0 start
echo
;;

*)
echo "usage: oracle8i { start | stop | restart }"
exit 1

esac
exit 0

我仿照su - $ora_owner -c $ora_home/bin/dbshut 的形式
添加su - $ora_owner -c $ora_home/bin/lsnrctl start
但是在系统启动的时候listener启动不了

(2)

/etc/rc.local
改成如下就可以了
touch /var/lock/subsys/local
#echo 2147483648 > /proc/sys/kernel/shmmax
echo -n "starting oracle database:"
date +"%d %t %a"
su - oracle -c "lsnrctl start"
#su - oracle -c "sqlplus /nolog @startmaster.sql"
echo -n "oracle database started:"
date +"%d %t %a"
-------------
第一个#是改共享内存大小的
第二个#是启动数据库的。

(3)
ftp://ftp.rpmfind.net/linux/rhcontrib/7.1/i386/oraclerun9i-1.0-1.i386.rpm

下载这个软件包并安装。

里面每个文件都有一些要修改的地方。配置完成之后,就可以在系统服务配置中找到它,选中它就可能以自启动了。

18、回滚段不够的处理方法

(1)、先使回滚段脱机一个,
如果不好用,则再脱机一个。直至好用。
   alter rollback segment rollbackname offline;
(2)、增加回滚段数据文件的大小
   alter database datafile ''datafile'' resize 200m;

19、winnt向win2000移植

不用exp和imp的

停掉数据库的服务后,可以做一个数据库的全备份。

在win2000上建一个同名的数据库,随便建,越小越好,可以缩短时间。
把winnt下的数据库备份恢复到win2000的数据库上就可以了。但建库的目录
必须一样。(也可以不一样,但需要更改数据文件的连接)

我曾多次为用户这样移植数据,万无一失的。
注意:因为数据很重要,所以建议你先exp备份一下。这是我们的习惯。

20、oracle sql plus worksheet乱码问题。

dbappscfg.properties,修改该文件即可解决上述问题。$oracle_home/sysman/config目录下,修改
# sqlplus_nls_lang=american_america.we8iso8859p1
为sqlplus_nls_lang=american_america.zhs16gbk。

对于windows操作系统,还需要修改一项
#sqlplus_systemroot=c://winnt40
为sqlplus_systemroot=c://winnt

如操作系统的主目录在c盘的winnt下

对于后面一项的修改只对windows操作系统进行,对unix操作系统则不需要。如果在windows操作系统中不修改该项,在oracle enterprise manager中,连接系统时,会提示如下的错误:
ora-12560 tns:protocol adapter error
或者
ora-12545 connect failed because target host or object does not exist
重新连接sql plus worksheet
21、drop掉名字是小写的表(用双引号括起来)。
    drop table "tablename"
    select * from "tablename"

22、日期的显示格式
注意:simplified chinese(简体中文需要" "括起来)
      别的国家不用" " 例如:english
select to_char(sysdate,''day'',''nls_date_language=''''simplified chinese'''''') from dual;
------------
星期四
------------

23、一个从oracle中读表信息的存储过程

可以在vc下调用存储过程来实现
例子:
先修改init.ora
例如:
utl_file_dir=/usr    //路径为 oracle所在的盘:/usr
此过程将用户temp的p1过程的代码保存到oracle安装盘下/usr/text.txt中
create or replace procedure test
is
  file_handle utl_file.file_type;
  stor_text varchar2(4000);
  n number;
i number;
 begin
i:=1;
   select max(line) into n from all_source where owner=''temp'' and name=''p1'';
file_handle:=utl_file.fopen(''/usr'',''test.txt'',''a'');
while i<=n loop
   select text  into stor_text from all_source where owner=''temp'' and name=''p1'' and line= i;
   i:=i+1;
   utl_file.put_line(file_handle,stor_text);
end loop;
   utl_file.fclose(file_handle);
commit;
end test;
/

24、关于修改oracle的列宽
(1)、不论如何都要备份数据。
(2)、如果没有数据,则可以修改宽度。比如number,char,varchar2
(3)、如果有数据,则可以增加宽度。比如number,char,varchar2
   注意:不可以减小宽度。
(4)、语法:alter talbe tablename modify columnname columntype not null;

25、如何查看用户的存储过程和函数

select name,text from user_source where name= procedurename and type = ''procedure'' order by line;

26、在批处理中自动启动oracle服务(win2000)

编一个批处理文件
net start oracleservicesid
oracleservicesid是oracle的实例名称

27、对行加锁时,只对tb1加锁

select tb1.r1 from tb1, tb2  where tb1.r2 = tb2.r2 and tb2.r1 = xxx for update of tb1.r1 nowait

28、得到列的信息

desc tablename
select cname from col where tname=''tablename'';
select column_name from user_tab_columns where table_name=''tablename'';
select column_name from all_tab_columns where table_name=''tablename'';
select column_name from dba_tab_columns where table_name=''tablename'';
select column_name from user_col_comments where table_name=''tablename'';   
select column_name from all_col_comments where table_name=''tablename'';
select column_name from dba_col_comments where table_name=''tablename'';

29、使触发器无效(login_on)

svrmgrl
connect internal/oracle
alter trigger login_on disable;

使触发器为无效alter trigger yourtriggername disable

如果是对于某一个表的所有的触发器:
alter table yourtablename disable all triggers

30、如在sqlplus中何调用存储过程和函数。

call只能调用存储过程后面加上括号就可以了
    call 存储过程名();
    exec procedurename;(可以不加())
    调用函数用sql语句
    select 函数名(参数) from dual;

31、函数中如果调用dml语句就不可以调用select语句

32、redo log buffer 什么时候写到redo logfile中
    (1)、在commit的时候
    (2)、重做日志缓冲区1/3满的时候
    (3)、重做日志缓冲区大于1m的时候
    (4)、它写信息必须是在数据写进程前调用
    (5)、一般checkpoint在日志组切换的时候进行或者由初始化参数设定
         在checkpoint的时候需要调用数据写进程

33、oracle的http server 把原有的web server冲掉,如何解决?

(1).如果你原来的http server是用iis等其他发布工具做的,那么可以在服务中停掉         oracle http server服务,并且改为手动启动。
    (2).如果原来的http server是用apache发布,则可以改变http.conf中的参数

34、关于创建重建查看索引

创建索引:
create index ind_name on table_name(col1,col2,...);

重建索引:
alter index ind_name rebuild;

查看索引:

select * from user_indexes where index_name=''ind_name'';

35、oracle如何查杀用户的进程
 
   一|根据用户的应用程序和sql语句,在dba studio找到用户的session并断开其连接
 
   二、
  
   (1)、要杀掉一个session应先应知道其sid和serial#,假设你已经知道。
   (2)、select paddr from v$session where sid=v_sid and serial#=v_serial#
   select spid from v$process where addr=paddr(以上语句所查出的);

(3)、使用alter system kill session ''v_sid,v_serial#'' immediate; 试一试如不行转   
  
   三、linux和unix下
   转到操作系统下执行:kill -9 spid (以上语句所查出的) 
  
36、oracle中检查表是否被锁的语句

select a.owner,  
         a.object_name,  
         b.xidusn,  
         b.xidslot,  
         b.xidsqn,  
         b.session_id,  
         b.oracle_username,  
         b.os_user_name,  
         b.process,  
         b.locked_mode,  
         c.machine,  
         c.status,  
         c.server,  
         c.sid,  
         c.serial#,  
         c.program 
    from all_objects a,  
         v$locked_object b,  
         sys.gv_$session c
   where ( a.object_id = b.object_id )
     and (b.process = c.process )
   order by 1,2    
杀掉:alter system kill session ''sid, serial#''
37、oracle的登录问题,用户名和密码。

可以直接输入:
    internal/oracle@serivce_name
  sys/change_on_install@serivce_name
  system/manager@serivce_name
  scott/tiger@serivce_name
注意:
9i中没有internal/oracle
如果选择典型安装则有 scott用户
如果自定义可以不安装  scott用户
如果是本机则可以省略@serivce_name

oem:(oracle enterprise manager)
sysman/oem_temp

38、修改表的列名

oracle9i:
alter table xxx rename column xx to yy;

oracle8i & lower version
connect sys/passed;
update col$ set name=xx where obj#=对象id and name = 字段
(一般不要这样用,会造成意想不到的结果)
注:最好是删除再建立新的列

39、把用户模式对象所在的表空间移到新的表空间
(1). create the new tablesapce
(2). alter user test default tablespace test_data;
(3). alter user test quota unlimited on test_data;
(4). alter table the_table_name move tablespace test_data;
    生成脚本:
    select ''alter table''||tname||'' move tablespace test_date;''
    from tab
   where tabtype=''table''
(5). rebuild the indexes;

40、使用oem备份或者exp的步骤
 win2000下:

(1). 控制面板――>管理工具―― >计算机管理――>本地用户和组――>用户――>新建用户sys和sysman(sys和sysman 的帐号要和登陆数据库的帐号相同);
(2).控制面板――>管理工具―― >本地安全策略――>本地策略――>用户权利指派――>
作为批处理作业登陆――>添加sys和sysman两个帐号。
(3).使用enterprise manager配置辅助工具
开始→程序→oracle - orahome81→enterprise manager→configuration assistant
a、使用configuration assistant工具来创建一个新的资料档案库。

(4).控制面板――>管理工具―― > 服务,查看oracleorahome81managementserver是否启动,如果没有启动,则手动启动该服务。
(5).以sysman/oem_temp(default)登陆dba studio
(第二个选项:登陆到oracle management server),立即修改密码为你刚才在nt下建的用户sysman的密码。
(6). 以sysman/ *** (bluesky) 从开始→程序→oracle - orahome81→console 登陆到 控制台。
在 系统→首选项→首选身份证明(我的首选身份设置如下:)
default节点:name:sysman
default数据库:name:sys
(7). 在搜索/添加结点后,以sysman/ *** 登陆到该结点,以sys/ *** as sysdba登陆数据库(也就是在首选身份设置的结果)。
(8). 在工具→备份管理→向导→预定义备份策略(自定义备份策略)→提交备份计划
(9).从开始→程序→oracle - orahome81→console 登陆到 控制台,查看活动(历史记录)可以看到你的备份是否成功,如果不成功,可以点击备份看明细。(我第一次也没成功,后来我修改系统的临时目录c:/winnt/temp→c:/temp/systmp,重新启动机器就ok了)
41、如何修改internal的口令
 
以下是oracle8的8i你可以仿照来做

(1)、进入dos下

(2)、默认internal密码文件在c:/orant/database下,是隐藏属性,文件名称与数据库实例名有关

  如默认oracle实例名为orcl,则internal密码文件名为pwdorcl.ora

(3)、建立新的internal密码文件,起个新名字为pwdora8.ora

  orapwd80 file=pwdora8.ora password=b entries=5     --注:password项一定要用大写,并且不要用单引号

(4)、拷贝pwdora8.ora文件到c:/orant/database目录下

(5)、运行regedit,修改口令文件指向

(6)、找到hkey_local_machine/software/oracle项

  定位ora_orcl_pwfile子项,改变其值为c:/orant/database/pwdora8.ora

(7)、关闭oracle数据库,重新启动

(8)、进入svrmgr30服务程序,测试internal密码是否更改成功

42、凭证检索失败的决绝方法。

原因: 由于oracle不能应用os认证而导致凭证检索失败
   
解决办法:
   
    (1).打开network/admin下的sqlnet.ora
        修改sqlnet.authentication _services=(none)。
   
    (2).启动net8 configuration assistant-->选第三项本地网络服务名配置
    -->删除...(删除原来的本地网络服务名)

(3).重复第二步
    -->添加.. (新建本地网络服务名)

(4).restart oracle
  
    注意:nts是winnt的认证方式

43、命令行编译存储过程

alter procedure procedure_name compile;

44、关于如何建立数据库链接(dblink)

可以通过建立客户机数据库网络服务名的办法,将服务器的名字或是ip地址设置为你需要连接的那个机器就行

如果你要在一个应用中连接它,现在做好上步工作,然后按如下处理

建立数据库连接
create database link dbaselinkname connect to username identified by password using ''netservicename'';
dbaselinkname  是建立的数据连接名称
username       是可以连接到的用户名
password        是可以连接到的用户的密码
netservicename  是可以连接的数据库网络服务名或是数据库名

查询建立数据连接的表实例
select * from tablename@ dbaselinkname;

注意:如果在create database link dbaselinkname connect to username identified by password using ''netservicename'';中netservicename  是数据库名修改init.ora中:global_names = true
否则global_names = false
init.ora中:global_names = false
 
45、object browser7.0中文版的破解方法

到object browser的目录里,找到deisl1.isu文件,用记事本打开,看到的是乱码吧?没关系,将stirling technologies ,inc 这个字符串前面的乱码去掉(如果有的话),让后在stirling之前加一个空格(一定要加的),保存,退出,重新运行一下看看,虽然还有提示输入验证信息,但是不用管他,直接确定就行。是不是可以用了呢?保证好使。

46、错误号ora-01536:space quota exceeded for table space ''alcatel''的解决办法
    
     三个解决办法,任你选择:
    (1) alter user username quota 100m on tablespacename;
    (2) alter user username quota unlimited on tablespacename;
    (3) grant unlimited tablespace to username;

47、如何在oracle中捕获到sql语句的全部操作内容

select osuser, username, sql_text from v$session a, v$sqltext b
       where a.sql_address =b.address order by address, piece;

48、oracle中如何实现自增字段:

(1)第一种方法
oracle一般的做法是同时使用序列和触发器来生成一个自增字段.
create sequence seqname
 increment by  1
 start with  1
 maxvalue  99999999
/
create trigger trgname
before  insert  on table_name
referencing
 new as :new
for each row
begin
   select seqname.nextval
     into :new.fieldname
     from dual;
end;

(2)第二种方法:
create or replace trigger tr1
  before insert on temp_table
  for each row
declare
com_num number;
begin
select max(id) into com_num from temp_table;
:new.id:=com_num+1;
end tr1;

49、job的使用:

修改initsid.ora参数
job_queue_processes = 4            8i,9i  (允许同时执行的job数)
job_queue_interval = 10            8i 
job_queue_keep_connections=true       8i

dbms_job.submit(:jobno,//job号
                ''your_procedure;'',//要执行的过程
                trunc(sysdate)+1/24,//下次执行时间
                ''trunc(sysdate)+1/24+1''//每次间隔时间
               );
删除job:dbms_job.remove(jobno);
修改要执行的操作:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);

注意:修改后一定要commit;

例子:
variable jobno number;
begin
      dbms_job.submit(:jobno,
              ''procdemo;'',//procdemo为过程名称
               sysdate, ''sysdate + 1/720'');
         commit;
end;

50、如何配置mts

修改初始化参数文件
增加以下内容:
mts_dispatchers = "(protocol=tcp)(disp=2)(con=1000)"
mts_max_dispatchers = 50
mts_servers = 20
mts_max_servers = 50

51、取出一个表的最后一条记录

select * from (select rownum id,tname.* from tname) a where a.id=(select count(*) from a);

52、重做日志(redolog)被删掉,通过什么方法才能恢复!

先mount数据库,然后再目录下建同名文件redo01.log、redo02.log、redo03.log
然后执行alter databse clear logfile group n
对于current的group,执行alter databse clear unarchived logfile group n
然后,再open,就ok了

53、oracle常见服务

几个主要的:

oracleorahome81tnslistener     监听服务
oracleservicesid               oracle服务
oracleorahome81agent           智能代理服务
oracleorahome81cman            连接管理服务
oracleorahome81httpserver      apache web 服务
oracleorahome81managementserver oracle 企业管理器服务
oracleorahome81names            oracle命名服务

剩下的也不常用。

54、oracle的热备份

在不关闭数据库的时候进行oracle的备份。

原理停复杂的,你去找本书看看吧。

举个简单的例子:备份表空间users

alter tablespace users begin backup
copy users tablespace 的数据文件到备份目录
alter tablespace users end backup

55、导致索引不起作用的解决办法

你的问题我刚处理过,是由optimizer_mode参数引起的,该参数的默认值为choose,即为如表有statis则查询走基于cost的方式,否则走基于rule的方式,因些你可以有以下几个解决方法。
(1)、简单的在init<sid>.ora中设optimizer_mode=rule,重起数据库。
(2)、使用analyze table table_name(索引基表) delete statistics;
(3)、最后一个万能办法,将表和索引drop掉,重建。

56、关于数据库进程的问题。

(1).查看相关进程在数据库中的会话
select a.sid,a.serial#,a.program, a.status ,
substr(a.machine,1,20), a.terminal,b.spid
from v$session a, v$process b
where a.paddr=b.addr
and b.spid = &spid;

(2).查看数据库中被锁住的对象和相关会话
select a.sid,a.serial#,a.username,a.program,
c.owner, c.object_name
from v$session a, v$locked_object b, all_objects c
where a.sid=b.session_id and
c.object_id = b.object_id;

(3).查看相关会话正在执行的sql
select sql_text from v$sqlarea where address =
( select sql_address from v$session where sid = &sid );

57、查看ip地址
select sys_context(''userenv'',''ip_address'')  from dual;

58、运行sqlplus时不用输入用户名和密码,进入之后使用connect
            
        sqlplus /nolog
        sql>connect scott/tiger

59、查看当前会话

userenv() 函数

select userenv(''language'') from dual 字符集
        select userenv(''isdba'') from dual 是否dba
        select userenv(''sessionid'') from dual sessionid
        select userenv(''terminal'') from dual 客户端名字
        select userenv(''instance'') from dual 实例数

sys_context() 函数
    
        select sys_context(''userenv'',''current_schema'')  from dual;  当前模式
        select sys_context(''userenv'',''current_schemaid'')  from dual;  当前模式id
        select sys_context(''userenv'',''current_user'')  from dual; 当前用户 
        select sys_context(''userenv'',''db_name'')  from dual; 数据库
        select sys_context(''userenv'',''host'')  from dual; 主机
        ..........

60、删除重复列的方法

(1) delete from table_name a where rowid > (
       select min(rowid) from table_name b
        where a.key_values = b.key_values);
(2) create table table2 as select distinct * from table1;
     drop table1;
     rename table2 to table1;
(3) delete from mytable where rowid not in(
       select max(rowid) from mytable
       group by column_name );
(4) delete from mytable t1
      where  exists (select ''x'' from my_table t2
                   where t2.key_value1 = t1.key_value1
                     and t2.key_value2 = t1.key_value2
                     ...
                     and t2.rowid > t1.rowid);
61、ora-12571: tns:packet writer failure(包写入程序失败)

(1) 这个错误在客户端遇到过,通常重新连接一下服务器就好了。
   服务器重新启动的时候,在client也会遇到该错误。
   这个错误你是在server还是client上遇到的?最常用的办法就是加上跟踪,查看一下    跟踪记录,分析分析错误的原因。
   网络问题也会出现该错误,比如网络路由没有配置好。
   (2) 安装的杀毒软件导致的
   (3) 服务器端的ip是否被改动
   (4) 最后不行的话,重新创建监听器
   
62、oracle服务不能自动启动的解决办法

把oraclehome/network/admin/sqlnet.ora
   文件中的 sqlnet.authentication_service=(nts)
   注释掉就可以了

63、不完全的时间点恢复

shutdown immediate
copy 备份文件到需要恢复的目录下
startup mount
recover database until time ''2002-12-26 09:00:00''

alter database open resetlogs

自己仔细检查一下,不会发生这样的问题的。

64、oracle如何设置查询超时

select  /*+  timeout  30*/  *  from  verylargetable

65、修改字符集

(1)、alter databae character set simplified chinese_china.zhs16gbk ;

(2)、update props$ set value$=''zhs16cgb231280''
where name=''nls_characterset'';
update props$ set value$=''zhs16cgb231280''
where  name=''nls_nchar_characterset'';

建议不使用(2)

注意:
(1)、执行alter database character set必须有sysdba权限,并且在startup restrict模式下执行
(2)、原字符集必须是目标字符集的一个真子集(就是浪子所说的只能从we8iso8859p1转到zhs16gbk的原因)
(3)、clob字段装换可能有问题,建议在转换以前把有clob字段的表导出后drop,转换以后再导回
(4)、该转换不可逆,所以在做这个操作以前建议做数据库全备份

66、修改数据库名字

(1)、启动svrmgrl,以文本方式备份控制文件
 oracle>svrmgrl
 svrmgrl>connect internal
 svrmgrl>alter system backup controlfile to trace
(2)、编辑产生的跟踪文件,在udump目录下
 改create controlfile reuse database "ctc" noresetlogs archivelog
 中的reuse为set
 然后把create controlfile这段语句拷出
(3)、正常宕库,后启动到nomount下
 svrmgrl>shutdown immediate
 svrmgrl>startup nomount
(4)、执行create controlfile那段语句
(5)、打开数据库
 svrmgrl>alter database open
 如提示用resetlogs选项则使用
  svrmgrl>alter database open resetlogs
(8)、相应修改初始化参数

67、rownum的用法

select * from (select t.*,rownum id from dept t)
   where id between 1 and 20

68、oracle的内部参数

select a.ksppinm name,
       b.ksppstdf default_val,
       a.ksppdesc description
  from x$ksppi a,
       x$ksppcv b
 where a.indx=b.indx
   and substr(a.ksppinm,1,1)=''_''
 order by a.ksppinm

69、9i安装时报areasqueries错误的解决办法
    包括ias 和 ids
   
    把安装源文件目录全部改为英文字母或数字
    注意:不能是中文的路径

70、我如何知道一个表空间还有多少可以用

(1)、
select upper(f.tablespace_name) 表空间名,
       d.tot_grootte_mb "表空间大小(m)",
       d.tot_grootte_mb - f.total_bytes "已使用空间(m)",
       round((d.tot_grootte_mb - f.total_bytes) / d.tot_grootte_mb * 100,2) "使用比",
       f.total_bytes "空闲空间(m)",
       f.max_bytes "最大块(m)"
 from     
    (select tablespace_name,
            round(sum(bytes)/(1024*1024),2) total_bytes,
            round(max(bytes)/(1024*1024),2) max_bytes
      from sys.dba_free_space
     group by tablespace_name) f,
    (select dd.tablespace_name, round(sum(dd.bytes)/(1024*1024),2) tot_grootte_mb
      from   sys.dba_data_files dd
      group by dd.tablespace_name) d
where d.tablespace_name = f.tablespace_name   
order by 4 desc
(2)、select tablespace_name,round(sum(bytes)/1024/1024,2) "m" from dba_free_space
group by tablespace_name

71、creck pl/sql developer 的方法

(1)、安装pl/sql developer
(2)、用ultraedit将程序plsqldev.exe打开
(3)、将ultraedit设置为16进制模式
(4)、查找串:ba 1e 00 00 00 2b d0
   修改:2b d0  为:4a 90
(5)、存盘退出
(6)、运行plsqldev.exe,如果提示你还有29天的时间可用,那就恭喜你了!

72、使索引无效

alter index idx unusable;
alter index idx_acctno disable;(only to a function based index)

73、在sqlplus中给指定用户进行 set autotrace on/off
   
    以scott用户为例:

sql>connect scott/tiger
   
    connected.
   
    sql>@$oracle_home/rdbms/admin/utlxplan.sql
   
    table created.
   
    sql>connect / as sysdba
   
    connected.
   
    sql>@$oracle_home/sqlplus/admin/plustrce.sql
   
    drop role plustrace;
    role dropped.
    create role plustrace;
    role created.
    .
    grant plustrace to dba with admin option;
    grant succeeded.

sql>grant plustrace to scott;

grant succeeded.

sql>connect scott/tiger

connected.

sql>set autotrace on

sql>

74、关于约束的四种状态

disabled novalidate:当约束使不能时,约束的规则不能强制在列
       (包含在约束中)的数据之上。但约束的定义保存在数据字典中。
       在执行数据仓库卷起(rollup)或装载且要加快装载过程时该方式
       是有用的。
enabled novalidate:是能无效,该状态的表可以包含非法
      的数据,但不可能加入新的非法数据。
enabled validate:使能有效,一个使能的约束是强制的,表的数据检查
      有效

75、在sqlplus中调用存储过程

set serveroutput on
declare
 out_param varchar2(100);
begin
 your_proc(1,out_param);
 dbms_output.put_line(out_param);
end;
/
set serveroutput off

75、生成系统表和存储过程的三个文件。

cat*.sql
     dbms*.sql
     utl*.sql

76、job中日期的使用

每个月1号:
last_day(sysdate)+1
每个季度的第一天:
to_date(decode(to_char(sysdate,''q''),''1'',to_char(sysdate,''yyyy'')||''0101'',
    ''2'',to_char(sysdate,''yyyy'')||''0401'',''3'',to_char(sysdate,''yyyy'')||''0701'',
    ''4'',to_char(sysdate,''yyyy'')||''1001''),''yyyymmdd'')
每天:
sysdate+1
每个星期几:
decode(to_char(sysdate,''w''),''1'',sysdate+7,
to_char(sysdate,''w''),''2'',sysdate+6,to_char(sysdate,''w''),''3'',sysdate+5,
to_char(sysdate,''w''),''4'',sysdate+4,to_char(sysdate,''w''),''5'',sysdate+3,
to_char(sysdate,''w''),''6'',sysdate+2,to_char(sysdate,''w''),''7'',sysdate+1)

每个星期x下午三点:interval(21, ''next_day(trunc(sysdate),x+1)+15/24'');

每个季度的第一个星期x:
interval(21, ''next_day(trunc(sysdate,''''q''''),3),5)'');

77、使用execute immediate 的问题

8i以上才支持execute immediate
8.05只能用dbms_sql 
最好使用execute immediate

78、oracle9i中删除表空间中数据文件的方法
 
drop tablespace tbsname including contents

79、找出串中的数字

select translate(''2krw229'',
   ''0123456789abcdefghijklmnopqrstuvwxyz'',''0123456789'')
   "translate example"
     from dual
/

2229

--全是数字的:
select * from 你的表 where translate(你的列,''0123456789'','' '')='''';

select * from 你的表 where trim(ltrim(rtrim(replace(col_name,''0123456789'','' '')))) is null

80、分析表
analyze table mzbs.db_code estimate statistics sample 20 percent;

81、表空间管理和用户管理

--查看表空间和数据文件

select file_name,tablespace_name,autoextensible from dba_data_files;

--数据表空间

create tablespace user_data
    logging
    datafile ''d:/oracle/oradata/orcl/test.dbf'' size 50m reuse ,
             ''c:/users01112.dbf'' size 50m reuse 
    autoextend
    on next  1280k maxsize  16383m extent management local

--临时表空间

create temporary
    tablespace  user_data_temp tempfile ''d:/temp0111.dbf''
    size 50m reuse autoextend
    on next  1024k maxsize  16383m extent management local uniform
    size 1024k

--增加数据文件

alter tablespace  user_data
  add datafile ''c:/users01113.dbf'' size 50m;

alter tablespace user_data
  add datafile ''c:/users01114.dbf''  size 50m
  autoextend on
;

--删除表空间

drop tablespace user_data including contents;

--修改数据文件大小
 a

ORACLE甚而,PL/SQL基础相关推荐

  1. Oracle 原理: PL/SQL基础

    一.PL/SQL 功能和特点 PL/SQL 是过程语言(Procedural Language)和结构化查询(SQL)语言结合而成的编程语言:PL/SQL是SQL的扩展,支持大对象.集合类型.还可以给 ...

  2. Oracle的PL/SQL编程前奏之基础技能实战一(匿名子程序)

    Oracle的PL/SQL编程之基础技能实战一 一>基础代码检查检查以bm_开头的系统初始化编码表是否有空值.与业务系统相关的编码项不能存在空值,会导致系统业务无法办理.为初始化数据表.在做测试 ...

  3. Oracle PL/SQL基础知识

    Oracle PL/SQL基础知识 过程(存储过程) 过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out).通过在过程中使用输入参数,可以将数据传递到执行部分 ...

  4. oracle空间数据库实验报告,Oracle数据库实验报告六 PL/SQL基础

    Oracle数据库实验报告六 PL/SQL基础 -by QQC from BTBU [实验目的] PL/SQL的安装网上有很多教程这里就不做赘述了,如果后序需求大的话我再考虑做一期PL/SQL安装使用 ...

  5. Oracle PL/SQL基础语法学习13:比较运算符

    系列文章目录 Oracle PL/SQL基础语法学习12:短路求值 Oracle PL/SQL基础语法学习13:比较运算符 Oracle PL/SQL基础语法学习14:BOOLEAN表达式 文章目录 ...

  6. oracle 12c sql图形化,Oracle 12c PL/SQL程序设计终极指南

    Oracle 12c PL/SQL程序设计终极指南 作者:孙风栋;王澜;郭晓惠 出版日期:2015年06月 文件大小:11.73M 支持设备: ¥60.00在线试读 适用客户端: 言商书局 iPad/ ...

  7. PL/SQL基础之DECLARE部分(整理)

    整理于 Oracle PL/SQL编程详解 - 古立 - 博客园 PL/SQL基础之DECLARE部分整理 PL/SQL块的结构 声明规范 标识符 数据类型 定义记录类型语法: 定义VARRY数据类型 ...

  8. Oracle之PL/SQL编程从入门到精通-文心-专题视频课程

    Oracle之PL/SQL编程从入门到精通-23941人已学习 课程介绍         本课程基于Oracle数据库,讲解PL/SQLl编程方面的技能,通过本课程的学习,学员能在短的时间内掌握Ora ...

  9. oracle导入dmp报无效的sql,oracle施用pl/sql导入数据库备份文件dmp导入失败原因

    oracle使用pl/sql导入数据库备份文件dmp导入失败原因 利用PL/SQL导入数据库备份失败: Tools→Import →Tables Import Executable选择导入工具路径 D ...

最新文章

  1. gcc 复杂结构体 初始化_gcc编译选项
  2. vue绑定数据之前 会看到源代码
  3. python中的列表是采用链式结构实现的_Python数据结构与算法之列表(链表,linked list)简单实现...
  4. ElasticStack系列之八 _source 字段
  5. Exception in thread main java.time.format.DateTimeParseException: Text '31-Dec-13' could not be pa
  6. android icon命名规则,安卓手机的APP图标尺寸规范和图标命名规范
  7. C++:派生类中的构造函数问题
  8. 谷歌浏览器如何启用java小脚本_各种浏览器开启JavaScript脚本方法
  9. virtuaBox 连接不上解决办法
  10. 1.1 矩阵与线性方程组-矩阵的基本运算
  11. oracle查询语句转sql,将sql server查询语句转换为oracle查询语句[紧急]
  12. CCF CSP认证201509-1数列分段
  13. 元宇宙PlatoFarm万众瞩目,同时登录HUOBI等全球四大平台
  14. 用Python做一个Mean Rerversion策略
  15. dhtml gantt所有配置_Dhtmlx-Gantt基本用法
  16. Android推送的群魔乱舞
  17. CTF SSTI模板注入详解
  18. Unity3D优化技巧系列一
  19. 比特数据结构与算法(第二章收尾)带头双向循环链表的实现
  20. 员工管理系统(图形界面带数据库 )

热门文章

  1. nyoj304节能(区间dp)
  2. 申请一年期免费的Office 365企业版E3开发者账户
  3. 满记甜品“联姻”小满茶田,老品牌寻觅翻红之道
  4. 科普:什么是ChatGPT?
  5. 联合金投P9办公自动化解决方案[1]
  6. 2021 最好学科排名发布,计算机专业清华第一,其他学科的呢?
  7. 新思创OA办公自动化解决方案
  8. 谷歌卫星地图下载器有哪些那款好用
  9. 超级壁纸android,超级壁纸大全app下载-超级壁纸大全 安卓版v1.1.0-PC6安卓网
  10. 互联网早报 | 小米11正式发布;东风启辰重回东风日产旗下;作业帮完成新一轮超16亿美元融资...