如果表中有数据,Oracle是不能修改其数据类型的。但可以通过新建一个临时列,将要修改列的数据复制到临时列中,删除原列再修改临时列的名字。这样说好像有点拗口,分步解说一下。
表AC_REG中有列:is_active,原来是字符类型的,目标是将它改为数值类型
--新增一列
alter table AC_REG add is_active_temp number(1);
--将IS_ACTIVE的值,赋给is_active_temp
update AC_REG set is_active_temp = cast(is_active as number(1));
--删除原来的列
alter table AC_REG drop column is_active;
--修改名称
alter table AC_REG rename column is_active_temp to is_active;
本文链接:http://www.cnblogs.com/Gyoung/p/3144679.html,转载请注明。
软件环境:64位win7、32位Oracle 10g、 PL/SQL 9.0.4.1644
前言:以前开发用的都是32位系统,突然换到64位上,安装环境真的有点麻烦了,尤其对于PL/SQL只支持32位等。看了很多的资料,但一些问题并不能直接解决。花了一天时间终于安装成功了,下文将安装过程中遇到的问题记录下,以便作为以后的参照,也希望对大家解决类似问题有用。
原因:权限问题,需要有高级管理员权限;
解决方法:win7系统内置administor高级管理员账户。开启后在此账户下安装即可。
开启方法:右键【我的电脑】-【管理】-【计算机管理】-【系统工具】-【本地用户和组】-【用户】-右键【Administrator】-【属性】-取消【账户已禁用】选中状态-重启电脑即可,如图:
2. 情景:安装pl/sql,连接不到Oracle,出现异常:Oracle-12154
原因:pl/sql是32位的,不能加载64位的oci.dll(oracle的文件)
解决方法:
- 去Oracle官网下载instantclient-basiclite-win32-10.2.0.4.zip 或instantclient-basic-win32-10.2.0.4.zip;
- 将文件解压到“D:\oracle\product”下(我Oracle安装路径是这样的);
- 将“D:\oracle\product\ db_1\NETWORK\ADMIN”下的tnsnames.ora拷贝到“D:\oracle\product\ instantclient_10_2”;
- 非登录状态下进入PL/SQL developer,进入【tools】-【Preferences】,在connection中设置Oracle_Home和OCI Library,其中Oracle_Home设置为InstantClient的解压目录,OCI Library设置为该目录下的oci.dll;
- 添加环境变量:
Path=D:\oracle\product\instantclient_10_2;
ORACLE_HOME= D:\oracle\product\instantclient_10_2
TNS_ADMIN= D:\oracle\product\instantclient_10_2
NLS_LANG= AMERICAN_AMERICA.AL32UTF8
- 重新登录pl/SQL 即可;
3. 情景:代码中采用NHibernate,连接Oracle时出错 oracle-12154 TNS:
原因:注册表中的ORACLE_HOME变量值不正确导致的,指向的路径为oracle的原路径,不是上一步更改的路径。
解决方法:【开始】-【输入regedit】-【回车】-【搜索ORACLE_HOME】-【修改值为:D:\oracle\product\instantclient_10_2(根据自己的情况设定)】-【重启机器】
本文链接:http://www.cnblogs.com/muzihai1988/p/ORALCE.html,转载请注明。
前一天晚上做大表删除操作测试,分段删除,没删除100000条commit一次,由于存储过程打印了执行时间中途断网,无法看到执行时间
于是直接kill了任务
结果早上登录测试数据库发现空间爆满
然后一时糊涂去弄了表的shrink跟dbms_stats.gather_table_stats想着收缩表释放空间
弄到一半突然想起,表的收缩最多是释放表空间的空闲空间,并非系统空间
后来想想,大量删除反复操作过程引发了undo的扩展,后来检查表空间后确实如此
最后在线更换undo tablespace后删除原tablespace后恢复
附上存储过程
i number(15);
l_start number default dbms_utility.get_time;
begin
dbms_output.put_line('begin time:'||to_char(SYSTIMESTAMP,'HH24:MI:SS:FF2'));
i:=0;
for x in (select log_id from user_log where user_log_id<46380000)
loop
delete from user_log where user_log_id = x.user_log_id;
i:=i+1;
if (i>10000) then
begin
--dbms_output.put_line('delete ok.'||i);
commit;
i:=0;
end;
end if;
end loop;
commit;
dbms_output.put_line('ok.end time:'||to_char(SYSTIMESTAMP,'HH24:MI:SS:FF2'));
exception when others then
rollback;
end;
/
另外调试时记得 set serveroutput on
遇到的报错提示
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jun 21 09:23:18 2013
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
ERROR:
ORA-09817: Write to audit file failed.
Linux-x86_64 Error: 28: No space left on device
ORA-01075: you are currently logged on
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
ERROR:
ORA-01017: invalid username/password; logon denied
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
检查磁盘空间,爆满
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 93G 89G 0 100% /
/dev/sda1 99M 12M 82M 13% /boot
tmpfs 1006M 0 1006M 0% /dev/shm
想着收缩下大表就有空间了,,,糊里糊涂开始shrink
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jun