oracle9i中转储索引出错-ORA-01426

SQL> select object_id from dba_objects where object_name=’PK_TOBJECTS’;

OBJECT_ID ———- 34595

SQL> alter session set events ‘immediate trace name TREEDUMP level 34595′; ERROR: ORA-00604: 递归 SQL 层 1 出现错误 ORA-01426: 数字溢出

搜索到一篇帖子:http://www.itpub.net/viewthread.php?tid=1207918 帖子中说metalink中有说明: Title: Bug 2721739  ORA-1426 possible on TREEDUMP of an index Affects: Product (Component)        Oracle Server (Rdbms) Range of versions believed to be [...]

创建外部表

1、 指定外部文件所在目录

——————————————————————————– SQL> create directory LOG_FW_DIR as ‘/opt/oracle/oradata/alpha’; Directory created SQL> select * from dba_directories; OWNER                          DIRECTORY_NAME                 DIRECTORY_PATH —————————— —————————— ————- SYS                            LOG_FW_DIR                     /opt/oracle/oradata/alpha SYS                            WORK_DIR                       /ade/aime_ship_10gR2_050630.0022/oracle/work SYS                            DATA_PUMP_DIR                  /opt/oracle/product/10.2.0/db_1/rdbms/log/ SYS                            ADMIN_DIR                      /ade/aime_ship_10gR2_050630.0022/oracle/md/admin ——————————————————————————–

2、创建外部表

——————————————————————————– SQL> CREATE   TABLE USERLOG_OUT ( 2    SID VARCHAR2(50), 3    SERIAL VARCHAR2(50), 4    USERID VARCHAR2(50), 5    USERNAME VARCHAR2(50), [...]

【Oracle-EXP和IMP使用】导入数据到不同表空间

版本:oracle 9i

有关具体的操作步骤,oracle官方文档(Oracle9i Database Utilities,import)说的很清楚:

—————————————————————————————————- Reorganizing Tablespaces

If a user’s quota allows it, the user’s tables are imported into the same tablespace from which they were exported. However, if the tablespace no longer exists or the user does not have the necessary quota, the system uses the default tablespace for that user as [...]

【Oracle备份与恢复】Oracle归档与不归档模式的切换

1. 查看数据库的归档模式

(1)使用命令:

————————————————- SQL> archive log list 数据库日志模式 存档模式 自动存档 启用 存档终点 f:\oradata\dblearn\arch 最早的概要日志序列 14 下一个存档日志序列 16 当前日志序列 16 ————————————————-

(2)查询字典视图:

————————————————- SQL> select name,log_mode from v$database; NAME      LOG_MODE ——— ———— DBLEARN   ARCHIVELOG ————————————————-

2. 归档模式的一些常见设置

归档模式涉及到很多系统参数,可以通过设置这些参数启动或关闭归档模式、归档日志存储的目录、是否多路归档等等,这些参数一般以“log_archive_*”开头。使用下列命令可以查看:————————————————- SQL> show parameter log_archive; ————————————————-

2.1 设置归档日志的路径 设置归档日志的路径有两种方式:

(1)LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST参数

这两个参数指明了归档日志存放的两个路径,如果只设置第一个,则归档日志只存放到一个路径。

例:

————————————————- log_archive_dest=/disk1/archive log_archive_duplex_dest=/disk2/archive ————————————————-

(2)LOG_ARCHIVE_DEST_n参数 [...]

【NSIS使用经验】打包含有oracle客户端的应用程序

有关如何抽取oracle客户端,请参见《制作安装包之抽取oracle客户端的一种方法》。

抽取文件后,在安装的时候还需要修改相应的注册表,环境变量,NSIS脚本代码大致如下(oracle10g,支持oracle oledb):

—————————————————————————————————-

;在注册表中写入oracle信息 WriteRegStr   HKLM “SOFTWARE\ORACLE” “inst_loc” “C:\Program Files\Oracle\Inventory” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “ORACLE_HOME” “$INSTDIR\Oracle” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “ORACLE_HOME_NAME” “OraClient10g_home1″ WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “ORACLE_GROUP_NAME” “Oracle – OraClient10g_home1″ WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “ORACLE_BUNDLE_NAME” “Enterprise” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “NLS_LANG” “SIMPLIFIED CHINESE_CHINA.ZHS16GBK” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “OLEDB” “$INSTDIR\Oracle\oledb\mesg” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “StmtCacheSize” “0″ WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1\OLEDB” “CacheType” “Memory” [...]

【NSIS使用经验】修改和删除环境变量

;设置oracle的环境变量到PATH路径 ReadRegStr $0 HKLM “SYSTEM\CurrentControlSet\Control\Session Manager\Environment” “Path” WriteRegExpandStr HKLM “SYSTEM\CurrentControlSet\Control\Session Manager\Environment” “Path” “$0;$INSTDIR\Oracle\bin\” ;刷新环境变量 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 “STR:Environment”

;利用WordReplace函数从PATH中删除设置oracle的环境变量 ;需要在文件头引入相应的头文件:!include “WordFunc.nsh” ReadRegStr $R0 HKLM “SYSTEM\CurrentControlSet\Control\Session Manager\Environment” “Path” ${WordReplace} $R0 “;$INSTDIR\Oracle\bin\” “” “+” $R1 ;MessageBox MB_OK|MB_USERICON ‘$R0 – $INSTDIR – $R1 ‘ WriteRegExpandStr HKLM “SYSTEM\CurrentControlSet\Control\Session Manager\Environment” “Path” “$R1″

【NSIS使用经验】禁止多个安装程序实例或禁止重复安装程序

;在安装程序运行前的回调函数前实现 Function .onInit ;禁止多个安装程序实例 System::Call ‘kernel32::CreateMutexA(i 0, i 0, t “JWBClient”) i .r1 ?e’ Pop $R0 StrCmp $R0 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION “安装程序已经在运行。” Abort

;禁止重复安装程序 ReadRegStr $0 HKLM ‘${PRODUCT_DIR_REGKEY}’ “” StrLen $1 $0 IntCmp $1 0 +3 +1 +1 MessageBox MB_OK|MB_USERICON ‘$(^Name) 已安装在计算机中。如需重新安装,请卸载已有的安装’ Quit FunctionEnd

【Log Parser使用经验】列出一个目录下所有子目录

使用Log Parser 2.2工具,例如需要列出E:\Oracle\下所有子目录:

C:\Program Files\Log Parser 2.2>LogParser -i:fs -o:csv “select path,’\”‘ into e:\p.csv from E:\Oracle\*.* where (path not like ‘%.’) and (attributes like ‘%D%’) ”

结果导出在e:\p.csv中,如果需要按照逆序排序列出:

C:\Program Files\Log Parser 2.2>LogParser -i:fs -o:csv “select path,’\”‘ into e:\p.csv from E:\Oracle\*.* where (path not like ‘%.’) and (attributes like ‘%D%’) order by path desc”

[...]

制作安装包之抽取oracle客户端的一种方法

从oracle 10g开始,oracle官方提供了一个精简的client,叫oracle instant client,只有几十M,免安装,可供分发。其下载地址:

http://www.oracle.com/technology/software/tech/oci/instantclient/index.html

至 于如何配置、使用等,本文不予介绍。如果能够使用此client打包程序成功的,也可以不必看此文。网上有网友说,这个client比起普通的 client,还存在很多bug,但我没有证实过。我之所以需要手工抽取,是因为,它不包括oracle oledb,而我的程序需要它。

下面介绍我此次抽取客户端的经历,以及从中总结出的一种通用的抽取方法。

首先,参照了三篇网文《Oracle10g Client的手工分发》(http://www.cnblogs.com/pilybird/archive/2006/10/24/538338.html),《Oracle OLEDB 的手工分发》(http://www.cnblogs.com/pilybird/archive/2006/10/26/540943.html),《Oracle学习笔记:手工注册oracle的oledb驱动》(http://www.cnblogs.com/jinzhenshui/archive/2009/01/08/1371634.html),我抽取了必须的文件,具体的抽取过程,可以参照下列dos脚本(需要修改定义的变量):

——————————————————————–

@ECHO    从Oracle 10g Client中提取精简客户端

REM 定义变量 set ORACLE_CLIENT_HOME=E:\client_1 set DEST_ORA_CLIENT_DIR=E:\ora10g_client

REM sqlplus目录 mkdir %DEST_ORA_CLIENT_DIR%\sqlplus mkdir %DEST_ORA_CLIENT_DIR%\sqlplus\mesg copy %ORACLE_CLIENT_HOME%\sqlplus\mesg\*.* %DEST_ORA_CLIENT_DIR%\sqlplus\mesg

REM oracore目录 mkdir %DEST_ORA_CLIENT_DIR%\oracore mkdir %DEST_ORA_CLIENT_DIR%\oracore\zoneinfo copy %ORACLE_CLIENT_HOME%\oracore\zoneinfo\*.* %DEST_ORA_CLIENT_DIR%\oracore\zoneinfo mkdir %DEST_ORA_CLIENT_DIR%\oracore\mesg copy %ORACLE_CLIENT_HOME%\oracore\mesg\*.* %DEST_ORA_CLIENT_DIR%\oracore\mesg

REM Network目录 mkdir %DEST_ORA_CLIENT_DIR%\Network mkdir %DEST_ORA_CLIENT_DIR%\Network\Admin [...]

编译PACKAGE BODY报错:PL/SQL: ORA-00942: 表或视图不存在

数据库移植了,重新编译(recompile)一个名叫firewall 的PACKAGE BODY的时候报错如下:

Error: PL/SQL: ORA-00942: 表或视图不存在

Line: 14

Text: from v$sessio

但 是为什么直接在sqlplus中执行select * from v$session可以呢?究其原因,是因为firewall这个非系统用户被授予了dba角色,这个角色包含了select any dictionary的权限,所以可以访问任何一个系统视图,包括v$session;但是在PL/SQL中,要参照一个表rowtype或者在定义 cursor的时候使用到某个表,那就必须拥有这个表上的select权。尽管该用户拥有dba角色,含有select any table的权限,但由于在9i中规定在初始化参数O7_DICTIONARY_ACCESSIBILITY,其缺省值(false)的情况下,一个用户 即使有select any table的权限,却还是不能访问sys对象的。

解决方法:

(1) O7_DICTIONARY_ACCESSIBILITY设置为true;

(2) 使用sys用户授权:grant select on v_$session to youruser。注意是授予v_$session而不是v$session。

参考:

http://www.lslnet.com/linux/dosc1/01/linux-112974.htm