当前位置:首页 » 编程语言 » oraclesql总结

oraclesql总结

发布时间: 2023-02-05 15:33:06

sqlServer2005移植到Oracle10g经验总结

此次需要完成的目标是将库从SQLServer 完整的移植到Oracle g中 包括表结构 数据 视图 函数以及存储过程的移植 移植主要基于Oracle的OMWB(Oracle Migration Workbench)来完成 尽管OMWB能帮助完成大部分具备难度的工作 但还是有很多工作量的事情需要在OMWB完成后来手工进行 所以整个移植过程工作量看起来会非常大 但是不是仅仅只有工作量的问题呢?我觉得不是 写下这篇blog以便需要进行此项操作的同学以及给自己做个备忘

由于目前OMWB仅支持SQLServer 根据官方网站的消息 OMWB的下一版会推出对SQLServer 的支持 所以在目前的情况下只能先把库从SQLServer 移植到SQLServer 这就是我们移植过程的第一步了

一 SQLServer >SQLServer

一直以来 版本要降级都是很困难的 因为在新版本中必然会有些新的特性 而如果刚好凑巧你使用到了这些特性的话 在降级到低版本时就会碰到一些问题 在经过几次的尝试后 总结而言 这个过程还是比较容易做的 毕竟是同样的数据库 再怎么样也不会出太大的问题 不过也没有像将库从SQLServer 升级为SQLServer 那么简单 整个移植过程这么进行

基于SQLServer 的数据导出将表结构和数据导入到SQLServer

这步中需要注意的是默认情况下SQLServer会将表和视图一起导入 在这里不要选择视图 否则导入到SQLServer 后有些视图会变成表 选择需要导入的表后基本上这步不会出现什么问题 可以完成表结构和数据的移植

基于SQLServer 的生成脚本将视图/函数/存储过程移植到SQLServer

这步需要慢慢来 因为在视图/函数/存储过程中你可能使用到了一些SQLServer 的新特性 如果碰到这样的情况 只能是手工进行修改 以使它完全符合SQLServer 的要求 尽管在生成脚本时你可以选择生成的目标版本为SQLServer 但还是会有部分脚本执行是会出错的

在完成了SQLServer 到SQLServer 的移植后 就可以基于OMWB来把库从SQLServer 移植到Oracle了 这步尽管有工具 还是会比较的麻烦 总结如下

二 SQLServer >Oracle g

关于如何基于OMWB将库从SQLServer 移植到Oracle g的操作步骤可参见此篇文档

op/omwb/

大家现在从oracle官方站下的话可能会找不到sqlserver 的插件包 如果找不到的话可以从这里下载

我在这里要总结的是基于OMWB将库从SQLServer 移植到Oracle g后还需要手工做的一些事情 不要指望OMWB能无缝的帮你把库从SQLServer移植到Oracle中 银弹是不存在的 因此我们需要做些手工的工作完成库的移植

移植表结构和数据可能会出现的问题

表中字段的默认值/主键/外键/索引移植不过去 这些需要手工的进行补充

移植视图可能会出现的问题

移植过去的视图可能会出现各种语法错误的问题 这需要手工的修正 一般来说都是较为简单的错误

另外一种问题就是有些视图可能会无法移植过去 这些视图就只能在对比OMWB的移植报告后找出来手工的进行移植了

移植函数/存储过程可能会出现的问题

移植过去的函数/存储过程中可能仍然会有不少的语法问题 例如像SCOPE_IDENTITY() REPLICATE newid()这些OMWB不知道该怎么处理的函数 还有像返回Table类型的这种函数 这些都只能在移植后手工的来进行纠正 关于函数不同造成的语法错误的现象大家可以参看这篇文档来做SQLServer和Oracle函数的对照

?logID=

移植过去的函数/存储过程可能编译是没有问题 也就是Oracle认为没有语法问题 但执行起来却会报错 像字符串相加 经过OMWB移植后有些字符串相加会替换成|| 但是有些会遗漏 这个时候也只能手工来纠正这些错误了

移植过去的函数/存储过程在执行过程中可能会出现某些表的主键值不能为空的现象 造成这种现象的原因多数为在SQLServer中该字段的默认值定义的为IDENTITY 但在Oracle中没法赋予这样的默认值 只能在插入的sql语句中加上对于主键字段的赋值 可采用sequence的方式来生成顺序号

移植过去的函数/存储过程中如果其中的查询语句是采用字符串的方式 然后动态执行的话 这个时候的查询语句就得手工修改为符合oracle的语法了 因为OMWB在移植时是不会对字符串形式的查询语句来做处理的

部分函数/存储过程会由于OMWB确实无法处理 造成移植不到oracle 这个时候也必须参照OMWB的移植报告找出这些函数/存储过程来手工移植了

整个移植过程可能会碰到比上面所列出的更多的别的问题 可以看出整个移植过程确实需要耗费不小的工作量 但总体而言 完成的难度并不高

其实真的是这样吗?当然不是 就算你完成了上面的移植工作 那也只能说表面看上去移植是完成了 很有可能会出现这个存储过程语法等等都没有问题了 但执行的效果和SQLServer就是不一样 这是为什么呢?可能会是因为Oracle和SQLServer在并发控制 事务机制上是不同的 而这会影响到程序调用时的sql的编写 存储过程的编写等等 也就是说 在上面的移植过程的工作完成后 还得仔细检查现在的sql语句/函数/存储过程是否根据Oracle的机制达到了原来在SQLServer中期望的效果 只有做到这步的效果是一样的 才可以说移植过程完成了

最后顺带说的就是应该根据Oracle的机制来采用符合oracle优化原则的方法来优化表/视图/函数/存储过程 如果不做这步的话 从sqlserver移植到oracle估计意义也不大了 当然 这可以不列为移植过程的工作

lishixin/Article/program/Oracle/201311/16982

⑵ oraclePL/SQL之隐式游标和ref游标总结

游标是构建在PL/SQL中 用来查询数据 获取记录集的指针 它让开发者 一次访问结果集中一行记录 在oracle中提供了两种游标 静态游标 ref游标

静态游标 静态游标是在编译的时候就被确定 然后把结果集复制到内存中 静态游标又分为两种 隐式游标和显示游标

ref游标 ref游标是在运行的时候加载结果集

先来看看静态游标中的隐式游标 在PL/SQL中为所有的SQL数据操纵语句(包括返回一行的select)隐式声明游标 称为隐式游标 主要原因是用户不能直接命名和控制此类游标 当用户在PL/SQL 中使用数据操纵语句(DML)时 oracle预先定义一个名称为SQL的隐式游标 通过 检查隐式游标的属性获取与最近执行的SQL语句相关信息 在执行DML语句之后 隐式游标属性返回信息 隐式游标属性包括 %found %notfound %rowcount %isopen

%found 只有DML语句影响一行或多行时 %found属性才返回true declare num number; begin update emp set empno= where empno= ; if sql%found then dbms_output put_line( 存在记录 ); else dbms_output put_line( 不存在记录 ); end if; end;

%notfound %notfound属性作用正好跟%found属性相反 如果DML语句没有影响任何行数 则%notfound属性返回true declare begin delete from emp where empno= ; if sql%notfound then dbms_output put_line( 删除失败 ); end if; end;

%rowcount %rowcount属性返回DML语句影响的行数 如果DML语句没有影响任何行数 则%rowcount属性将返回 declare num number; begin update emp set empno= where empno= ; if sql%rowcount= then dbms_output put_line( 不存在记录 ); else dbms_output put_line( 存在记录 ); end if; end;

%isopen %isopen属性判断SQL游标是否已经打开 在执行SQL语句之后 oracle自动关闭SQL 游标 所以隐式游标的%isopen属性始终为false

在PL/SQL中向标准的select语句增加单独的into子句 就可以将从表或视图中查询 记录赋予变量或行变量 需要注意的是select into 语句结果必须有且只能有一行 如果查询没有返回行 PL/SQL将抛出no_data_found异常 如果查询返回多行 则抛出 too_many_rows 异常 如果抛出异常 则停止执行 控制权转移到异常处理部分(没有 异常处理 则程序中断) 在引发异常时 将不使用属性%found %notfound %rowcount来查明DML语句是否 已影响了行数 declare num number; begin select empno into num from emp where empno= ; if sql%rowcount= or sql%notfound then dbms_output put_line( 不存在记录 ); else dbms_output put_line( 存在记录 ); end if; end;

显示游标 显示游标是由用户显示声明的游标 根据在游标中定义的查询 查询返回的行集合可以 包含零行或多行 这些行称为活动集 游标将指向活动集中的当前行 显示游标的操作过程 使用显示游标的 个步骤 ( )声明游标 ( )打开游标 ( )从游标中获取结果集 ( )关闭游标 cursor cursor_name [(parameter[ parameter])] [return return_type] is select_statement; cursor_name 指游标的名称 parameter 为游标指定输入参数 return_type 定义游标提取行的行类型 select_statement 为游标定义查询语句 open 游标名称 fetch 从游标中提取行 close 关闭游标

打开游标 执行游标中定义的查询语句 绑定输入参数 将游标指针指 向结果集的BOF位置 open cursor_name [parameters]

fetch 在打开游标之后 可以从游标中提取记录 fetch cursor_name into variable_name; fetch 是提取结果集中一行记录存储在变量中 每次提取之后 结果集指针 就向前移动一行

close 在处理游标中的所有行之后 必须关闭游标 以释放分配给游标的所有资源 close cursor_name 用户可以通过检查游标属性来确定游标的当前状态 显示游标的属性如下 %found 如果执行最后一条fetch语句 成功返回行 则%found属性为true %notfound 如果执行最后一条fetch语句 未能提取行 则%notfound属性为true %isopen:如果游标已经打开 则返回true 否则返回false %rowcount 返回到目前为止游标提取的行数 %rowcount为数字类型属性 在第一 次获取之前 %rowcount为零 当fetch语句返回一行时 则该数加 declare info emp%rowtype; cursor my_cur is select * from emp where empno= ; begin open my_cur; dbms_output put_line(my_cur%rowcount); loop if my_cur%isopen then fetch my_cur into info; exit when my_cur%notfound; dbms_output put_line(info empno); dbms_output put_line(my_cur%rowcount); end if; end loop; close my_cur; end;

使用显示游标删除或更新 使用游标时 如果处理过程中需要删除或更新 在定义游标查询语句时 必须使用select for update语句 而在执行delete或update时使用 where current of 子句指定游标当前行 cursor cursor_name is select_statement for update[of column] wait/nowait 在使用for update 子句声明游标之后 可以使用以下语法更新行 update table_name set column_name=column_value where current of cursor_name; update命令中使用的列必须出现在for update of 子句中 select 语句必须只包括一个表 而且delete和update语句只有在打开游标并且提取 特定行之后才能使用 declare cursor cur_emp is select * from emp where sal< for update of sal; num emp%rowtype; begin open cur_emp; loop fetch cur_emp into num; exit when cur_emp%notfound; update emp set sal= where current of cur_emp; end loop; close cur_emp; end;

带参数的显示游标 PL/SQL中允许显示游标接受输入参数 用于声明带参数的显示游标语法 cursor cursor_name[<param_name> data_type] [return <return type>] is select_statement declare dept_num emp deptno%type; emp_num emp empno%type; emp_nam emp ename%type; cursor emp_cur(deptparam number) is select empno ename from emp where deptno=deptparam; begin dept_num :=&部门编号; open emp_cur(dept_num); loop fetch emp_cur into emp_num emp_nam; exit when emp_cur%notfound; dbms_output put_line(emp_num|| ||emp_nam); end loop; close emp_cur; end;

可以使用循环游标来简化显示游标 循环游标隐式打开显示游标(不需要open) 自动从结果集提取记录 然后处理完所有记录自动关闭游标 循环游标自动创建 %rowtype类型的变量并将此变量用做记录的索引 循环游标语法如下 for record_index in cursor_name record_index是PL/SQL自动创建的变量 此变量的属性声明为%rowtype类型 作用 域for循环之内 循环游标的特性有 从游标中提取所有记录之后自动关闭游标 提取和处理游标中每一条记录 提取记录之后%notfound属性为true则退出循环 如果未有结果集 则不进入循环 declare cursor emp_cur is select * from emp; begin for temp in emp_cur loop dbms_output put_line(temp ename); end loop; end; 循环游标自动打开 提取 关闭 只适用于静态游标

ref游标 隐式游标和显示游标都是静态定义的 它们在编译的时候结果集就已经被确定 如果想在运行的时候动态确定结果集 就要使用ref游标和游标变量

创建ref游标需要两个步骤 声明ref cursor类型 声明 ref cursor类型变量 语法如下 type ref_cursor_name is ref cursor [return record_type] 其中 return 用于指定游标提取结果集的返回类型 有return表示是强类型ref游标 没有return表示是弱类型的游标 弱类型游标可以提取任何类型的结果集 定义游标变量之后 就可以在PL/SQL执行部门打开游标变量 open cursor_name for select_statement; declare type emp_cur is ref cursor; my_cur emp_cur; num number; selection varchar( ):= &请输入编号 ; begin if selection= then dbms_output put_line( 员工信息 ); open my_cur for select deptno from emp; elsif selection= then dbms_output put_line( 部门信息 ); open my_cur for select deptno from dept; else dbms_output put_line( 请输入员工信息( )或门部信息( ) ); end if; fetch my_cur into num; while my_cur%found loop dbms_output put_line(num); fetch my_cur into num; end loop; close my_cur; end;

在PL/SQL中可以执行动态SQL语句 execute immediate 语句只能语句处理返回单行 或没有返回的SQL语句 ref游标则可以处理返回结果集的动态SQL ref游标的声明 方法与普通ref游标相同 只是在open时指定了动态SQL字符串 open cursor_name for dynamic_select_string [using bind_argument_list] declare type sql_cur is ref cursor; my_cur sql_cur; emp_info emp%rowtype; sql_string varchar ( ):= &请输入查询字符串 ; begin open my_cur for sql_string; loop fetch my_cur into emp_info; exit when my_cur%notfound; dbms_output put_line(emp_info ename); end loop; close my_cur; end;

lishixin/Article/program/Oracle/201311/18462

⑶ 总结Oracle与mysql在SQL语言方面的不同点

1 id递增 oracle使用sequence ;mysql使用auto_increment

2 分页 oracle使用rownum(3个select语句);mysql使用limit

3 当前时间 oracle:sysdate;mysql:now()

4 数据类型不同!--具体的查资料!

目前想到的就这些,呵呵……

⑷ oracle sql

substr(substr(content_clob,1,instr(content_clob,'的')-1),-length(content_clob),50)

⑸ ORACLE 和 SQL区别

这两种数据库在不同方面都有着很大的区别,以下是具体的区别:

1.开放性: 1. SQL Server 只能在windows上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据库。 2. Oracle 能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。

2.可伸缩性:并行性 1. SQL server 并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。 2. Oracle 并行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案。如果windowsNT不能满足需要,用户可以把数据库移到UNIX中。Oracle的并行服务器对各种UNIX平台的集群机制都有着相当高的集成度。

3.性能: 1. SQL Server 多用户时性能不佳 2. Oracle 性能最高, 保持开放平台下的TPC-D和TPC-C的世界记录。

4.客户端支持及应用模式 :1. SQL Server C/S结构,只支持windows客户,可以用ADO、DAO、OLEDB、ODBC连接。 2. Oracle 多层次网络计算,支持多种工业标准,可以用ODBC、JDBC、OCI等网络客户连接。

5.操作简便性: 1. SQL Server 操作简单,但只有图形界面。 2. Oracle 较复杂,同时提供GUI和命令行,在windowsNT和unix下操作相同。

6.使用风险性 :1. SQL server 完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容。 2. Oracle 长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。

7.价格:ORACLE贵过SQLSRVER

⑹ 使用oracle数据库总结

去ORACLE的网站下载一个个人版本的ORACLE安装程序,下个10G版本吧
然后安装,全点下一步,或者你看他给你的中文提示下一步安装就可
建立数据库的话安装会给你装的
装完要配置NET MANAGER里的监听程序 点添加数据库 输服务名和路径
然后还要配置服务名
然后就可以用SQL PLUS登陆了
默认的帐户
sys 密码 change_on_install
system密码 manager
装完cmd sqlplus /nolog 然后conn sys/change_on_stall as sysdba
默认的话会有个样本用户scott下面有一些表 里面还有数据,但是scott用户默认是锁定的,上面conn sys/change_on_stall as sysdba以后,再输alter user scott account unlock;然后就可以conn scott/tiger了,然后就可以select * from emp;了记得连接完后一般SQL语句都要用‘;’分号结束。

简单说了下,里面还有很多细节,可以加我HI BAIDU
最好找本oracle 10g入门的书看看

⑺ 总结MySql,Mssql,Oracle的优缺点和异同

1。oracle体积最大,MsSQL体积大,MySQL体积小。
2。MsSQL只能用在Windows下,MySQL、oracle是多平台的.
3.MsSQL要钱,MySQL免费的(windows下是收费的,但很少),oracle(免费使用)官方提供下载,呵呵
如果要技术支持
巨贵。

热点内容
sqlupdatewhereand 发布:2024-05-04 13:55:47 浏览:584
java视频教程推荐 发布:2024-05-04 13:55:08 浏览:84
安卓官服闪耀暖暖怎么换 发布:2024-05-04 13:46:37 浏览:169
我的世界精灵服务器怎么抓宠物 发布:2024-05-04 13:28:54 浏览:959
编译androidwebkit 发布:2024-05-04 13:11:37 浏览:761
安卓微信流量怎么控制 发布:2024-05-04 12:47:19 浏览:799
mysql主从复制数据库 发布:2024-05-04 12:37:55 浏览:512
开公司人员配置不够有什么影响 发布:2024-05-04 12:32:21 浏览:435
rust网络编程和ftp 发布:2024-05-04 12:32:21 浏览:63
微信怎么知道账号密码 发布:2024-05-04 12:20:06 浏览:978