加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹰潭站长网 (https://www.0701zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Oracle与MSSQL过程之间的转化

发布时间:2023-01-08 12:30:48 所属栏目:MsSql教程 来源:网络
导读: 《Oracle与MSSQL过程之间的转化》由会员分享,可在线阅读,更多相关《Oracle与MSSQL过程之间的转化(10页珍藏版)》请在人人文库网上搜索。
1、以下面两个过程为例。两者的功能相似。1.MSS

《Oracle与MSSQL过程之间的转化》由会员分享,可在线阅读,更多相关《Oracle与MSSQL过程之间的转化(10页珍藏版)》请在人人文库网上搜索。

1、以下面两个过程为例。两者的功能相似。1.MSSQL脚本/*更改表名*/Beg indeclaretempPoTableNamevarchar ( 50)-性能对象表名declaretempPoSpName varchar ( 50)-性能过程名declareerrorInfo varchar ( 200 )-错误信息declarecnt int-计数器declarete mp SQLvarchar ( 1000 )-定义表名、同步表名和存储过程游标set te mp SQL = ' declare allValues_Cursor cursor for '+CHAR(13) +

2、 CHAR( 10)set te mp SQLte mp SQL + ' select PO TABLENAME,POSPNAME from PM NEPODEF TABLEWHERE P OID>110499 and P OIDv11O58O'EXEC ( tempSQL )OPEN allValues Cursor-判断是否由符合游标条件的行,如果没有则关闭和释放游标,异常 返回IF ( CURSOR_ROWS= 0 )BEGINCLOSE allValues CursorDEALLOCATE allValues Cursorset errorInfo='没有

3、指定表名或存储过程名!printerrorI nfo returnENDprint'开始更改原有表名INTO tempFETCH NEXT FROM allValues CursorPoTableName , tempPoSpName-根据给定的表名、存储过程名创建相应的数据存储存储过WHILE (FETCH_STATUS - 1)BEGINprintte mpPo TableNameIF (EXISTS ( SELECT name from sysobjects WHERE name =te mpPo TableName )BEGINset te mp SQL

4、9;ALTER TABLE '+ te mpP oTableName +' DR OPconstraint PK '+ te mpP oTableNameEXEC ( tempSQL)set te mp SQLte mpP oTableName +'_T MP'EXEC Sp_re nametempPoTableName , tempSQLENDELSEBEGINpri nt'没有找到表'+ te mpPo TableNameENDIF ( EXISTS ( SELECT namefrom sysobjectsWHEREname=temp

5、PoSpName )BEGINset te mp SQL'DROP P ROCEDURE '+ te mpPoSpName;EXEC ( tempSQL )ENDELSEBEGINprint '没有找到过程+tempPoSpName ;ENDFETCHNEXT FROMallValues CursorINTO te mpP oTableName,tempPoSpNameENDCLOSE allValues CursorDEALLOCATE allValues Cursorpri nt'结束更改原有表名ENDGOpri nt2.ORACLE脚本SELECT 1 I

6、NTO cnt1FROMdual WHERE exists ( SELECT table_nameBEGINDECLAREtempPo TableNamevarchar2 ( 50);-性能对象表名tempPoSp Name errorInfovarchar2 ( 50);varchar2 ( 200);-性能过程名-错误信息tem pSQLvarchar2 ( 1000 );cnt1cnt2number ( 1);number ( 2);-定义表名、同步表名和存储过程游标Cursor allValues CursorisselectUPP ER(TRIM (PO TABLENAME),UPP

7、 ER(TRIM (POSPN AME)fromPM NEPODEF TABLEWHEREPOID >110499 and POID

8、t1:=0;cnt2:=0;BEGINMSSQ的总体结构如下,只需要一个begin和end,中间加入变量声明。SELECT 1 INTO cnt2 FROMdual WHERE exists ( SELECT OBJECT_NAMEFROMuser_ proceduresWHERE OBJECT_NAME = tempPoSpName);exce ptionWHENno data foundTHENnullEND;IF cnt11 THENDBMS_OUT PUT.P UT_LINE(te mpPo TableName);te mp SQL :'ALTER TABLE 'II

9、tempP oTableName | ' DR OP constraintPK '| tempPoTableName;EXECUTE IMMEDIATE te mp SQL;TO 'temp SQL := 'ALTER TABLE '| tem pP oTableName | ' RENAMEII tempPoTableName | '_TMP'EXECUTE IMMEDIATE te mp SQL;'没有找到表'II tempPoTableName);ELSEDBMS_OUT PUT.P UT_LINE(END

10、IF ;IF cnt21 THENte mp SQL :'DROP PROCEDURE '| tempPoSpName;EXECUTE IMMEDIATE te mp SQL;ELSEDBMS_OUT PUT.P UT_LINE(END IF ;'没有找到过程'II tempPoSpName);FETCH allValues CursorINTO tempPoTableName,tempPoSpName;END LOOP;CLOSE allValues_Cursor;DBMS_OUTPUT.PUT_LINE('结束更改原有表名DBMS_OUT PUT.P

11、 UT_LINE('''););END;END;上面两个是无名存储过程,不需要考虑是否已经存在该过程。对于有名的过程需要考虑对象是否已经存在。我是从 MSSQ向Oracle转化的。第一步,修改整体结构。Begindeclare - 变量-过程ENDGOOralce的总体结构如下,需要两个begin和end,一个是整个过程,一个是除去申明之外的过程。BEGINDECLARE -变量BEGIN -过程END;END;第二步,修改声明变量。MSSQ需要在每个变量前面加 declare标示Mssq分页存储过程,Oracle只需要一个declare标示。此外注意修改各自的数据类型。第三步,修改游标。

12、复杂的过程中离不开游标。因此更改游标结构经常用到。MSSQ的游标是全局的,需要建立之后再清空。而Oracle的游标类似于局部变量,使用完之后,自动清除。MSSQ游标结构如下:+ CHAR(13) + CHAR(10)set te mp SQL = ' declare allValues_Cursor cursor for 'set te mp SQL = te mp SQL + ' select PO TABLENAME,POSPNAME from PM NEPODEF TABLE WHERE POID>110499 and POIDv110580'-游标

13、语句EXEC ( tempSQL) -1.创建游标OPEN allValues Cursor-2.打开游标-判断是否由符合游标条件的行,如果没有则关闭和释放游标,异常返回IF ( CURSOR_ROWS 0 )BEGINCLOSE allValues CursorDEALLOCATE allValues Cursor set errorInfo ='没有指定表名或存储过程名!p rinterrorlnfo returnENDWHILE ( FETCH_STATUSv> - 1 )BEGINFETCHNEXT FROMallValues CursorINTO tempPoTable

14、Name , tempPoSpNameEND-3进行数据处理CLOSE allValues Cursor-4.关闭游标DEALLOCATE allValues Cursor-5.注销游标Oracle的游标是在变量中声明定义的,然后在过程中使用。其结构如下:-声明中Cursor allValues Cursor isselect UPP E(TRIM (PO TABLENAME)U PP E(TRIM (POSPN AME)from PM_NEPODEF_TABLW/HEREOID>110499 and POIDv110580;-1.声明游标-过程中OP ENallValues_Curso

15、r;-2.打开游标WHILEallValues Cursor %ound LOOPFETCHallValueSCursorINTO tempPo TableName,te mpPoSp Name;-3.处理数据ENDL OOP;CLOSEjllValues_Cursor;-4.关闭游标第四步修改赋值语句和比较语句。MSSQI中使用Set语句来赋值,Oracle中使用:=来赋值。此外MSSQ中的变量习惯前面增加一个字符,在Oracle中可以删除。第五步修改逻辑结构。MSSQ中使用IF().ELSE.,结构体之间都要用 BEGIN和END框起来。而 Oracle则使用IF.THEN.ELSE.EN

16、D IF结构,中间不必使用BEGIN和END此外While结构差别也类似。第六步修改各自的调用方法和函数。 常见的是MSSQL勺 EXEC(tempSQL)对应 Oracle 的 EXECUTEMMEDIATSempSQbMSSQL勺 print 函数,对应 Oracle 的 DBMS_OUTPUT.PUT_LINE(”)函数。此外还有各自使用的数据表,有所不同。例如MSSQL中所有的对象都在 sysobjects 表中,而 Oracle中的表在user_tables 中,过程在 user_procedures中等。这些需要积累一些经验。最后不要忘了检查,Oracle的所有句子,必须要有分号表示结束。而MSSQ中不需要,即使加了也不错。几步下来,MSSQ过程就转化成 Oracle 。来源:网络编辑:联动北方技术论坛

(编辑:鹰潭站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!