??xml version="1.0" encoding="utf-8" standalone="yes"?> 主要是因为oracle安装E序没有loracleq个可执行程序设|正的setuid。这栯|一下: $ cd $ORACLE_HOME/bin l果cMq样p了?/font> $ ls -l $ORACLE_HOME/bin/oracle 在将SYBASE的TriggerUL到ORACLE的时候发C个问题, 是在一张表的Trigger中不能含有操作该的SQLQ?/font> 例如STOCKINFO的Trigger里不有操作STOCKINFO的SQL?/font> 那加权^均h如何取呢Q?/font> 现在只能在原q_L基础再与Chq行加权q_Q结果是一L?/font> 注意Q?/font> AFTER UPDATE的Trigger不能操作Q只有在BEFORE INSERT的Trigger里才能操作基表?/font> BEFORE INSERT的Trigger只有用INSERT INTO T1(COL1) VALUES('1');才有效, INSERT INTO T1(COL1) SELECT '1' FROM DUAL;也是无效的?/font> 例如Q?/font> SQL> insert into t1 values (1,'a'); --先插入一条数据,避免ORA-01403: no data found 错误?br>1 row inserted SQL> create or replace trigger tri_t1 SQL> insert into t1 values (2,'b'); -- insert into ... values 没有问题 SQL> insert into t1 select '3','c' from dual; -- insert into ... select .. from 报错 q且:old?new只有在行U(for each rowQ的Trigger有效?/font> |上原文Q?/font> q日解决了一个trigger中报ORA-04091错误的问题,补了关于Oracle table mutating的一课: mutating table 是指一个当前正在被update,delete,insert语句修改的表Q如果在一个行U别的trigger中读取或修改一个mutating tableQ则往往会遇到ORA-04091错误.例如Q如果在trigger中用了select或dml 语句讉Ktrigger所在的表,则就会收到这个错误?/p>
然而,Oracle8i?i文档中都没有解释清楚before和after cd?row trigger 在对待两U不同的insert语句(insert into ... values ... ?insert into ... select ...)时的差别Q?/p>
1、对于after cd?for each row U别的triggersQ不论哪Uinsert语句触发了triggerQ都不允许在 trigger 中访问本trigger所依赖的table的,试如下Q?br>SQL> create table t1 ( c1 number,c2 varchar2(10)); SQL> insert into t1 values (1,'a'); SQL> insert into t1 select '1','a' from dual; 2、对于before cd?for each row U别的triggersQ如果?insert into ... values 语句触发此trigger Q则在trigger 中访问本table没有问题Q?br>但如果?insert into select .. from 语句触发此trigger Q则在trigger 中访问本table报ora-04091错误Q?br>只有在Oracle 7标准的开发文档中有这L说明Q?br>From the Application Developers Guide 试如下Q?br>SQL> drop trigger tri_t1; SQL> insert into t1 values (1,'a'); --先插入一条数据,避免ORA-01403: no data found 错误?br>1 row inserted SQL> create or replace trigger tri_t1 SQL> insert into t1 values (2,'b'); -- insert into ... values 没有问题 SQL> insert into t1 select '3','c' from dual; -- insert into ... select .. from 报错 我们的开发h员因Z知道q个特别情况Q近日在修改一个存储过E时候,原来的insert values 写法Ҏ了insert select 写法Q而trigger 又是beforecd的,D出现了ORA-04091错误Q搞得分析了好久也没有头l?/p>
其实Q在metalink中有一note说到了:
文档 ID: 注释:132569.1
Problem Description You want to do an insert into a table that has a BEFORE row Trigger. When you hard code the values into the INSERT statement, the trigger works fine. For example: 1 row created. However, your trigger errors with ERROR ORA-4091 with INSERT ERROR at line 1: CREATE OR REPLACE trigger INS_CONTENT Error: ORA 4091 Action: Rewrite the trigger (or function) so it does not read that table. Explanation: Note: Oracle Application Developer's Guide (A68003-01)
写这个也是因来这U重复性的问题发生的太多所D?br />
首先不要q信STS,SG,OCP,EXPERT {给出的M、内存百分比的说?br />
基本掌握的原则是Q?data buffer 通常可以可能的大,shared_pool_size 要适度Qlog_buffer 通常大到几百K?M差不多?br />
讄之前Q首先要明确2个问?br />
1Q?除去OS和一些其他开销Q能lORACLE使用的内存有多大
2Qoracle?4bit or 32 bit,32bit 通常 SGA?1.7G 的限?某些OS的处理或者WINDOWS上有特定讑֮可以支持?G以上甚至辑ֈ3.7GQ本人无q方面经?
下面是我的windows2000下的oracle :
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
PL/SQL Release 8.1.7.0.0 - Production
CORE 8.1.7.0.0 Production
TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
NLSRTL Version 3.4.1.0.0 - Production
SQL>
windows上存?2bit的限Ӟ如AIX、HP UNIX {有明确?4BIT OS and ORACLE的版本,32bit oracle可以装在64bit os 上,64 bit oracle不能装在32 bit OS?br />
不管oracle?2 bit ORACLEq是 64 bit ?假定应用存在没有很好的用bind var 的情况,也不能设|?shared_pool_size q大Q通常应该控制?00M--300M,如果?ORACLE ERP 一cȝ使用了很多存储过E函数、包 Q或者很大的pȝQ可以考虑增大shared_pool_size ,但是如果过500M可能是危险的Q达?G可能会造成CPU的严重负担,pȝ甚至瘫痪。所以shared_pool_size 如果过300Mq命中率不高Q那么应该从应用上找原因而不是一味的增加内存Qshared_pool_size q大主要增加了管理负担和latch 的开销?br />
log_buffer : 128K ---- 1M 之间通常问题不大Q不应该太大
large_pool_size :如果不设|MTSQ通常?RMAN 、OPQ 会用到Q但是在10M --- 50M 应该差不多了。假如设|?MTS,则由?UGA 攑ֈlarge_pool_size 的缘故,q个时候依?session最大数量和 sort_ares_size {参数设|,必须增大large_pool_size 的设|,可以考虑?session * (sort_area_size + 2M)。这里要提醒一点,不是必须使用MTSQ我们都不主张用MTSQ尤其同时在U用h于500的情况下?br />
java_pool_size : 若不使用javaQ给30M通常够?br />
data buffer ,在做了前面的讄后,凡可以提供给oracle的内存,都应该给data buffer = (db_block_size * db_block_buffers)
?i 中可以是 db_cache_size
q有2个重要参数我们需要注?br />
sort_area_size and hash_area_size
q两个参数在非MTS下都是属于PGA Q不属于SGA,是ؓ每个session单独分配的,在我们的服务器上除了OS + SGA,一定要考虑q两部分
(****) : OS 使用内存+ SGA + session*(sort_area_size + hash_area_size + 2M) < ȝ理RAM 为好
q样归结q来Q假定oracle?32 bit ,服务器RAM大于2G Q注意你的PGA的情况,,则徏?br />
shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G
再具体化Q注意满上?****) 的原则的基础上可以参考如下设|?br />
如果512M RAM
shared_pool_size = 50M, data buffer = 200M
如果1G RAM
shared_pool_size = 100M , data buffer = 500M
如果2G
shared_pool_size = 150M ,data buffer = 1.2G
物理内存再大已经跟参数没有关pM
假定64 bit ORACLE
内存4G
shared_pool_size = 200M , data buffer = 2.5G
内存8G
shared_pool_size = 300M , data buffer = 5G
内存 12G
shared_pool_size = 300M-----800M , data buffer = 8G
以上仅ؓ参考|不同pȝ可能差异比较大,需要根据具体情况调整。徏议在讄参数的同Ӟinit中?lock_sga Q在不同的^C可能有不同的方式Q得SGA锁定在物理内存中而不被放?SWAP 中,q样Ҏ率有好处
关于内存的设|,要再q行l致的调_L作用不大Q但可根据statspack信息和v$system_event,v$sysstat,v$sesstat,v$latch {view信息来考虑微调
]]>
]]>
]]>
ORA-01034: ORACLE not available
ORA-27121: unable to determine size of shared memory segment
Linux Error: 13: Permission denied
$ chmod 6751 oracle
-rwsr-s--x 1 oracle oinstall 23352783 Aug 14 2001 /home/oracle/app/oracle/product/8.1.6/bin/oracle
q个错误的典型现象:使用oracle用户一切正常,但是在用其它用hQ用sqlplus无法dQ报告上面的错误Q?img src ="http://m.tkk7.com/john_yu/aggbug/130890.html" width = "1" height = "1" />
]]> Oracle 的Trigger 中不能操作基?/font>
SQL> commit;
2 before insert on t1 for each row
3 declare
4 cvar varchar2(10);
5 begin
6 select 'Y' into cvar from t1 WHERE ROWNUM=1;
7 end;
8 /
Trigger created
1 row inserted
ORA-04091: table TEST.T1 is mutating, trigger/function may not see it
ORA-06512: at "TEST.TRI_T1", line 4
ORA-04088: error during execution of trigger 'TEST.TRI_T1'ORA-04091?table mutating
Table created
SQL> create or replace trigger tri_t1
2 after insert on t1 for each row
3 declare
4 cvar varchar2(10);
5 begin
6 select 'Y' into cvar from t1 WHERE ROWNUM=1; --q里讉K了trigger 本表
7 end;
8 /
Trigger created
ORA-04091: table TEST.T1 is mutating, trigger/function may not see it
ORA-06512: at "TEST.TRI_T1", line 4
ORA-04088: error during execution of trigger 'TES.TRI_T1'
ORA-04091: table TEST.T1 is mutating, trigger/function may not see it
ORA-06512: at "TEST.TRI_T1", line 4
ORA-04088: error during execution of trigger 'TEST.TRI_T1'
"There is an exception to this restriction;
For single row INSERTs, constraining tables are mutating for
AFTER row triggers, but not for BEFORE row triggers.
INSERT statements that involve more than 1 row are not considered
single row inserts."
"INSERT INTO <table_name> SELECT ..." are not considered single row
inserts, even if they only result in 1 row being inserted.
Trigger dropped
SQL> commit;
2 before insert on t1 for each row
3 declare
4 cvar varchar2(10);
5 begin
6 select 'Y' into cvar from t1 WHERE ROWNUM=1;
7 end;
8 /
Trigger created
1 row inserted
ORA-04091: table TEST.T1 is mutating, trigger/function may not see it
ORA-06512: at "TEST.TRI_T1", line 4
ORA-04088: error during execution of trigger 'TEST.TRI_T1'
主题: ORA-4091 on BEFORE ROW TRIGGER with INSERT statement
cd: PROBLEM
状? PUBLISHED
内容cd: TEXT/X-HTML
创徏日期: 16-JAN-2001
上次修订日期: 09-AUG-2004
-------------------
INSERT
INTO content (cont_name,cont_seg,cat_seq)
VALUES('blah',100,200);
INSERT INTO...select statement:
INTO content (cont_name,cont_seq,cat_seq) (select....from category);
ORA-4091: table <schema>.CONTENT is mutating, trigger/function may not see it
ORA-6512: at "<schema>.INS_CONTENT", line 4
ORA-4088: error during execution of trigger '<schema>.INS_CONTENT'
TRIGGER:
BEFORE INSERT on CONTENT
FOR EACH ROW
DECLARE
max_sort number;
BEGIN
SELECT max(cont_sort) INTO max_sort FROM CONTENT;
IF max_sort IS NOT NULL AND max_sort!= 99999 THEN
IF :new.cont_sort IS NULL THEN
:new.cont_sort := max_sort +1;
END IF;
END IF;
SELECT SEQ_CONT_SEQ.nextval INTO :new.CONT_SEQ from dual;
END;
Explanation
-----------
Text: table %s.%s is mutating, trigger/function may not see it
-------------------------------------------------------------------------------
Cause: A trigger (or a user defined PL/SQL function that is referenced in
this statement) attempted to look at (or modify) a table that was
in the middle of being modified by the statement which fired it.
You cannot look at or modify the table that is mutating.
From the Application Developers Guide
"There is an exception to this restriction;
For single row INSERTs, constraining tables are mutating for
AFTER row triggers, but not for BEFORE row triggers.
INSERT statements that involve more than 1 row are not considered
single row inserts."
"INSERT INTO <table_name> SELECT ..." are not considered single row
inserts, even if they only result in 1 row being inserted.
RELATED DOCUMENTS
-----------------
Chapter 'Using Database Triggers', page 13-22)
]]>
UNDO表空间用于存?/span>UNDO数据,当执?/span>DML操作(INSERT,UPDATE?/span>DELETE)?/span>,oracle会将q些操作的旧数据写入?/span>UNDOD?/span>,?/span>oracle9i之前,理UNDO数据时?/span>(Rollback Segment)完成?/span>.?/span>oracle9i开?/span>,理UNDO数据不仅可以使用回滚D?/span>,q可以?/span>UNDO表空?/span>.因ؓ规划和管理回滚段比较复杂,所?/span>oracle database 10g已经完全丢弃用回滚段.q且使用UNDO表空间来理UNDO数据.
UNDO数据也称为回?/span>(ROLLBACK)数据,它用于确保数据的一致?/span>.当执?/span>DML操作?/span>,事务操作前的数据被称?/span>UNDO记录.UNDOD는于保存事务所修改数据的旧?/span>,其中存储着被修Ҏ据块的位|以及修改前数据,
UNDO数据的作?/span>.
1,回退事务
当执?/span>DML操作修改数据?/span>,UNDO数据被存攑ֈUNDOD?/span>,而新数据则被存放到数据段?/span>,如果事务操作存在问题,旧需要回退事务,以取消事务变?/span>.假定用户A执行了语?/span>UPDATE emp SET sal=1000 WHERE empno=7788后发?/span>,应该修改雇员7963的工?/span>,而不是雇?/span>7788的工?/span>,那么通过执行ROLLBACK语句可以取消事务变化.当执?/span>ROLLBACK命o?/span>,oracle会将UNDOD늚UNDO数据800写回的数据段?/span>.
2,M致?/span>
用户索数据库数据?/span>,oracleL使用用户只能看到被提交过的数?/span>(d提交)或特定时间点的数?/span>(SELECT语句旉?/span>).q样可以保数据的一致?/span>.例如,当用?/span>A执行语句UPDATE emp SET sal=1000 WHERE empno=7788?/span>,UNDO记录会被存放到回滚段?/span>,而新数据则会存放?/span>EMPD中;假定此时该数据尚未提?/span>,q且用户B执行SELECT sal FROM emp WHERE empno=7788,此时用户B取?/span>UNDO数据800,而该数据正是?/span>UNDO记录中取得的.
3,事务恢复
事务恢复是例E恢复的一部分,它是?/span>oracle server自动完成?/span>.如果在数据库q行q程中出CE失?/span>(如断?/span>,内存故障,后台q程故障{?/span>),那么当重?/span>oracle server?/span>,后台q程SMON会自动执行例E恢?/span>,执行例程恢复?/span>,oracl会重新做所有未应用的记?/span>.回退未提交事?/span>.
4,倒叙查询(FlashBack Query)
倒叙查询用于取得特定旉点的数据库数?/span>,它是9i新增加的Ҏ?/span>,假定当前旉Z?/span>11:00,某用户在上午10:00执行UPDATE emp SET sal=3500 WHERE empno=7788语句,修改q提交了事务(雇员原工资ؓ3000),Z取得10:00之前的雇员工?/span>,用户可以使用倒叙查询特征.
使用UNDO参数
1,UNDO_MANAGEMENT
该初始化参数用于指定UNDO数据的管理方?/span>.如果要用自动管理模?/span>,必须讄该参CؓAUTO,如果使用手工理模式,必须讄该参CؓMANUAL,使用自动理模式?/span>,oracle会?/span>undo表空间管?/span>undo理,使用手工理模式?/span>,oracle会用回滚段理undo数据,
需要注?/span>,使用自动理模式?/span>,如果没有配置初始化参?/span>UNDO_TABLESPACE,oracle会自动选择W一个可用的UNDO表空间存?/span>UNDO数据,如果没有可用?/span>UNDO表空?/span>,oracle会?/span>SYSTEM回滚D存?/span>UNDO记录,q在ALTER文g中记载警?/span>.
2,UNDO_TABLESPACE
该初始化参数用于指定例程所要用的UNDO表空?/span>,使用自动UNDO理模式?/span>,通过配置该参数可以指定例E所要用的UNDO表空?/span>.
?/span>RAC(Real Application Cluster)l构?/span>,因ؓ一?/span>UNDO表空间不能由多个例程同时使用,所有必Mؓ每个例程配置一个独立的UNDO表空?/span>.
3,UNDO_RETENTION
该初始化参数用于控制UNDO数据的最大保留时?/span>,光认gؓ900U?/span>,?/span>9i开?/span>,通过配置该初始化参数,可以指定undo数据的保留时?/span>,从而确定倒叙查询特征(Flashback Query)可以查看到的最早时间点.
建立UNDO表空?/span>,
UNDO表空间专门用于存?/span>UNDO数据,q且?/span>UNDO表空间尚不能建立M数据对象(?/span>,索引,?/span>)
1,使用CREATE DATABASE命o建立UNDO表空?/span>.
当?/span>CREATE DATABASE命o建立数据库时,通过指定UNDO TABLESPACE选项,可以建立UNDO表空?/span>.CZ如下:
CREATE DATABASE db01
…
UNDO TABLESPACE undotbs_01
DATAFILE ‘/u01/oracle/rbdb1/undo0101.dbf’ SIZE 30M;
注意:UNDO TABLESPACE 子句不是必须?/span>,如果使用自动UNDO理模式,q且没有指定该子?/span>,那么建立数据库时会自动生成名?/span>SYS_UNDOTBS?/span>UNDO表空?/span>.
2,使用CREATE UNDO TABLESPACE命o建立UNDO表空?/span>.
CREATE UNDO TABLESPACE undotbs3
DATAFILE ‘D:demoundotbs3.dbf’ SIZE 10M;
修改UNDO表空?/span>,
使用ALTER TABLESPACE命o修改UNDO表空?/span>.
当事务用了UNDO表空间后,使用ALTER TABLESPACE … ADD DATAFILE增加数据文g
?/span>UNDO表空间所在的盘填满?/span>,使用ALTER TABLESPACE … RENAME DATAFIEL 命oUd数据文g到其他磁盘上.
使用ALTER DATABASE … OFFLINE/ONLINE使表I间脱机/联机.
当数据库处于ARCHIVELOG模式?/span>,使用ALTER TABLESPACE …BEGIN BACKUP/END BACKUP命o备䆾UNDO表空?/span>.
切换UNDO表空?/span>.
启动例程q打开数据库后,同一时刻特定例程只能使用一?/span>UNDO表空?/span>,切换UNDO表空间是指停止例E当前用的UNDO表空?/span>,q启动其?/span>UNDO表空?/span>,下面以启?/span>undotbs2表空间ؓ?/span>,说明切换UNDO表空间的Ҏ.
ALTER SYSTEM SET undo_tablespace=undotbs02;
?/span>RAC(Real Application Cluster)机构?/span>,不同例程必须使用独立?/span>UNDO表空?/span>,而不能共用同一?/span>UNDO表空?/span>.
删除UNDO表空?/span>.
当前例程正在使用?/span>UNDO表空间是不能被删除的,如果定要删除当前例E正在用的UNDO表空?/span>,应首先切?/span>UNDO表空?/span>.然后删除相应?/span>UNDO表空?/span>.
DROP TABLESPACE undotbs3;
1,定当前例程正在使用?/span>UNDO表空?/span>.
Show parameter undo_tablespace
2,昄数据库的所?/span>UNDO表空?/span>.
SELECT tablespace_name FROMdba_tablespaces WHERE contents=’UNDO’;
3,昄UNDO表空间统计信?/span>.
使用自动UNDO理模式?/span>,需要合理地讄UNDO表空间的寸,Z合理规划UNDO表空间尺?/span>,应在数据库运行的高峰阶段搜集UNDO表空间的l计信息.最l根据该l计信息定UNDO表空间的寸.通过查询动态性能视图V%UNDOSTAT,可以搜集UNDOl计信息.
SELECT TO_CHAR(BEGIN_TIME,’HH24:MI:SS’) BEGIN_TIME,
TO_CHAR(END_TIME,’HH24:MI:SS’) END_TIME,
UNDOBLKS
FROM V$UNDOSTAT;
BEGIN_TIME用于标识起始l计旉,END_TIME用于标识l束l计旉,UNDOBLKS用于标识UNDO数据所占用的数据块个数.oracle每隔10分钟生成一行统计信?/span>.
4,昄UNDOD늻计信?/span>.
使用自动UNDO理模式?/span>,oracle会在UNDO表空间上自动建立10?/span>UNDOD?/span>,通过查询动态信息视?/span>V$ROLLNAME,可以昄所有联?/span>UNDOD늚名称,通过查询动态性能视图V$ROLLLISTAT,可以昄UNDOD늚l计信息.通过?/span>V$ROLLNAME?/span>V$ROLLLISTAT之间执行q接查询,可以监视特定UNDOD늚特定信息.
SELECT a.name, b.xacts, b.writes, b.extents
FROM v$rollname a, v$rollstat b
WHERE a.usn=b.usn;
Name用于标识UNDOD늚名称,xacts用于标识UNDOD|包含的活动事务个?/span>,
Writes用于标识?/span>undoD上所写入的字节数,extents用于标识UNDOD늚Z?/span>.
5,昄zd事务信息.
当执?/span>DML操作?/span>,oracle会将q些操作的旧数据攑ֈUNDOD中,动态性能视图v$session用于昄会话的详l信?/span>,动态性能视图v$transaction用于昄事务的详l信?/span>,动态性能视图v$rollname用于昄联机UNDOD늚名称.通过在这3个动态性能视图之间执行q接查询,可以定正在执行事务操作的会?/span>,事务所使用?/span>UNDOD?/span>,以及事务所占用?/span>UNDO块个?/span>.
Col username format a10
Col name format a10
SELECT a.username, b.name, c.used_ublk
FROM v$session a, v$rollname b, v$transaction c
WHERE a.saddr=c.ses_addr AND b.usn=c.xidusn
AND a.username=’SCOTT’;
6,昄UNDOZ?/span>
数据字典视图dba_undo_extents用于昄UNDO表空间所有区的详l信?/span>.包括UNDO区尺寸和状态等信息.
SELECT extend_id, bytes, status FROM dba_undo_extents
WHERE segment_name’_SYSSMU5$’;
其中,extent_id用于标识区编?/span>,bytes用于标识区尺?/span>,status用于标识区状?/span>(ACTIVE:表示该区处于zd状?/span>,EXPIRED:标识该区未用).
1.使用sysdOracleQ利用dbms_xdb修改端口讄
SQL> -- Change the HTTP/WEBDAV port from 8080 to 8081
SQL> call dbms_xdb.cfg_update(updateXML(
2 dbms_xdb.cfg_get()
3 , '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()'
4 , 8081))
5 /
Call completed.
SQL> -- Change the FTP port from 2100 to 2111
SQL> call dbms_xdb.cfg_update(updateXML(
2 dbms_xdb.cfg_get()
3 , '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()'
4 , 2111))
5 /
Call completed.
SQL> COMMIT;
Commit complete.
SQL> EXEC dbms_xdb.cfg_refresh;
PL/SQL procedure successfully completed.
2.使用OEM consoleQ选择数据库,XML DatabaseQConfiguration。更改XDB的有兌|?/p>
3.L数据库的初始化参敎ͼ dispatchers='(PROTOCOL=TCP) (SERVICE=XDB)'Q将会禁止XDB的http和ftp服务?br />
Pro*C/C++: Release 9.2.0.6.0 - Production on Fri Nov 24 17:07:54 2006
Syntax error at line 52, column 37, file /usr/include/c++/3.4.3/bits/concept_check.h:
Error at line 52, column 37 in file /usr/include/c++/3.4.3/bits/concept_check.h
#define __glibcxx_function_requires(...)
....................................1
PCC-S-02014, Encountered the symbol "..." when expecting one of the following:
) an identifier, define, elif, else, endif, error, if, ifdef,
ifndef,
解决ҎQ?br />1、配|好 $ORACLE_HOME/precomp/admin/pcscfg.cfg 文g
Ҏ你的pȝ不同Q大概像q样
sys_include=(/usr/lib/gcclib/i386redhatlinux/3.2.2/include,/u01/oracle/product/8.1.7/precomp/public,/usr/include,/usr/include/sys)
include=(/u01/oracle/product/8.1.7/precomp/public)
include=/u01/oracle/product/8.1.7/precomp/hdrs
include=/u01/oracle/product/8.1.7/tpcc2x_2/src
include=/u01/oracle/product/8.1.7/precomp/precomp/include
include=/u01/oracle/product/8.1.7/precomp/oracore/include
include=/u01/oracle/product/8.1.7/precomp/oracore/public
include=/u01/oracle/product/8.1.7/precomp/rdbms/include
include=/u01/oracle/product/8.1.7/precomp/rdbms/public
include=/u01/oracle/product/8.1.7/precomp/rdbms/demo
include=/u01/oracle/product/8.1.7/precomp/nlsrtl/include
include=/u01/oracle/product/8.1.7/precomp/nlsrtl/public
include=/u01/oracle/product/8.1.7/precomp/network_src/include
include=/u01/oracle/product/8.1.7/precomp/network_src/public
include=/u01/oracle/product/8.1.7/precomp/network/include
include=/u01/oracle/product/8.1.7/precomp/network/public
include=/u01/oracle/product/8.1.7/precomp/plsql/public
ltype=short
INCLDIR= -I. -I/u01/oracle/product/8.1.7/precomp/public -I/u01/oracle/product/8.1.7/rdbms/public -I/u01/oracle/product/8.1.7/rdbms/demo -I/u01/oracle/product/8.1.7/plsql/public -I/u01/oracle/product/8.1.7/network/public
DFLAGS= -DPRECOMP -DLINUX -D_GNU_SOURCE -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS
CFLAGS= -O3
LIBPATH= -L/u01/oracle/product/8.1.7/lib/
LIBS=-lclntsh `cat /u01/oracle/product/8.1.7/lib/sysliblist` -ldl -lm
myproc:myproc.pc
proc parse=no iname=myproc.pc include=$(ORACLE_HOME)/precomp/public
gcc -o $@ $@.c -I$(ORACLE_HOME)/precomp/public -L$(ORACLE_HOME)/lib -lclntsh -lclient8 $(LIBPATH) $(LIBS)
clean:
rm *.lis myproc.c myproc
Oracle9i 2.0.4在Red Hat Enterprise Linux AS 3上的安装 | |
|
以下CZ假设已将一?SQL*Net 别名定义?OracleDB?/FONT>
sp_addlinkedserver 'OrclDB', 'Oracle', 'MSDAORA', 'OracleDB'
以下CZ通过 Oracle d?OrclUsr 和密?OrclPwd ?SQL Server d Joe 映射到步?3 中定义的链接服务器:
sp_addlinkedsrvlogin 'OrclDB', false, 'Joe', 'OrclUsr', 'OrclPwd'
每个 Oracle 数据库实例仅有一个名UCؓI的目录。Oracle 链接服务器中的表必须使用四部分名U格?OracleLinkedServerName..OwnerUserName.TableName q行引用。例如,以下 SELECT 语句引用 Oracle 用户 MARY ?OrclDB 链接服务器映的服务器上所拥有的表 SALES?/FONT>
SELECT * FROM OrclDB..MARY.SALES
注意需?修改 注册?Q对于win2k/oracle 8i ,修改的内容ؓQ?/PRE>
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI]
"OracleXaLib"="oraclient8.dll"
"OracleSqlLib"="orasql8.dll"
"OracleOciLib"="oci.dll"
其它事项Q启动mstdc服务
步骤如下Q?
1. Make sure the parallel_server parameter in INIT.ORA is set to false
or it is not set at all.
2. Execute the following commands in Server Manager (svrmgrl):
SVRMGR> SHUTDOWN IMMEDIATE; -- or NORMAL
SVRMGR> STARTUP MOUNT;
SVRMGR> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SVRMGR> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SVRMGR> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SVRMGR> ALTER DATABASE OPEN;
SVRMGR> ALTER DATABASE [NATIONAL] CHARACTER SET INTERNAL_USE
SVRMGR> SHUTDOWN IMMEDIATE; -- OR NORMAL
SVRMGR> STARTUP RESTRICT;
3. Restore the parallel_server parameter in INIT.ORA, if necessary.
4. Execute the following commands in Server Manager:
SVRMGR> SHUTDOWN IMMEDIATE; -- OR NORMAL
SVRMGR> STARTUP;
如果没有登陆Q首先执?
SVRMGR> connect internal;
1. 引言 ORACLE 公司?979 q推出基于SQL 标准的关pL据库产品?997 q版? 的推出,ORACLE 数据库以其支持大数据库、多用户的高性能事务处理Q对业界各项工业标准的支持,完整的安全和完整性控Ӟ支持分布式数据库和分布处理,h可移植性、可兼容性和可连接性等H出优点倍受用户喜爱Q根据IDG1992 q全球UNIX 数据库的市场报告QORACLE 占市场销售量?0%。而在客户端的开发工h面,Visual C++ 也因其强大的功能和高度的灉|性等特点深受q大E序员的喜爱Q因此本文旨在介l用Visual C++ 开发基于ORACLE 数据库应用程序的两种Ҏ? 2. 使用PRO*C 开发数据库应用 2.1 PRO*C 工作原理 PRO pd是ORACLE 公司提供的在W三代高U程序设计语a中嵌入SQL 语句来访问数据库的一套预~译E序Q包括PRO*Ada、PRO*C、PRO*COBOL、PRO*Fortran、PRO*Pascal 和PRO*PL/I 六种。程序员用相应的高语言~写嵌入SQL 语句的PRO 源程序(若用C 语言则称为PRO*C 源程序)后运行相应的预编译程序,把嵌入的SQL 语句转换为标准的ORACLE 调用q生成目标源E序Q即U高U语a格式的源E序Q然后就可以这些源E序加入用户的程序中调用Q其处理q程如下图? ORACLE 预编译程序提供如下功能: ⑴能用六U通用的高U程序设计语a中的M一U编写应用程序? ⑵遵循ANSI 标准Q在高语言中嵌入SQL 语句? ⑶可采用动态SQL ҎQ让E序在运行时接受或构造一个有效的SQL 语句? ⑷实现ORACLE 内部数据cd和高U语a数据cd之间的自动{换? ⑸可通过在应用程序中嵌入PL/SQL 事物处理块来改进性能? ⑹能在程序行和命令行上指定所需要的预编译可选项Qƈ可在预编译的q程中改变它们的倹{? 全面查嵌入的SQL 数据操纵语句和PL/SQL 块的文法和语义? d用SQL*Net q行存取多个地点的ORACLE 数据库? ⑼可把数l作入和输出E序变量使用? ⑽能对应用程序中的代码段q行条g预编译? ⑾提供了较强的异常处理功能? 由此可见Q通过预编译程序与其它高语言的结合,既可以利用SQL 强有力的功能和灵zLؓ数据库应用系l的开发提供强有力的手D,又可以充分利用高U语a自n在系l开发方面的优势Q从而提供一个完备的ZORACLE 数据库应用程序的开发解x案? 2.2 在VC 中用PRO*C 每个PRO*C 源文件一般由E序头和E序体两部分l成。程序头包含宿主变量QSQL 语句中所包含的变量)说明、通讯区定义和C 外部表示W的说明{。程序体一般是pq函数组成,q些函数内含有SQL 语句Q以EXEC SQL 起头的语句)? PRO*C 支持的数据类型包括VARCHAR2( 变长字符?、NUMBER( 二进制数Q、INTGER( 有符h?、FLOAT( 点?、STRING( 以NULL l尾的字W串)、VARNUM( 变长二进制数)、LONG( 变长字符?、VARCHAR( 变长字符?、ROWID( 二进制?、DATE( 定长日期/ 旉?、VARRAW( 变长二进制数?、RAW( 定长二进制数? 、LONGRAW( 变长二进制数?、UNSIGNED( 无符h?、LONGVARCHAR( 变长字符?、LONGVARRAW( 变长二进制数?、CHAR( 定长字符?、CHARZ(C 中定长以NULL l尾的字W串)、MLSLABEL( 变长二进制数?? 在PRO*C 中不能?l' ?u' 作词或'0x' 作词头修饰常量;在SQL 语句中用单引号来定义字W串Q用双引h定义Ҏ的或写字符的标识符( 如表名等)QSQL 语句中不允许使用C 中的d、间接、位逻辑、复合赋倹{?=??+??lt;<?gt;> 操作Wƈ且用NOT、AND、OR? 代替!?amp;&、||?=? 下面的程序是一个联l数据库的PRO*C 源程序例子? #include < sqlca.h > //声明SQL通讯? #include < string.h > #include < afxwin.h > EXEC SQL BEGIN DECLARE SECTION; VARCHAR username[20]; //声明宿主变量 VARCHAR password[20]; VARCHAR dbname[20]; EXEC SQL END DECLARE SECTION; void db_connect() { strcpy((char *)username.arr,"SCOTT"); username.len = strlen((char *)username.arr); strcpy((char *)password.arr,"TIGER"); password.len = strlen((char *)password.arr); strcpy((char *)dbname.arr,"SUNDB"); dbname.len = strlen((char *)dbname.arr); EXEC SQL WHENEVER SQLERROR STOP; //隐式异常处理 EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbname; /*if (sqlca.sqlcode != 0) //昑ּ异常处理 { AfxMessageBox("\n与Oracle数据库连接失?"); return; }*/ } 在VC 中用PRO*C Ӟ先用PRO*C ~写所需的操作数据库的子E序Q再q行PRO*C 预编译程序把PRO*C 源程序{成相应的CPP 源程序,该E序插入到用户工E文件中q在需要对插入函数q行调用的模块中说明函数Q然后就可以在此模块中调用所需的函数? 3. 使用ODBC 中间件访问数据库 3.1 ODBC 工作原理 DBC 是Open Database Connect 卛_放数据库互连的简Uͼ它是由Microsoft 公司?991 q提出的一个用于访问数据库的统一界面标准Q是应用E序和数据库pȝ之间的中间g。它通过使用相应应用q_上和所需数据库对应的驱动E序与应用程序的交互来实现对数据库的操作Q避免了在应用程序中直接调用与数据库相关的操作,从而提供了数据库的独立性? ODBC 主要由驱动程序和驱动E序理器组成。驱动程序是一个用以支持ODBC 函数调用的模块(在WIN95 下通常是一个DLLQ,每个驱动E序对应于相应的数据库,当应用程序从Z一个数据库pȝUL到另一个时Q只需更改应用E序中由ODBC 理E序讑֮的与相应数据库系l对应的别名卛_。驱动程序管理器Q包含在ODBC32.DLL 中)可链接到所有ODBC 应用E序中,它负责管理应用程序中ODBC 函数与DLL 中函数的l定? ODBC 使用层次的方法来理数据库,在数据库通信l构的每一层,对可能出C赖数据库产品自nҎ的地方QODBC 都引入一个公共接口以解决潜在的不一致性,从而很好地解决了基于数据库pȝ应用E序的相对独立性,q也是ODBC 一l推出就获得巨大成功的重要原因之一? 从结构上分,ODBC 分ؓ单束式和多束式两cR? ⑴单束式驱动E序 单束式驱动程序介于应用程序和数据库之_像中介驱动程序一h据提供一个统一的数据访问方式? 当用戯行数据库操作Ӟ应用E序传递一个ODBC 函数调用lODBC 驱动E序理器,由ODBC API 判断该调用是由它直接处理q将l果q回q是送交驱动E序执行q将l果q回? ׃可见Q单束式驱动E序本n是一个数据库引擎Q由它直接可完成Ҏ据库的操作,管该数据库可能位于|络的Q何地斏V? ⑵多束式驱动E序 多束式驱动程序负责在数据库引擎和客户应用E序之间传送命令和数据Q它本nq不执行数据处理操作而用于远E操作的|络通信协议的一个界面? 前端应用E序提出Ҏ据库处理的请求,该请求{lODBC 驱动E序理器,驱动E序理器依据请求的情况Q就地完成或传给多束驱动E序Q多束式驱动E序请求翻译ؓ特定厂家的数据库通信接口Q如Oracle 的SQLNetQ所能理解的形式q交于接口去处理Q接口把hl网l传送给服务器上的数据引擎,服务器处理完后把l果发回l数据库通信接口Q数据库接口结果传l多束式ODBC 驱动E序Q再由驱动程序将l果传给应用E序? 3.2 在VC 中用ODBC Visual C++ 中提供了CDatabase、CRecordset、CRecordView、CDBException 和CFieldExchange 五个c,q些cd装了ODBC SDK 函数Q从而用户可以无需了解SDK 函数可以很方便地操作支持ODBC 的数据库? CDatabase c:装了与数据库徏立连接,控制事务的提交和回滚及执行SQL 语句的方法? CRecordset c:装了大部分操纵数据库的ҎQ包括浏览、修改记录,控制游标UdQ排序等操作? CRecordView c:提供了与recordset 对象相连接的视,可以建立视中的控件与数据库数据的对应Q同时支持移动游标,修改记录{操作? CDBException c:提供了对数据库操作的异常处理Q可以获得操作异常的相关q回代码? CFieldExchange c:提供了用户变量与数据库字D之间的数据交换Q如果不需要用自定义cdQ你不用直接调用该cȝ函数QMFC Wizard 自动ؓE序员徏立连接? 4. 两种Ҏ的比? lg所qͼ使用q两U方法在Visual C++ 中都可以很方便地开发出ZORACLE 数据库的应用E序Q同Ӟq两U方法又各有其优~点。ODBC ׃有MFC 强大的类库支持而得编E实现非常方便,同时可移植性也很强Q在异构的数据库之间UL也只需更改很少的一部分E序Q但是,由ODBC 的实现机制我们可以看刎ͼ与PRO*C 相比Q应用程序需要经qODBC 驱动E序理器和ODBC 驱动E序两层才能和数据库通信接口建立联系Q而PRO*C 是直接与通信接口联系Q因此徏立在ODBC 上应用程序的执行效率会相对低一些。PRO*C h执行效率高,支持嵌入式PL/SQL 块等ORACLE 自nҎ的优点,但正因ؓ有了q些优点Q得用PRO*C 开发出的应用程序无法向异构数据库^台移植?/TD> |