exp导出表名为小写的表

Posted by 老熊 on 7月 20th, 2008

由于ORACLE默认的表名都是不区分大小写,在创建表时,在数据字典中存储的表名为大写。在有些情况下,如果创建的表在表名上加上双引号("),则创建的表其表名在数据字典中不作转换。比如

create table test1."Table1" as select * from dba_objects where rownum<=10;

表已创建。

select table_name from dba_tables where owner=’TEST1′;

TABLE_NAME
------------------------------------------------------------
T1
T2
Table1
tt

 

可以看到刚创建的Table1表在数据字典中为"Table1"而不是TABLE1

在导出这样的表时,按用户导出是没有问题的:

exp test1/test1 wner=test1

. 即将导出 TEST1 的表通过常规路径 …
. . 正在导出表 T1 0 行被导出
. . 正在导出表 T2 0 行被导出
. . 正在导出表 Table1 10 行被导出
. . 正在导出表 tt 10 行被导出

而要单独导出表的话,则需求作特殊处理

exp test1/test1 tables=Table1

即将导出指定的表通过常规路径 …
EXP-00011: TEST1.TABLE1 不存在
导出成功终止,但出现警告。

将table1用双引号或单引号引起也是一样

exp test1/test1 tables=\"Table1\"

也是一样的结果

用下面的写法可以成功

exp test1/test1 tables=’\"Table1\"’

即将导出指定的表通过常规路径 …
. . 正在导出表 Table1 10 行被导出
在没有警告的情况下成功终止导出。

用参数文件时,由用tables=’"Table1"’,去掉反斜杠

注意tables=’\"Table1\"’这里是外面一个单引号加反斜杠再加一双引号

oracle对JOB失败的处理

Posted by 老熊 on 7月 20th, 2008

在job执行过程中,all_jobs中,this_date和this_sec记录本次开始执行的时间。next_date和next_sec则在开始执行时按interval计算好。执行完成后,无论失败与否,last_date和last_sec为上次执行(也即刚执行过)开始的时间。next_date和next_sec为下次开始执行时间。

如果执行失败,failures字段加1,同时下次执行时间为本次执行时间+2分钟(不知这两分钟从何而来,有空再研究一下),如果再次失败,由下次执行的时间为上次开始执行时间+4,再次失败则+8,以此类推。

执行成功后,failures字段清0.

引用远程数据库对象值得注意的问题

Posted by 老熊 on 7月 19th, 2008

在同一个数据库内,被引用对象上进行了alter、drop等操作,该对象的依赖对象如view、function、procedure等,状态会自动标记为Invalid,再重新使用这些依赖对象时,系统会自动重新compile。

而一个数据库内的对象引用了远程数据库的对象(这里指程序对象,如procedure等),则远程数据库对象发生了变更,由于本地数据库并不知晓此种情况,本地数据库的这些对象状态仍然为valid,在调用这些对象时,Oracle会根据remote_dependencies_mode参数值,确定采用timestamp或signature进行依赖性检查。如果发现不匹配,则会直接报错返回,同时将依赖该远程对象的所有本地对象标记为invalid。

通过以下测试可以进行验证

先在远程数据库上创建一个测试存储过程

SQL> create or replace procedure p_r_test
2 is
3 begin
4 null;
5 end;
6 /

Procedure created

然后在本地数据库上创建两个测试存储过程

create or replace procedure p_test1
is
begin
p_r_test@testlink
end;

/

create or replace procedure p_test2
is
begin
p_r_test@testlink
end;

/

执行一下测试程序过程

SQL> exec p_test1;

PL/SQL procedure successfully completed

查看这两个存储过程的状态

SQL> select object_name,object_type,status from all_objects where object_name in (’P_TEST1′,’P_TEST2′);

OBJECT_NAME                    OBJECT_TYPE        STATUS
------------------------------ ------------------ -------
P_TEST1                        PROCEDURE          VALID
P_TEST2                        PROCEDURE          VALID

在远程数据库上重新create or replace一下程储过程,再查看本地数据库两个存储过程的状态

SQL> select object_name,object_type,status from all_objects where object_name in (’P_TEST1′,’P_TEST2′);

OBJECT_NAME                    OBJECT_TYPE        STATUS
------------------------------ ------------------ -------
P_TEST1                        PROCEDURE          VALID
P_TEST2                        PROCEDURE          VALID

执行存储过程p_test1

SQL> exec p_test1;

begin p_test1; end;

ORA-04068: 已丢弃程序包 的当前状态
ORA-04062: timestamp (属 procedure "TEST.P_R_TEST") 已被更改
ORA-06512: 在"TEST.P_TEST1", line 4
ORA-06512: 在line 2

再看两个存储过程的状态

SQL> select object_name,object_type,status from all_objects where object_name in (’P_TEST1′,’P_TEST2′);

OBJECT_NAME                    OBJECT_TYPE        STATUS
------------------------------ ------------------ -------
P_TEST1                        PROCEDURE          INVALID
P_TEST2                        PROCEDURE          INVALID

如果这个时候再执行p_test1,则系统发现状态为INVALID,会进行重新编译。

因此在涉及到调用远程存储过程的本地对象,如function、package、procedure等,需要注意远程对象变更这种情况的发生,避免出现本地对象失效,从而引起程序问题,特别是在JOB这样的应用中。
 

准备逐步将原来在itpub空间上的文章转移到这里来

Posted by 老熊 on 7月 19th, 2008

如题,边转移文章边修饰老熊的三分地,至少不要让这里显得太贫瘠太荒废。

测试 WP的source code

Posted by 老熊 on 7月 19th, 2008

测试一下

   select * from dual
   connect by level <= 1000;

开张

Posted by 老熊 on 7月 14th, 2008

终于拥有了自己独立域名的网站,也算是自己的三分自留地吧。这里将见证老熊的生活、工作、想法和技术。


Copyright © 2007 老熊的三分地-Oracle、UNIX、数据恢复. All rights reserved.