显示标签为“Oracle”的博文。显示所有博文
显示标签为“Oracle”的博文。显示所有博文

2012年3月11日星期日

Oracle11.2.0非安装版(简装版)制作完成(仅供开发人员参考使用)


作者: iihero@CSDN, 2012.3.11. 请尊重个人劳动。如若转载,请注明原始出处。Thanks.
下载地址:

(免责声明):
这是一个精简版的oracle11g for windows 32bit x86平台.
此压缩包,仅供学习研究使用,本文作者不负任何责任。适合于开发人员使用。切不可将其用于商业用途,请遵守
Oracle公司相关商业规定。如因私自将其用于商业用途,由此带来的法律纠纷或其它问题,概与本人无关.
author: iihero@CSDN  (iiihero AT hotmail.com;  iihero AT qq.com)

0. 如果你已经安装了别的版本的oracle,
请自行备份注册表:[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE], 这样即算有冲突,
你也可以重新导入以前的注册项而得已恢复

1. 将压缩包解压至目录,设该目录值为: d:\,
其下将有目录:
<D>/oracle/*
<D>/oracle/11.2.0

2. 新的ORACLE_HOME将为:<D>/oracle/11.2.0
运行完iihero.ora11g.bat运行完以后,(一个批处理一次安装全部完成)
你需要将<D>/oracle/11.2.0/BIN添加到path里头
缺省的ORACLE_SID为iihero,你可以自行修改iihero.ora11g.bat中的SID值,不要超过8个字符。

3. 安装完以后,别忘了添加环境变量ORACLE_SID=iihero以及将%ORACLE_HOME%/bin
添加到PATH环境变量里头,在这之后,
即可使用sqlplus system/manager进入并修改密码,执行表空间、用户管理相关操作。
如:
  1. D:\Oracle>sqlplus system/manager  
  2.   
  3. SQL*Plus: Release 11.2.0.1.0 Production on 星期日 3月 11 13:14:35 2012  
  4.   
  5. Copyright (c) 1982, 2010, Oracle.  All rights reserved.  
  6.   
  7.   
  8. 连接到:  
  9. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production  
  10. With the Partitioning, OLAP, Data Mining and Real Application Testing options  
  11.   
  12. SQL> quit  
  13. 从 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production  
  14. With the Partitioning, OLAP, Data Mining and Real Application Testing options 断开  

欢迎大家试用,如果发现有什么问题,可以与本人联系。

这个11g的包,既可充当server,同时也可以用作oci, jdbc,sqlplus,odbc等的客户端工具。还是比较齐全的。
11g比10g的非安装包,确实大了不少。10g的时候,总共才50M不到,这不,到了11g,压缩完以后,也有100来兆。不过,不管怎样,比原始的安装包,那可是小了很多了。

10g的非安装包,详见我以前的文章:

2012年3月5日星期一

Oracle在Windows下的操作系统认证总结


一、普通用户

1. 在 windows 下创建用户 niu,或将域用户加入本地组。

2. 修改参数文件 os_authent_prefix 默认值“ops$”。

3. 修改注册表,oracle/home0 下添加 OSAUTH_PREFIX_DOMAIN 项,如果使用域,设为 true,否则设为 false;如果不是在域中,并且将其设为 true,域用机器名代替,如果不添加该项,默认值为 true。

4. 修改 SQLNET.ORA 中的 SQLNET.AUTHENTICATION_SERVICES = (NTS) 或将其注释掉,不能设为 NONE。(该项说明使用操作系统认证)

5. 连接到 Oracle,创建相应的用户:

OSAUTH_PREFIX_DOMAIN 为 TRUE 时:

Create User “OPS$DOMAIN_NAME\NIU” IDENTIFIED EXTERNALLY;
注:在使用 DOMAIN_NAME\ 时,因为有特殊符号 \,所以要用双引号包起来,此时双引号中所有字符必须用大写。

OSAUTH_PREFIX_DOMAIN为 FALSE 时:
Create User OPS$niu IDENTIFIED EXTERNALLY;
赋予给用户一些权限,如:
SQL>GRANT CONNECT TO "OPS$DOMAIN_NAME\NIU"(OPS$niu);
Grant succeeded.
SQL>
6. 以 NIU 用户登录操作操作系统
SQL> connect /
connected
SQL> show user;
USER is "<OPS$><DOMAIN_NAME>\niu"
SQL>
7. 通常情况下,数据库用户登录后,即使没有 ALTER USER 的权限,也是可以修改自己密码的,但若是以此认证方式登录数据库,则不可以(未经确认,只是尝试失败得到的结论,但仔细想想,这样要求也合理)


二、超级管理员用户

1. 与普通用户差不多,需要在创建 windows 中创建组 ora_dba(默认情况安装 oracle 的时候已经建立,ORA_<sid>_DBA 只对指明的 sid 有超级管理员权限),并将本地用户或域用户加入该组。(无需再创建 oracle 用户,相当于用 sys 登陆,os_authent_prefix 也就不起作用。)

2. 用该用户登陆 windows
连接 oracle :

SQL> connect / as sysdba
connected
SQL> show user;
USER is "sys"
SQL>


三、几个参数说明

1. 初始化文件中的 os_authent_prefix: 指明 Oracle 帐户对应 OS 帐户的前缀。

2. 注册表中的 OSAUTH_PREFIX_DOMAIN :如果不指明域(或机器名),一定要将其设为 false,通常这是造成认证失败的原因。

3. sqlnet.ora 中 sqlnet.authentication_services=(nts) 否则产生 ora-01004 错误。

4. 初始化文件中 remote_os_authent=true :该参数不一定要设,除非要用到客户端的操作系统认证(没有试验)。

5. 初始化文件中 REMOTE_LOGIN_PASSWORD :只是用于超级管理员用户,设为 NONE 则只使用操作系统认证,EXCLUSIVE 可用非共享的密码文件认证,SHARED 可用共享的密码文件认证(但只能有 sys 用户为超级管理员)。注:操作系统认证优先于密码文件认证。

四、参考:

http://www.itpub.net/showthread.php?s=&threadid=207909
http://www.itpub.net/162971,1.html
http://www.cnoug.org/viewthread.php?tid=15082
http://www.cnoug.org/viewthread.php?tid=27294&sid=DU7tZYea
http://www.cnblogs.com/zyk/archive/2004/11/09/61786.aspx

Oracle merge usage


CREATE OR REPLACE PACKAGE etl AS

    c_inserting CONSTANT PLS_INTEGER := 0;
    c_updating  CONSTANT PLS_INTEGER := 1;

    FUNCTION merge_counter (
             action_in IN PLS_INTEGER DEFAULT c_inserting
             ) RETURN PLS_INTEGER;

    FUNCTION get_merge_update_count RETURN PLS_INTEGER;

    FUNCTION get_merge_update_count (
             merge_count_in IN PLS_INTEGER
             ) RETURN PLS_INTEGER;

    FUNCTION get_merge_insert_count RETURN PLS_INTEGER;

    FUNCTION get_merge_insert_count (
             merge_count_in in PLS_INTEGER
             ) RETURN PLS_INTEGER;

    PROCEDURE reset_counters;

 END etl;
 /

 CREATE OR REPLACE PACKAGE BODY etl AS

    g_update_counter PLS_INTEGER NOT NULL := 0;
    g_insert_counter PLS_INTEGER NOT NULL := 0;

 /*-------------- START OF FUNCTION merge_counter --------------------*/
 FUNCTION merge_counter (
          action_in IN PLS_INTEGER DEFAULT c_inserting
          ) RETURN PLS_INTEGER IS
 BEGIN
    CASE action_in
       WHEN c_updating
          THEN g_update_counter := g_update_counter + 1;
       WHEN c_inserting
          THEN g_insert_counter := g_insert_counter + 1;
       ELSE
          RAISE PROGRAM_ERROR;
    END CASE;
    RETURN 0;
 END merge_counter;

 /*----------- START OF FUNCTION get_merge_update_count V1 ---------------*/
 FUNCTION get_merge_update_count
    RETURN PLS_INTEGER is
 BEGIN
    RETURN g_update_counter;
 END get_merge_update_count;

 /*----------- START OF FUNCTION get_merge_update_count V2 ---------------*/
 FUNCTION get_merge_update_count (
          merge_count_in IN PLS_INTEGER
          ) RETURN PLS_INTEGER IS
 BEGIN
    RETURN NVL( merge_count_in - g_insert_counter, 0 );
 END get_merge_update_count;

 /*----------- START OF FUNCTION get_merge_insert_count V1 ---------------*/
 FUNCTION get_merge_insert_count
    RETURN PLS_INTEGER IS
 BEGIN
    RETURN g_insert_counter;
 END get_merge_insert_count;

 /*----------- START OF FUNCTION get_merge_insert_count V2 ---------------*/
 FUNCTION get_merge_insert_count (
          merge_count_in IN PLS_INTEGER
          ) RETURN PLS_INTEGER IS
 BEGIN
    RETURN NVL( merge_count_in - g_update_counter, 0 );
 END get_merge_insert_count;

 /*-------------- START OF FUNCTION reset_counters --------------------*/
 PROCEDURE reset_counters IS
 BEGIN
    g_update_counter := 0;
    g_insert_counter := 0;
 END reset_counters;

 END etl;
 /






2. 创建一个验证的sql文件:run_mrg.sql
SQL code
set serverout on
set echo on
set pagesize 100
--
-- Run merge...
--
begin


   etl.reset_counters;


   merge into target tgt
      using source src
      on (src.id = tgt.id)
   when matched then
      update
      set value = (case etl.merge_counter(etl.c_updating)
                        when 0
                       then src.value
                    end)
    when not matched then
       insert
          ( tgt.id
          , tgt.value )
       values
          ( case etl.merge_counter(etl.c_inserting)
               when 0
               then src.id
            end
          , src.value );

    /* Use update count... */
    dbms_output.put_line(sql%rowcount || ' rows merged.');
    dbms_output.put_line(etl.get_merge_update_count || ' rows updated.');
    dbms_output.put_line(etl.get_merge_insert_count(sql%rowcount) || ' rows inserted.');

    /* Use insert count... */
    dbms_output.put_line(etl.get_merge_update_count(sql%rowcount) || ' rows updated.');
    dbms_output.put_line(etl.get_merge_insert_count || ' rows inserted.');

 end;
 /






3. 验证上述用法:
create table source ( id int, value varchar2(1) );
create table target ( id int, value varchar2(1) );


insert into source select rownum, substr(object_type,1,1) from user_objects where rownum <= 15;
insert into target select * from source where rownum <= 10;
commit;


运行结果如下:
SQL> insert into source select rownum, substr(object_type,1,1) from user_objects where rownum <= 15;


已创建11行。


SQL> insert into target select * from source where rownum <= 10;


已创建10行。


SQL> commit;


提交完成。
SQL> @E:\MyDocument\notes\oracle_run_merge.sql
SQL> set serverout on
SQL> set echo on
SQL> set pagesize 100
SQL> --
SQL> -- Run merge...
SQL> --
SQL> begin
  2
  3 etl.reset_counters;
  4
  5 merge into target tgt
  6 using source src
  7 on (src.id = tgt.id)
  8 when matched then
  9 update
 10 set value = (case etl.merge_counter(etl.c_updating)
 11 when 0
 12 then src.value
 13 end)
 14 when not matched then
 15 insert
 16 ( tgt.id
 17 , tgt.value )
 18 values
 19 ( case etl.merge_counter(etl.c_inserting)
 20 when 0
 21 then src.id
 22 end
 23 , src.value );
 24
 25 /* Use update count... */
 26 dbms_output.put_line(sql%rowcount || ' rows merged.');
 27 dbms_output.put_line(etl.get_merge_update_count || ' rows updated.');
 28 dbms_output.put_line(etl.get_merge_insert_count(sql%rowcount) || ' rows inserted.');
 29
 30 /* Use insert count... */
 31 dbms_output.put_line(etl.get_merge_update_count(sql%rowcount) || ' rows updated.');
 32 dbms_output.put_line(etl.get_merge_insert_count || ' rows inserted.');
 33
 34 end;
 35 /
22 rows merged.
20 rows updated.
2 rows inserted.
20 rows updated.
2 rows inserted.


PL/SQL 过程已成功完成。


SQL>


上述过程我是从asktom上整理出来的。希望对你有所帮助。
merge本身是不带有updated和inserted的详细信息的。




Oracle Ref Cursor 示例


--如这个存储过程,该如何接收外部的一个变量进来?
create or replace procedure pro_show_emp(
       empno_in in scott.emp.empno%type,--在要传进来的参数后面加上一个关键字in
       cv_emp in out sys_refcursor
       )
is
begin
     open cv_emp for
     select * from scott.emp emp
     where emp.empno=empno_in;
     
     exception
     when others then
          dbms_output.put_line(sqlerrm);
end pro_show_emp;
/
SQL>  variable x refcursor;--refcursor:sqlplus下运行
SQL>  exec pro_show_emp(7788,:x);
PL/SQL procedure successfully completed.
SQL>  print x;


     EMPNO ENAME      JOB              MGR HIREDATE              SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
      7788 SCOTT      ANALYST         7566 19-4月 -87           3100                    20

Oracle PL/SQL notes


set linesize 512 
set term off verify off feedback off pagesize 999 
-- set markup html on entmap ON spool on preformat off
set heading off
spool droptable.sql on




sql*plus使用的一些技巧  
    发表于:2005年7月5日     阅读:174次  








阅读本文档之前,建议先看” http://www.cnoug.org/viewthread.php?tid=16867“一文,


Sql*plus中蕴藏着好多技巧,如果掌握这些技巧,对于在oracle数据库下进行快速开发与有效维护数据库都是有益的。
    下面就接受一二,
    


1.使用SQL*PLUS动态生成批量脚本
将spool与select命令结合起来使用,可以生成一个脚本,脚本中包含有可以批量执行某一任务的语句。
例1:
生成一个脚本,删除SCOTT用户下的所有的表:
a. 创建gen_drop_table.sql文件,包含如下语句:
SPOOL c:\drop_table.sql
   SELECT 'DROP TABLE '|| table_name ||';' FROM user_tables;
   SPOOL OFF
b. 以SCOTT用户登录数据库
SQLPLUS > @ …..\gen_dorp_table.sql
c. 在c盘根目录下会生成文件drop_table.sql文件,包含删除所有表的语句,如下所示:
SQL>   SELECT 'DROP TABLE '|| table_name ||';' FROM user_tables;       
                                         
'DROPTABLE'||TABLE_NAME||';'              
--------------------------------------------------------------------------------
DROP TABLE DEPT;                     
DROP TABLE EMP;                     
DROP TABLE PARENT;                   
DROP TABLE STAT_VENDER_TEMP;           
DROP TABLE TABLE_FORUM;               
                                         
5 rows selected.  
              
SQL>   SPOOL OFF 
d. 对生成的drop_table.sql文件进行编辑去掉不必要的部分,只留下drop table …..语句
e. 在scott用户下运行dorp_table.sql文件,删除scott用户下所有的表。
SQLPLUS > @ c:\dorp_table.sql


在上面的操作中,在生成的脚本文件中会有多余的字符,如运行的sql语句,标题,或返回的行数,需要我们编辑该脚本后再运行,给实际的操作带来诸多不便。懒惰是人的本性,这促使我们用更简单的办法来实现上面的任务。


a. 创建gen_drop_table.sql文件,包含如下语句:
    set echo off
set feedback off
set newpage none
set pagesize 5000
set linesize 500
set verify off
set pagesize 0
set term off
set trims on
set linesize 600
set heading off
set timing off
set verify off
set numwidth 38
SPOOL c:\drop_table.sql
   SELECT 'DROP TABLE '|| table_name ||';' FROM user_tables;
   SPOOL OFF
b. 以SCOTT用户登录数据库
SQLPLUS > @ …..\gen_dorp_table.sql
c. 在c盘根目录下会生成文件drop_table.sql文件,包含删除所有表的语句,如下所示:
DROP TABLE DEPT;                     
DROP TABLE EMP;                     
DROP TABLE PARENT;                   
DROP TABLE STAT_VENDER_TEMP;           
DROP TABLE TABLE_FORUM;               
d. 在scott用户下运行dorp_table.sql文件,删除scott用户下所有的表。
SQLPLUS > @ c:\dorp_table.sql




2.将一个表中的数据导出生成一个文本文件,列与列之间以”,”隔开
set echo off
set feedback off
set newpage none
set pagesize 5000
set linesize 500
set verify off
set pagesize 0
set term off
set trims on
set linesize 600
set heading off
set timing off
set verify off
set numwidth 38
SPOOL c:\drop_table.sql
   select DEPTNO || ',' || DNAME FROM DEPT;
   SPOOL OFF
将上面的内容保存为一个文本文件后,以scott登录,执行该文件后显示结果:
10,ACCOUNTING 
20,RESEARCH 
30,SALES 
40,OPERATIONS 




通过上面的两个例子,我们可以将:
set echo off
set feedback off
set newpage none
set pagesize 5000
set linesize 500
set verify off
set pagesize 0
set term off
set trims on
set linesize 600
set heading off
set timing off
set verify off
set numwidth 38
SPOOL c:\具体的文件名
   你要运行的sql语句
   SPOOL OFF
作为一个模版,只要将必要的语句假如这个模版就可以了。


在oracle的较新版本中,还可以用set colsep命令来实现上面的功能:
SQL> set colsep ,
SQL> select * from dept;
    10,ACCOUNTING  ,NEW YORK
    20,RESEARCH   ,DALLAS
    30,SALES     ,CHICAGO
    40,OPERATIONS  ,BOSTON
    35,aa      ,bb


3.动态生成spool命令所需的文件名
在我们上面的例子中,spool命令所需要的文件名都是固定的。有时我们需要每天spool一次,并且每次spool的文件名都不相同,如文件名包含当天的日期,该如何实现呢?
column dat1 new_value filename;
select to_char(sysdate,'yyyymmddhh24mi') dat1 from dual; 
spool c:\&&filename..txt 
select * from dept;
spool off;


4.如何从脚本文件中得到WINDOWS环境变量的值:
在windos中:
spool c:\temp\%ORACLE_SID%.txt
 select * from dept;
 ...
 spool off


在上面的例子中,通过%ORACLE_SID%的方式引用环境变量ORACLE_SID的值,如果ORACLE_SID的值为orcl,则生成的spool文件名为:orcl.txt


在UNIX中:
spool c:\temp\$ORACLE_SID.txt
 select * from dept;
 ...
 spool off


在上面的例子中,通过$ORACLE_SID的方式引用环境变量ORACLE_SID的值,如果ORACLE_SID的值为orcl,则生成的spool文件名为:orcl.txt


5.如何指定缺省的编辑脚本的目录
    在sql*plus中,可以用save命令,将上一条执行的sql语句保存到一个文件中,但是如何设置该文件的缺省目录呢?
通过SQL> set editfile c:\temp\file.sql 命令,可以设置其缺省目录为c:\tmpe,缺省文件名为file.sql。


6.如何除去表中相同的行
找到相同的行:
SELECT * FROM dept a  
WHERE ROWID <> (SELECT MAX(ROWID)
          FROM dept b
          WHERE a.deptno = b.deptno
          AND a.dname = b.dname -- Make sure all columns are compared
          AND a.loc = b.loc);


注释:
如果只找deptno列相同的行,上面的查询可以改为:
SELECT * FROM dept a  
WHERE ROWID <> (SELECT MAX(ROWID)
          FROM dept b
          WHERE a.deptno = b.deptno)


删除相同的行:
DELETE FROM dept a
WHERE ROWID <> (SELECT MAX(ROWID
                FROM dept b
                WHERE a.deptno = b.deptno
                AND a.dname = b.dname -- Make sure all columns are compared
                AND a.loc = b.loc);


注意:上面并不删除列值为null的行。


7.如何向数据库中插入两个单引号(’’)
Insert inot dept values(35,’aa’’’’bb’,’a’’b’);


在插入时,用两个’表示一个’。


8.如何设置sql*plus的搜寻路径,这样在用@命令时,就不用输入文件的全路径。
设置SQLPATH环境变量。
如:
SQLPATH = C:\ORANT\DBS;C:\APPS\SCRIPTS;C:\MYSCRIPTS


9.@与@@的区别是什么?
@等于start命令,用来运行一个sql脚本文件。
@命令调用当前目录下的,或指定全路径,或可以通过SQLPATH环境变量搜寻到的脚本文件。
@@用在脚本文件中,用来指定用@@执行的文件与@@所在的文件在同一目录,而不用指定全路径,也不从SQLPATH环境变量指定的路径中寻找文件,该命令一般用在嵌套脚本文件中。


10.&与&&的区别
&用来创建一个临时变量,每当遇到这个临时变量时,都会提示你输入一个值。
&&用来创建一个持久变量,就像用用define命令或带new_vlaue字句的column命令创建的持久变量一样。当用&&命令引用这个变量时,不会每次遇到该变量就提示用户键入值,而只是在第一次遇到时提示一次。


如,将下面三行语句存为一个脚本文件,运行该脚本文件,会提示三次,让输入deptnoval的值:
select count(*) from emp where deptno = &deptnoval;
select count(*) from emp where deptno = &deptnoval;
select count(*) from emp where deptno = &deptnoval;


将下面三行语句存为一个脚本文件,运行该脚本文件,则只会提示一次,让输入deptnoval的值:
select count(*) from emp where deptno = &deptnoval;
select count(*) from emp where deptno = &deptnoval;
select count(*) from emp where deptno = &deptnoval;


11.引入copy的目的
Copy命令在两个数据库之间拷贝数据时特别有用,特别是该命令可以在两个数据库之间传递long型字段的数据。
缺点:
在两个数据库之间传递数据时,有可能丢失精度(lose precision)。


12.问什么在修改大量的行时,我的脚本会变得很慢?
当通过PL/SQL块修改一个表中的许多行时,你会创建在表上创建一个cursor,但是只有在你关闭cursor时,才会释放ROLLBACK SEGMENT,这样,当cursor仍然打开时,修改过程会变慢,这是因为数据库不得不搜寻大量的rollback segment以便于维护读一致性。为了避免这样情况,试着在表上加一个标志字段来描述该行是否已经被修改,然后关闭该cursor,然后再打开该 cursor。每次可以修改5000行.


Oracle connect by 示例


SQL> create TABLE tb(ID   char(3),PID   char(3),Name  varchar(10)) ;


Table created.


SQL> INSERT  into tb SELECT   '001',NULL   ,'山东省'  from dual
  2    UNION   ALL   SELECT   '002','001','烟台市'     from dual
  3    UNION   ALL   SELECT   '004','002','招远市'     from dual
  4    UNION   ALL   SELECT   '003','001','青岛市'     from dual
  5    UNION   ALL   SELECT   '005',NULL   ,'四会市'     from dual
  6    UNION   ALL   SELECT   '006','005','清远市'     from dual
  7    UNION   ALL   SELECT   '007','006','小分市'   from dual   ;


7 rows created.




SQL> select id, pid, lpad(' ', level*2, ' ') || name newname from tb start with pid is null connect
by prior id = pid;


ID  PID
--- ---
NEWNAME
--------------------------------------------------------------------------------
001
  山东省


002 001
    烟台市


004 002
      招远市




ID  PID
--- ---
NEWNAME
--------------------------------------------------------------------------------
003 001
    青岛市


005
  四会市


006 005
    清远市




ID  PID
--- ---
NEWNAME
--------------------------------------------------------------------------------
007 006
      小分市




7 rows selected.


SQL>



Delete Oracle用户下的表及序列(drop.sql)


DECLARE
    v_table_name USER_TABLES.table_name%TYPE;
    v_sequence_name USER_SEQUENCES.sequence_name%TYPE;
    --两个游标定义
    CURSOR c_TableName IS 
        SELECT table_name FROM USER_TABLES;
    CURSOR c_SequenceName IS
        SELECT sequence_name FROM USER_SEQUENCES;
BEGIN
    --打开游标
    OPEN c_TableName;
    LOOP
        --获取表名
        FETCH c_TableName INTO v_table_name;




        --作删除表的操作
        DROP TABLE v_table_name;
        --DBMS_OUTPUT.PUT_LINE('表: ' || v_table_name);


        --退出循环的条件
        EXIT WHEN c_TableName%NOTFOUND;
    END LOOP;


    --关闭游标c_TableName
    CLOSE c_TableName;


    --打开序列系统游标
    OPEN c_SequenceName;
    LOOP
        --获取序列名
        FETCH c_SequenceName INTO v_sequence_name;


        --
        DROP SEQUENCE v_sequence_name;
        --DBMS_OUTPUT.PUT_LINE('表: ' || v_sequence_name);


        --
        EXIT WHEN c_SequenceName%NOTFOUND;


    END LOOP;
    --关闭游标c_SequenceName
    CLOSE c_SequenceName;
END;
/




C#捕获cmd输出示例


using System;
using System.Collections.Generic;
using System.Text;


using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;




namespace demo0
{
    class main
    {
        static void TestImp()
        {
            Process sqlProcess = new Process();
            sqlProcess.StartInfo.FileName = @"D:\Oracle\product\11.2.0\db1\BIN\imp.exe";
            sqlProcess.StartInfo.Arguments = string.Format("{0}/{1}@{2} FILE={3} FROMUSER={4} TOUSER={5}",
                "scott", "tiger", "ora102", "mock.dmp", "scott", "scott");
            sqlProcess.StartInfo.CreateNoWindow = true;
            sqlProcess.StartInfo.UseShellExecute = false;
            sqlProcess.StartInfo.RedirectStandardOutput = true;
            sqlProcess.StartInfo.RedirectStandardError = true;
            sqlProcess.Start();
            StreamReader sr = sqlProcess.StandardOutput;
            StreamReader sr2 = sqlProcess.StandardError;


            System.Console.WriteLine(sr.ReadToEnd());
            System.Console.WriteLine(sr2.ReadToEnd());
        }


        static void Main(string[] args)
        {
            TestImp();
        }
    }
}

上例就可以把一个imp操作的结果给dump出来。

2012年3月4日星期日

oracle10g server for win32的简装版(共50M)

本文为原创,如若转载本文,请尊重个人劳动,务必附上本文链接地址:
http://hi.baidu.com/hexiong/blog/item/70c00a7bd40392f80ad1870a.html 
作者:iihero@CSDN, hexiong@baidu

下载地址:
http://download.csdn.net/source/2405299 
http://download.csdn.net/source/2405301 

上一次整理这种工具已经是4年以前了。
重新弄了一下。原理比较简单。
1. 只要DB server所需要的主要目录及文件
2. 使用一个批处理文件一次性安装,无需安装程序.
3. 安装或携带非常方便, 尤其是对开发人员而言

有时间再试验11g for win32上的。以下是readme。
(免责声明): 
这是一个精简版的oracle10g for windows 32平台.
此压缩包,仅供学习研究使用,本文作者不负任何责任。切不可将其用于商业用途,请遵守
Oracle公司相关商业规定。如因私自将其用于商业用途,由此带来的法律纠纷或其它问题,
概与本人无关.
author: iihero@CSDN  (iiihero AT hotmail.com, iihero AT qq.com)

0. 如果你已经安装了别的版本的oracle,
请自行备份注册表:[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE], 这样即算有冲突,
你也可以重新导入以前的注册项而得已恢复

1. 将压缩包解压至目录,设该目录值为: <D>
其下将有目录:
<D>/oracle/*
<D>/oracle/10.1.0

2. 新的ORACLE_HOME将为:<D>/oracle/10.1.0
运行完iihero.ora10g.bat安装完以后,(一个批处理一次安装全部完成)
你需要将<D>/oracle/10.1.0/BIN添加到path里头
缺省的ORACLE_SID为iihero

3. 安装完以后,别忘了添加环境变量ORACLE_SID=iihero以及将%ORACLE_HOME%/bin
添加到PATH环境变量里头,在这之后,
即可使用sqlplus system/manager进入并修改密码,执行相关操作。

欢迎大家试用,如果发现有什么问题,可以与本人联系。

Oracle公司的几位创始人

Oracle共有三位创始人。 
1. Larry Ellison 
   Oracle公司的老大, 不是年纪最大,而是资格最大。现在只剩下这个创始人还在Oracle了,而且是绝对的权威。不知道他如果退了,谁会去接盘。 

2. Robert Miner 
   1941.11.23 - 1994.11.11, 死得太早了。他是男的。毕业于伊立诺斯大学。不是网上有些文章乱传的,弄成个女的,还居然说曾是ellison的女上司(有点搞)。他在Oracle早期发展过程中起着非常关健的作用。如果Ellison算是大脑,他就算是公司的心脏。两人合作的非常好。 
   可惜死于癌症。留下三个子女。 

3. Edward Oates 
   1946-, 68年毕业于San Jose州立大学,这个学校应该很一般。1996年就从Oracle退休了。做了一些别的公司的董事和顾问。 

现在只剩下Ellison了,如果他离开了自己掌控的甲骨文,不知道将会是什么样子。

DBCP连接池的最简单应用(用于ORACLE数据库)

鉴于有人问起DBCP直接用于JDBC连接的问题,我做了一个最简单的示例。所有资源来源于网上。它不需要什么Web容器,就是一简单的控制台应用。 

资源: 
http://apache.etoak.com//commons/pool/binaries/commons-pool-1.5.6-bin.zip 
http://labs.renren.com/apache-mirror//commons/dbcp/binaries/commons-dbcp-1.4-bin.zip 
http://download.java.net/maven/1/javaee/jars/javaee-api-5.jar 
当然,还有oracle jdbc要用的ojdbc14.jar (适用于oracle9i及以上版本) 

工程文件:放到这里了。http://dl.iteye.com/topics/download/210279f0-f752-37a6-969f-d58ba13cc394 

数据库连接信息: 
jdbc:oracle:thin:scott/tiger@sean-m700:1521:ora92 
sean-m700是主机名,ora92是oracle数据库的instance ID. 我手头的机器上没有安装oracle数据库,用的是很早以前的一个oracle9.2的拷贝,重新安装实例和相应服务得来的。 

源码如下:借化献佛,源码也是从网上得来的。(http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/doc/BasicDataSourceExample.java?revision=1100136&view=markup) 
Java代码  收藏代码
  1. /* 
  2. // 
  3. 33  // Here's a simple example of how to use the BasicDataSource. 
  4. 34  // 
  5. 35   
  6. 36  // 
  7. 37  // Note that this example is very similiar to the PoolingDriver 
  8. 38  // example. 
  9. 39   
  10. 40  // 
  11. 41  // To compile this example, you'll want: 
  12. 42  //  * commons-pool-1.5.6.jar 
  13. 43  //  * commons-dbcp-1.3.jar (JDK 1.4-1.5) or commons-dbcp-1.4 (JDK 1.6+) 
  14. 44  //  * j2ee.jar (for the javax.sql classes) 
  15. 45  // in your classpath. 
  16. 46  // 
  17. 47  // To run this example, you'll want: 
  18. 48  //  * commons-pool-1.5.6.jar 
  19. 49  //  * commons-dbcp-1.3.jar (JDK 1.4-1.5) or commons-dbcp-1.4 (JDK 1.6+) 
  20. 50  //  * j2ee.jar (for the javax.sql classes) 
  21. 51  //  * the classes for your (underlying) JDBC driver 
  22. 52  // in your classpath. 
  23. 53  // 
  24. 54  // Invoke the class using two arguments: 
  25. 55  //  * the connect string for your underlying JDBC driver 
  26. 56  //  * the query you'd like to execute 
  27. 57  // You'll also want to ensure your underlying JDBC driver 
  28. 58  // is registered.  You can use the "jdbc.drivers" 
  29. 59  // property to do this. 
  30. 60  // 
  31. 61  // For example: 
  32. 62  //  java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver \ 
  33. 63  //       -classpath commons-pool-1.5.6.jar:commons-dbcp-1.4.jar:j2ee.jar:oracle-jdbc.jar:. \ 
  34. 64  //       PoolingDataSourceExample 
  35. 65  //       "jdbc:oracle:thin:scott/tiger@myhost:1521:mysid" 
  36. 66  //       "SELECT * FROM DUAL" 
  37. */  
  38. /* 
  39. The Oracle connection URL for the thin client-side driver ojdbc14.jar has the following format: 
  40. jdbc:oracle:thin:[user/password]@[host][:port]:SID 
  41. jdbc:oracle:thin:[user/password]@//[host][:port]/SID 
  42.  
  43.   user - The login user name defined in the Oracle server. 
  44.  
  45.   password - The password for the login user. 
  46.  
  47.   host - The host name where Oracle server is running.  
  48.          Default is 127.0.0.1 - the IP address of localhost. 
  49.  
  50.   port - The port number where Oracle is listening for connection. 
  51.          Default is 1521. 
  52.  
  53.   SID  - System ID of the Oracle server database instance.  
  54.          SID is a required value. By default, Oracle Database 10g Express  
  55.          Edition creates one database instance called XE. 
  56. */  
  57.   
  58. import org.apache.commons.dbcp.BasicDataSource;  
  59. import javax.sql.*;  
  60. import java.sql.*;  
  61.   
  62. public class TestDataSource  
  63. {  
  64.   
  65.     /** 
  66.      * @param args 
  67.      */  
  68.     public static void main(String[] args)  
  69.     {  
  70.         System.out.println("Setting up data source.");  
  71.         String url = "jdbc:oracle:thin:scott/tiger@sean-m700:1521:ora92";  
  72.         DataSource dataSource = setupDataSource(url);  
  73.         System.out.println("Done...");  
  74.   
  75.         // Now, we can use JDBC DataSource as we normally would.  
  76.         //  
  77.         Connection conn = null;  
  78.         Statement stmt = null;  
  79.         ResultSet rset = null;  
  80.   
  81.         try {  
  82.             System.out.println("Creating connection.");  
  83.             conn = dataSource.getConnection();  
  84.             System.out.println("Creating statement.");  
  85.             stmt = conn.createStatement();  
  86.             System.out.println("Executing statement.");  
  87.             rset = stmt.executeQuery("select 1 from DUAL");  
  88.             System.out.println("Results:");  
  89.             int numcols = rset.getMetaData().getColumnCount();  
  90.             while(rset.next()) {  
  91.                 for(int i=1;i<=numcols;i++) {  
  92.                     System.out.print("\t" + rset.getString(i));  
  93.                 }  
  94.                 System.out.println("");  
  95.             }  
  96.         } catch(SQLException e) {  
  97.             e.printStackTrace();  
  98.         } finally {  
  99.             try { if (rset != null) rset.close(); } catch(Exception e) { }  
  100.             try { if (stmt != null) stmt.close(); } catch(Exception e) { }  
  101.             try { if (conn != null) conn.close(); } catch(Exception e) { }  
  102.         }  
  103.     }  
  104.   
  105.     public static DataSource setupDataSource(String connectURI) {  
  106.         BasicDataSource ds = new BasicDataSource();  
  107.         ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");  
  108.         ds.setUsername("scott");  
  109.         ds.setPassword("tiger");  
  110.         ds.setUrl(connectURI);  
  111.         return ds;  
  112.     }  
  113.   
  114.     public static void printDataSourceStats(DataSource ds) {  
  115.         BasicDataSource bds = (BasicDataSource) ds;  
  116.         System.out.println("NumActive: " + bds.getNumActive());  
  117.         System.out.println("NumIdle: " + bds.getNumIdle());  
  118.     }  
  119.   
  120.     public static void shutdownDataSource(DataSource ds) throws SQLException {  
  121.         BasicDataSource bds = (BasicDataSource) ds;  
  122.         bds.close();  
  123.     }  
  124.   
  125. }  

源码下载地址:
http://dl.iteye.com/topics/download/210279f0-f752-37a6-969f-d58ba13cc394