`
liudaoru
  • 浏览: 1558338 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle数据库开发注意事项[z]

阅读更多

From: www.mbsky.com/InfoView/Article_3855.html oracle数据库开发的一些经验积累

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  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)、将  硬盘目录文件 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=y file=yourdata.dmp grants=y rows=yimp 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=yimp 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=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 -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

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了

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics