◎筱米加步枪◎.Blog

Happy coding

64位Windows7下安装Oralce10g客户端过程.

本想尝试在不安装客户端的情况下使用PLSQL访问数据库服务器 .但是后来还是失败了.

于是在Windows7(64位)下安装了Oracle10g的客户端后,使用PLSQL尝试连接,总提示一个空白框.很无奈.百度谷歌了许久才找到解决方法.

摘自网上的:

1.到oracle官网下载Oracle InstantClient,我下的是instantclient-basiclite-win32-10.2.0.4.zip,把它解压缩到oracle安装目录product下,其中还有一个目录为10.2.0.在其中的db_1/NETWORK/ADMIN目录下拷贝tnsnames.ora文件到InstantClient解压目录.
2.非登录状态下进入PL/SQL developer,进入首选项,在connection中设置Oracle_Home和OCI Library,其中Oracle_Home设置为InstantClient的解压目录,OCI Library设置为该目录下的oci.dll.

最后设置环境变量:

set path=instantclient的路径
set TNS_ADMIN=tnsnames.ora文件的目录

使用PLSQL尝试登录,成功.

PS:如果出现ORA-12705:无法访问NLS数据文件,或者指定的环境无效错误,把环境变量中NLS_LANG的变量删除掉

有关Oracle中的Blob字段更新问题

先说下偶遇到的问题:

Oracle中我使用Blob字段来存一个Xml内容.新增一条记录正常,但是尝试用一条记录去更新已经存在的记录.

发现Blob中的字段中的内容并没有被更新掉.


网络上的一些朋友说原因如下:

假设Blob字段中已经存在的内容是100个字节,那么尝试用50字节的内容去更新,

那么得到的结果就是:前面50个字节被覆盖,而Blob仍然存在100个字节,其中后面50个字节是原先的后50个字节.


那么解决的方法如下:(证实可以通过)

先清空原Blob字段中的数据,再进行字节的写入.(与平常的更新操作会多了一步).

具体的更新方法如下:

UPDATE 表名 SET BLOB字段=EMPTY_BLOB() WHERE 条件.

然后再执行具体的更新SQL语句.

ORA-01034 ORACLE not available ORA-27101 Shared memory realm does not exist错误解决方案.

解决好创建实例问题之后,使用PL/SQL连数据库报如下错误:

ORA-27101 Shared memory realm does not exist
ORA-01034 ORACLE not available 

谷歌了很久很久,才找到解决方案,网上大多数方案都不行.很佩服这个牛人.

偶不是Oracle专家,不说原因了..直接说明怎么解决问题的吧.

1.打开命令窗口输入:lsnrctl start

2.出现监听程序启动成功之后,继续输入: sqlplus '/as sysdba'

3.连接成功后输入startup

4.出现成功信息后再使用PL/SQL登录,发现登录成功.

贴个截图:

Oracle服务误删除的解决办法(360搞的)

之前有一次遇到这个问题,ORACLE.exe莫名奇妙的被360给删除了,上次选择了还原系统来解决,这次不知何时又被删除了.害我搞了一个晚上

无奈之下只好百度谷歌到处搜索.搜索到如下命令可建Oracle实例.(可弄成一个bat文件)

oradim -NEW -SID orcl -STARTMODE manual -PFILE F:\oracle\product\10.2.0\admin\ORCL\pfile\initorcl.ora"  
oradim -STARTUP -SID ORCL -STARTTYPE inst

其中红色部分为自己的Oracle实例.

顺便贴个删除Oracle实例的命令:

oradim -DELETE -SID orcl

完成之后重启便可.

若登录数据库时出现如下错误 :

ora-01034:oracle not available

ora-27101:shared mermory realm does not exist

请看文章:http://cst.is-programmer.com/posts/23753

Oracle出现ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务解决方法

遇到此问题多次了,于是决定记一下.

找到listener.ora文件打开,

# listener.ora Network Configuration File: f:\oracle\product\10.2.0\db_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = f:\oracle\product\10.2.0\db_1)
      (PROGRAM = extproc)
    )
      (SID_DESC =
        (GLOBAL_DBNAME = ORCL)
        (ORACLE_HOME = f:\oracle\product\10.2.0\db_1)  
        (SID_NAME = ORCL)
    )

  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
    )
  )

上面红色标记部分为增加的部分,根据具体数据库安装的不同,分别更改GLOBAL_DBNAME、ORACLE_HOME、SID_NAME三个值,然后重新启动Oracle服务即可

Oracle split函数的用法

split函数故名思意就是用来分割字符串。做了个简单的实验:

看SQL语句:

Select * From Table (Split('1#2#3#4','#'))

得到的结果如下:

若想要把分割出来的记录与其他相关表进行关联查询,使用这张表与其他表进行关联即可。

Oracle Number的精度问题

今天写建表的脚本时,设置数据类型为Number(2,2),以为前面的这个参数是代表整数的位数,后面的参数是代表整数的未数,结果报出“精度错误”的问题,百度得到:

原来Number(P,S)是代表总共P位数,其中小数有S位

卸载Oracle10g步骤

很郁闷的不知道为啥的装Oracle10g就出错了,无法创建实例等问题。于是就想到先卸载,但是之前听说Oracle的卸载异常麻烦,之前是用9i的,听过如果第一次装失败,基本上要重装系统了。不过今天百度了下,并且按照里面的做了,接着再装Oracle就可以了,于是记录下具体卸载方法:(摘自网上)

    0、开始->设置->控制面板->添加删除程序-> Oracle Data Provider for .Net Help
    1、开始->设置->控制面板->管理工具->服务停止所有Oracle服务;
    2、开始->程序->Oracle – OraDb10g_home1>Oracle Installation Products-> Universal Installer 卸装所有Oracle产品,但Universal Installer本身不能被删除;
    3、运行regedit,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del键删除这个入口;
    4、运行regedit,选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滚动这个列表,删除所有Oracle入口;
    5、运行regedit,选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application,删除所有Oracle入口;
    6、开始->设置->控制面板->系统->高级->环境变量,删除环境变量CLASSPATH和PATH中有关Oracle的设定;
    7、从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标;
    8、删除c:\Program Files\Oracle目录;
    9、重新启动计算机,重起后才能完全删除Oracle所在目录 ;
    10、删除与Oracle有关的文件,选择Oracle所在的缺省目录C:\Oracle,删除这个入口目录及所有子目录,并从Windows XP目录(一般为d:\WINDOWS)下删除以下文件ORACLE.INI、oradim73.INI、oradim80.INI、oraodbc.ini等等;
    11、WIN.INI文件中若有[ORACLE]的标记段,删除该段;
    12、如有必要,删除所有Oracle相关的ODBC的DSN(管理工具/数据源(ODBC));
    13、到事件查看器(管理工具/事件查看器)中,删除Oracle相关的日志(只能删除所有,右击某个目录,清除所有事件)

其中有很多步我都没用到,可能是因为刚刚装完的缘故吧。还没产生其他垃圾数据和文件。

Oracle 横表和纵表

前一段时间了解到的,今天有空写下,备忘~

先来说说横表和纵坐表的概念,先来看看以下两图:

第一张图就是横表,一行表示了一个实体记录,这就是我们传统的设计表的形式

第二张图就是纵表,他的一行记录,是用于表示某个学生的属性名和属性值对应关系,像这边有两个属性(名字和性别),在纵表中就要用两条记录来表示一个学生。

从上面可以观察出,横表的好处是清晰可见,一目了然,但是有一个弊端,如果现在要把这个表加一个字段,那么就必须重建表结构。对于这种情况,在纵表中只需要添加一条记录,就可以添加一个字段,所消耗的代价远比横表小,但是纵表的对于数据描述不是很清晰,而且会造成数据库数量很多,两者利弊在于此。所以,应该把不容易改动表结构的设计成横表,把容易经常改动不确定的表结构设计成纵表。

在实际开发中,经常需要互相转换横表和纵表的形式,这里贴个从纵表数据转成横表显示的形式。

Select student_no, 
        max(decode(field_name,'student_name',field_value)) As student_name,
        max(decode(field_name,'student_sex',field_value )) As student_sex 
    From cuc_student_y Group By student_no;

横转纵暂时不知~~望高人指点~~

Oracle 树状查询

在实际应用中,经常利用数据库保存树状结构的数据,通常用一张表中的两个字段表示,一个是自身的ID,一个是保存父类的ID。在这样具有这种关系中的数据,要求查出的数据具有我们想要的树状显示。这里需要引入Oracle的一个查询语句。

Select  *  from tablename
  start with [condition1]
  Connect By Prior  [condition2]
  where [condition3] 

condition1 通常是用于筛选某颗树或者多颗树的结点,这里所的树包括子树,

condtion2 通常是用于连接父结点和子结点的关系,prior 所表示的是上一条记录,通常用法:prior id = pid,(上一条的的ID号是本条记录的父类ID号)这样就把整个树状结构给建立起来了。

conditon3 就是我们通常的where语句,过滤某些记录。

现在看下具体例子。

其中Test_ID 表示本身的ID,Test_PID表示父类的ID

这边记录的描述成树状结构就是如下:

现在,假设我们查询的福州以及福州下的所有子东西,就可以这样查询,

只要取福州的根结点就可以,福州的根结点翻译成数据库中存的数据就是 test_id =1

因此得到的sql如下:

Select * From Test_ t 
  Start With Test_Id = 1
  Connect By Prior Test_Id = Test_Pid

查询结果:

用结构图表示就是如下信息:

因此想要查询某些信息,只要抓住根结点的条件就可以。。Over~~