oracle sql developer 版本:2.1.1.64
SQLSERVER 2005 ;oracle 10g捕获期间出错: ORA-24816: 在实际的 LONG 或 LOB 列之后提供了扩展的非 LONG 绑定数据 这个问题该如何解决?谢谢!
SQLSERVER 2005 ;oracle 10g捕获期间出错: ORA-24816: 在实际的 LONG 或 LOB 列之后提供了扩展的非 LONG 绑定数据 这个问题该如何解决?谢谢!
解决方案 »
- 在SQL中,在用关联子查询时,如果是在同一个表中操作,为什么要求这个表有一个别名,谢谢
- 请教##############
- oracle DBA和j2EE开发哪个有发展
- 再问:一条记录里有F1,F2,F3三个属性相同的字段,拆分为3条记录!(在线等待,解决马上送分!)
- 启动数据库问题
- 怎么将sqlserver中的表格转换到oracle9中
- 初级问题¥¥高手请告诉我如何才能显示时分秒呢?以及to_date的两个问题。谢谢!
- ORACLE不能自动启动的问题
- 硕士论文马上就要开题了??????
- 如何在bat文件中调用sqlplus,并执行sql语句。
- 求数据库迁移(Oracle to MySQL)的工具/方法
- 急急急sys_connect_path用法
您是说列名吗?这个是不会的。类型的话,SqlServer也没有long类型。我开始是以为这个工具不支持对SqlServer自增长列的转换,因为自增长列是SqlServer中int类型的一个属性,还特意取消了自增长列,可还是不对。
<一> 数据类型的迁移 <1>、ORACLE端语法说明在ORACLE 中,分析其数据类型,大致可分为数字、字符、日期时间和特殊四大类。其中,数字类型有NUMBER;字符类型有CHAR与VARCHAR2;日期时间类型只有DATE一种;除此之外,LONG、RAW、LONG RAW、BLOB、CLOB和BFILE等数据类型都可视为特殊数据类型。 <2>、SQL SERVER端语法说明在SQL SERVER中,参照上面对ORACLE的划分,数据类型也大致可分为数字、字符、日期时间和特殊四大类。数字类型又可分为精确数值、近似数值、整数、二进制数、货币等几类,其中,精确数值有DECIMAL[(P[, S])]与NUMERIC[(P[, S])];近似数值有FLOAT[(N)];整数有INT、SMALLINT、TINYINT;二进制数有BINARY[(N)]、VARBINARY [(N)];货币有MONEY、SMALLMONEY。字符类型有CHAR[(N)]与VARCHAR[(N)]。日期时间类型有DATETIME、 SMALLDATETIME。除此之外,BIT、TIMESTAMP、TEXT和IMAGE、BINARY VARING等数据类型都可视为特殊数据类型。 <3>、从SQL SERVER向ORACLE的迁移方案比较ORACLE与SQL SERVER在数据类型上的不同,当从SQL SERVER向ORACLE迁移时,可以做如下调整:
SQL SERVER
ORACLE数字类型
DECIMAL[(P[, S])]
NUMBER[(P[, S])]NUMERIC[(P[, S])]
NUMBER[(P[, S])]FLOAT[(N)]
NUMBER[(N)]INT
NUMBERSMALLINT
NUMBERTINYINT
NUMBERMONEY
NUMBER[19,4]SMALLMONEY
NUMBER[19,4]字符类型
CHAR[(N)]
CHAR[(N)]VARCHAR[(N)]
VARCHAR2[(N)]日期时间类型
DATETIME
DATESMALLDATETIME
DATE其它
TEXT
CLOBIMAGE
BLOBBIT
NUMBER(1)方法:公司原系统中的Money 用于金额时转换用number(14,2);用于单价时用 number(10,4)代替;
<二> ID列向SEQUENCE迁移 <1>、SQL SERVER端语法说明在SQL SERVER中,可以将数据库中的某一字段定义为IDENTITY列以做主键识别,如: jlbh numeric(12,0) identity(1,1) /*记录编号字段*/ CONSTRAINT PK_tbl_example PRIMARY KEY nonclustered (jlbh) /*主键约束*/在这里,jlbh是一个ID列,在向具有该列的表插入记录时,系统将从1开始以1的步长自动对jlbh的值进行维护。 <2>、ORACLE端语法说明但在ORACLE中,没有这样的ID列定义,而是采用另一种方法,即创建SEQUENCE。如:/*--1、创建各使用地区编码表--*/drop table LT_AREA;create table LT_AREA ( area_id number(5,0) NOT NULL, /*地区编码*/ area_name varchar2(20) NOT NULL, /*地区名称*/ constraint PK_LT_AREA PRIMARY KEY(area_id) ); /*--2、创建SEQUENCE,将列area_id 类ID化--*/drop sequence SEQ_LT_AREA;create sequence SEQ_LT_AREA increment by 1 /*该SEQUENCE以1的步长递增*/ start with 1 maxvalue 99999; /*从1开始,最大增长到99999*/ /*--3、实际操作时引用SEQUENCE的下一个值--*/insert into LT_AREA(area_id, area_name) values(SEQ_LT_AREA.NEXTVAL, '深圳');insert into LT_AREA(area_id, area_name) values(SEQ_LT_AREA.NEXTVAL, '广州');insert into LT_AREA(area_id, area_name) values(SEQ_LT_AREA.NEXTVAL, '北京'); /*--4、新插入连续三条记录后,下一条语句运行后,‘上海’地区的area_id为4--*/insert into LT_AREA(area_id, area_name) values(SEQ_LT_AREA.NEXTVAL, '上海'); <3>、从SQL SERVER向ORACLE的迁移方案 根据以上分析,当从SQL SERVER向ORACLE迁移时,可以做如下调整:1、去掉建表语句中有关ID列的identity声明关键字;2、创建SEQUENCE,将此SEQUENCE与需类ID化的列对应;3、在INSERT语句中对相应列引用其SEQUENCE值:SEQUENCENAME.NEXTVAL实际上,处理以上情况在ORACLE中采用的方法为对有自动增长字段的表增加一插入前触发器(具体资料见后“触发器”一节),如下:CREATE OR REPLACE TRIGGER GenaerateAreaIDBEFORE INSERT ON LT_AREAFOR EACH ROW Select SEQ_LT_AREA.NEXTVAL INTO :NEW.ID FROM DUAL;BEGINEND GenaerateAreaID;GenaerateAreaID实际上修改了伪记录:new的area_id值。 :new最有用的一个特性----当该语句真正被执行时,:new中的存储内容就会被使用。所以系统每次都能自动生成新的号码。
<三> 表(主键、外键、CHECK、UNIQUE、DEFAULT、INDEX) <1>、SQL SERVER端语法说明有如下SQL SERVER语句:/* ------------------------ 创建employee 表------------------------ */IF EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME = ‘employee’ AND TYPE = ‘U’) DROP TABLE employeeGO CREATE TABLE employee( emp_id empid /*empid为用户自定义数据类型*/ /*创建自命名主键约束*/ CONSTRAINT PK_employee PRIMARY KEY NONCLUSTERED /*创建自命名CHECK约束*/ CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'), /* CHECK约束说明:Each employee ID consists of three characters that represent the employee's initials, followed by a five digit number ranging from 10000 to 99999 and then the employee's gender (M or F). A (hyphen) - is acceptable for the middle initial. */ fname varchar(20) NOT NULL, minit char(1) NULL, lname varchar(30) NOT NULL, ss_id varchar(9) UNIQUE, /*创建唯一性约束*/ job_id smallint NOT NULL DEFAULT 1, /*设定DEFAULT值*/ job_lvl tinyint DEFAULT 10, /*设定DEFAULT值*/ /* Entry job_lvl for new hires. */ pub_id char(4) NOT NULL DEFAULT ('9952') /*设定DEFAULT值*/ REFERENCES publishers(pub_id), /*创建系统命名外键约束*/ /* By default, the Parent Company Publisher is the company to whom each employee reports. */ hire_date datetime NOT NULL DEFAULT (getdate()), /*设定DEFAULT值*/ /* By default, the current system date will be entered. */ CONSTRAINT FK_employee_job FOREIGN KEY (job_id) REFERENCES jobs(job_id) /*创建自命名外键约束*/)GO /* --------------------- 创建employee表上的index --------------------- */IF EXISTS (SELECT 1 FROM sysindexes WHERE name = 'emp_pub_id_ind') DROP INDEX employee. emp_pub_id_indGO CREATE INDEX emp_pub_id_ind ON employee(pub_id)GO <2>、ORACLE端语法说明在ORACLE端的语法如下: /* ---------------------- 创建employee 表---------------------- */ DROP TABLE employee; CREATE TABLE employee( emp_id varchar2(9) /*根据用户自定义数据类型的定义调整为varchar2(9)*/ /*创建自命名主键约束*/ CONSTRAINT PK_employee PRIMARY KEY NONCLUSTERED /*创建自命名CHECK约束*/ CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'), /* CHECK约束说明:Each employee ID consists of three characters that represent the employee's initials, followed by a five digit number ranging from 10000 to 99999 and then the employee's gender (M or F). A (hyphen) - is acceptable for the middle initial. */ fname varchar2(20) NOT NULL, minit varchar2(1) NULL, lname varchar2(30) NOT NULL, ss_id varchar2(9) UNIQUE, /*创建唯一性约束*/ job_id number(5,0) NOT NULL /*这里考虑了SMALLINT的长度,也可调整为number*/ DEFAULT 1, /*设定DEFAULT值*/ job_lvl number(3,0) /*这里考虑了TINYINT的长度,也可调整为number*/ DEFAULT 10, /*设定DEFAULT值*/ /* Entry job_lvl for new hires. */ pub_id varchar2(4) NOT NULL DEFAULT ('9952') /*设定DEFAULT值*/ REFERENCES publishers(pub_id), /*创建系统命名外键约束*/ /* By default, the Parent Company Publisher is the company to whom each employee reports. */ hire_date date NOT NULL DEFAULT SYSDATE, /*设定DEFAULT值*/ /*这里,SQL SERVER的getdate()调整为ORACLE的SYSDATE*/ /* By default, the current system date will be entered. */ CONSTRAINT FK_employee_job FOREIGN KEY (job_id) REFERENCES jobs(job_id) /*创建自命名外键约束*/); /* -------------------- 创建employee表上的index -------------------- */DROP INDEX employee. emp_pub_id_ind; CREATE INDEX emp_pub_id_ind ON employee(pub_id); <3>、从SQL SERVER向ORACLE的迁移方案比较这两段SQL代码,可以看出,在创建表及其主键、外键、CHECK、UNIQUE、DEFAULT、INDEX时,SQL SERVER 与ORACLE的语法大致相同,但时迁移时要注意以下情况: (1) Oracle定义表字段的default属性要紧跟字段类型之后,如下: Create table MZ_Ghxx ( ghlxh number primay key , rq date default sysdate not null, …. ) 而不能写成 Create table MZ_Ghxx ( ghlxh number primay key , rq date not null default sysdate, …. )(2)T-SQL定义表结构时,如果涉及到用默认时间和默认修改人员,全部修改如下: ZHXGRQ DATE DEFAULT SYSDATE NULL, ZHXGR CHAR(8) DEFAULT ‘FUTIAN’ NULL,(3)如表有identity定段,要先将其记录下来,建完表之后,马上建相应的序列和表触发器,并作为记录。