现在的位置: 首页 > 综合 > 正文

oracle数据库开发的一些经验积累

2012年03月28日 ⁄ 综合 ⁄ 共 11809字 ⁄ 字号 评论关闭
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 oftware\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  varchar2return c_Type;

    end pag_cs_power;

函数代码:

    FUNCTION FUN_CS_GETDICTLIST(  v_DictIndex in  varchar2return 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)、将  硬盘目录文件 tage\Components\oracle.swd.jre\1.1.7.30/1 \DataFiles\EXPanded\jre\win32\bin ymcjit.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=file=yourdata.dmp grants=y rows=yimp username/password full=y ignore=file=yourdata.dmp grants=y

6、exp与imp的具体用法

    exp username/password@mzbs_61 full=file=yourdata.dmp grants=y rows=yimp username/password full=y ignore=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=32768OWNER=RMTAFIS         

    这里写导出的用户FILE=E:\Exp\RMTAFIS.DMP      导出的文件,可以是相对路径ROWs=YGRANTS=YCOMPRESS=YCONSISTENT=Y

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

7、假如在like的变量中,是以‘%’开头的话,是不会使用index的。

    反之,不是以‘%‘开头,而又有相应的index,是会使用index的。具体可以用plain plan来看一下。

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

    create table new_tableas 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 -/oracle/oradata/bfiles/1.TXT 

    (4)、connect SCOTT/TIGER create table BFILES (ID numberTEXT 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.6for NT 企业版

            (3)、安装路径:D:\ORACLE

二、卸载步骤:

             (1)、开始->设置->控制面板->治理工具->服务   停止所有Oracle服务。

            (2)、开始->程序->Oracle - OraHome81->Oracle Installation ProdUCts->Universal Installer   卸装所有Oracle产品

            (3)、运行regedit,选择HKEY_LOCAL_MACHINE OFTWARE\ORACLE,按del键删除这个入口。

            (4)、运行regedit,选择HKEY_LOCAL_MACHINE YSTEM\CurrentControlSet ervices,滚动这个列表,删除所有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: cript.txt的内容startup;
    
    命令行:sqlplus internal
/oracle @c: cript.txt
    
    (
2)、用svrmgrl调用:c: cript.txt的内容
    
    connect internal
/oracle;startup;
    
    命令行:svrmgrl 
@c: cript.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 qlnet.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 "$1in '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 -/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/shmmaxecho -n "Starting Oracle Database:"date +"%%%a"su - oracle -c "lsnrctl start"#su - oracle -c "sqlplus 

    /nolog @startmaster.sql"echo -n "Oracle Database Started:"date +"%%%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 ysman\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 TESTis  file_handle utl_file.file_type;  STOR_TEXT VARCHAR2(4000);  N NUMBER;I NUMBER; beginI:=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,CHARVARCHAR2

    (3)、假如有数据,则可以增加宽度。比如NUMBER,CHARVARCHAR2   注重:不可以减小宽度。

    (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 OracleServiceSIDOracleServiceSID是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 tablenameselect 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

抱歉!评论已关闭.