ASP.NET C# ORACLE 自增序列问题(高分请高手进)
我有一张表A,有三个字段,T1,T2,T3均是字符串型现在要新建一张表B,有四个字段,第一个字段为自增字段GUID,其余三个字段与A表的三个字段相同,使用下面的SQL语句手工建立这张表:
CREATE TABLE B
(
GUID NUMBER NOT NULL PRIMARY KEY,
T1 VARCHAR2(100),
T2 VARCHAR2(100),
T3 VARCHAR2(100)
)
现在要把A表中所有数据导入到B表中,怎么做啊?
没有自增字段GUID时,我是这样用的(执行成功,没有问题):
string ConnectionString = "Data Source=orcl;user=syyhsimis;password=syyhsimis;";//写连接串
OracleConnection conn = new OracleConnection(ConnectionString);//创建一个新连接
try
{
conn.Open();
OracleCommand deletecmd = conn.CreateCommand();
OracleCommand insertcmd = conn.CreateCommand();
deletecmd.CommandText = "delete from B";
insertcmd.CommandText = "insert into B select * from A";
deletecmd.ExecuteNonQuery();
insertcmd.ExecuteNonQuery();
}
现在多了个自增字段,我知道要用序列SEQUENCE,也建了序列,就是不知道怎么能一次把自增字段和A表中的数据同时导入,请高手指点下,谢谢!
--------------------编程问答-------------------- 自增字段不用管它啊
一般复制表我都是用游标 --------------------编程问答-------------------- try->
insert into B(GUID,T1,T2,T3)--------------------编程问答-------------------- 2楼错了,try写个SQL函数取序列号,如 F_GetSeq(),sql中写再返回值
select A序列名.nextval,T1,T2,T3 from A
select A序列名.nextval from dual--取序列,写成函数--------------------编程问答-------------------- Mark~ --------------------编程问答-------------------- or try->
insert into B(GUID,T1,T2,T3)
select F_GetSeq(),T1,T2,T3 from A,dual
select (select A序列名.nextval from dual),T1,T2,T3 from A--------------------编程问答-------------------- 三楼的,我是新手,能完整的写一下吗? --------------------编程问答-------------------- 可用触发器的,插入语句不改
在表B上建触发器,示例
create or replace trigger mytable_trig_autoinc
before insert on mytable
for each row
begin
if (:new.id is null) then
select mytable_seq.nextval into :new.id from dual;
end if;
--------------------编程问答-------------------- 你这个是整张表复制的,不需要用游标了
我试写了一个
不要手动创建B表,直接执行这个就可以了
select IDENTITY(int,1,1) as guid,* into B from A--------------------编程问答-------------------- 用触发器的写法
create or replace trigger tableB_trig_autoinc--------------------编程问答--------------------
before insert on 表B
for each row
begin
if (:new.id is null) then
select 表B序列名.nextval into :new.id from dual;
end if;
end;
这是Sqlserver的写法。。oracle的序列不一样 --------------------编程问答-------------------- 第一个字段为自增字段GUID
-----------
GUID和自增有什么关系?和序列有什么关系?直接调用sys_guid()函数即可... --------------------编程问答-------------------- e...
都没注意看,直接当成sql在想了...
那抱歉了,oracle不熟,而且电脑里也没有
帮不了楼主啦 --------------------编程问答-------------------- ORACLE我不知道行不行,但是SQL里面就简单了,一个SQL语句就搞定了,
select GUID=identity(int,1,1),* into B from A
select * from B
表B里面就有A里面的数据了! --------------------编程问答--------------------
估计楼主的意思..就是要一个自增主键,名字刚好叫GUID的...
--------------------编程问答-------------------- 就是14楼的这个意思,在B表上增加一个自增字段,名字随便起都没关系,B表其余字段和数据都和A表的相同
是ORACLE下的,高手们还有什么办法没有啊 --------------------编程问答-------------------- 好了,已经解决了,是这样的:
INSERT INTO B(GUID, T1, T2, T3) SELECT B表序列名.NEXTVAL, T1,T2,T3 FROM DUAL, A
感谢大家啊! --------------------编程问答-------------------- 学习了。 --------------------编程问答-------------------- 高手别着急,还有个问题:
这个是可以的:
INSERT INTO B(GUID, T1, T2, T3) SELECT B表序列名.NEXTVAL, T1,T2,T3 FROM DUAL, A
但加上条件就不行了,下面这个说不允许序列:
INSERT INTO B(GUID, T1, T2, T3) SELECT B表序列名.NEXTVAL, T1,T2,T3 FROM DUAL, A where T1='1' ORDER BY T2
这是怎么回事啊?
--------------------编程问答-------------------- 呵呵 看得有点头晕.竟然是建了个GUID的列...你上面的问题set identity_insert on.试试这个,用完以后off.
--------------------编程问答-------------------- 用触发器的写法
SQL codecreate or replace trigger tableB_trig_autoinc
before insert on 表B
for each row
begin
if (:new.id is null) then
select 表B序列名.nextval into :new.id from dual;
end if;
end; --------------------编程问答-------------------- 用触发器,是直接在ORACLE里面配置的吧?我不太会啊。
还是用SQL语句来得直接些吧? --------------------编程问答-------------------- 给你个例子,看下如何设置建立之后并用命令建立两个与之对应的表的触发器,命令如下:
CREATE OR REPLACE TRIGGER GZJH_ID
BEFORE INSERT ON GZJH FOR EACH ROW
BEGIN
SELECT GZJH_ID.NEXTVAL INTO :NEW.id FROM DUAL;
END;
CREATE OR REPLACE TRIGGER SP_ID
BEFORE INSERT ON GZJH FOR EACH ROW
BEGIN
SELECT SP_ID.NEXTVAL INTO :NEW.id FROM DUAL;
END;
--------------------编程问答-------------------- 都让你们搞晕了
1)不加条件全表复制
INSERT INTO B(GUID, T1, T2, T3)
SELECT 序列名.NEXTVAL, T1,T2,T3 FROM A ;
2)加上条件
INSERT INTO B(GUID, T1, T2, T3)
SELECT 序列名.NEXTVAL, T1,T2,T3 FROM A where T1='1';
说明:insert into 采用SQL子句的方式是不能加order by ,你想想,加order by 有意义吗
补充:.NET技术 , ASP.NET