oracle inrt需要注意字段顺序吗?
如果是:
inrtintotabnamevalues(xxx)
的写法,要完全按照表中字段的顺序来写
如果是
inrtintotabname(字段列表)values(xxx)
那么,字段列表和值列表的顺序一致即可
我是一个初学者,如何向oracle数据库表中插入数据
工具/材料:电脑,oracle数据库表
1.例test表中有如下数据。
2.插入一条id为6,name为杨七的数据。inrt into testvalues (6,'杨七');commit。
3.向表中复制一条目前表中id为1的数据,可用如下语句:inrt into test lect * from test where id=1;commit;在执行inrt语句后,必须提交,即commit,否则不成功。
oracle中inrt如何带条件添加数据?
如果
数据不存在,那么执行插入的操作。
数据已经存在, 那么就不插入(可能是只做更新处理, 也可能什么事情都不干)
下面是一个例子代码:
--源表
CREATETABLEtest_from(idINT,valVARCHAR(20));
--目标表
CREATETABLEtest_to(idINT,valVARCHAR(20));
--插入源表
INSERTINTOtest_fromVALUES(1,'A');
INSERTINTOtest_fromVALUES(2,'B');
--合并源表到目标表
MERGEINTOtest_to
USINGtest_from
ON(test_to.id=test_from.id)--条件是id相同
WHENMATCHEDTHENUPDATESETtest_to.val=test_from.val--匹配的时候,更新
WHENNOTMATCHEDTHENINSERTVALUES(test_from.id,test_from.val)--源表有,目标表没有,插入
--第一次检查目标表数据.
SQL>SELECT*FROMtest_to;
IDVAL
------------------------------
1A
2B
--更新源表
UPDATEtest_fromSETval='A2'WHEREid=1;
--删除源表
DELETEFROMtest_fromWHEREid=2;
--插入源表
INSERTINTOtest_fromVALUES(3,'C');
--合并源表到目标表
MERGEINTOtest_to
USINGtest_from
ON(test_to.id=test_from.id)--条件是id相同
WHENMATCHEDTHENUPDATESETtest_to.val=test_from.val--匹配的时候,更新
WHENNOTMATCHEDTHENINSERTVALUES(test_from.id,test_from.val)--源表有,目标表没有,插入
--再次检查目标表数据.
SQL>SELECT*FROMtest_to;
关于oracle inrt的效率问题
1)确定a表是否有索引,触发器,约束,如果有禁用它们。这个很重要。
2)先要确定你查询语句的效率,和返回的记录数
lect xx1,xx2,xx3,decode(xx4,xx5,xx6) from b where b.xx1 in (xx,xxx)
你这条查询语句的速度有多快,需要多久才能返回数据,返回多少数据.
如果返回的数据量比较大,你要考虑到a表的extent的分配问题,也就是说你需要提前分配extent给表a
3)你可以将a表所在的表空间在a表插入数据的时候,将a表所在的表空间启用到no logging状态
4)inrt /*+append*/ into a lect xx1,xx2,xx3,decode(xx4,xx5,xx6) from b where b.xx1 in (xx,xxx) 使用oracle的direct inrt语句插入数据提高效率
5)如果数据量非常大,又不想使用上面的方法插入a表的话,
你可以
create table aa as
lect xx1,xx2,xx3,decode(xx4,xx5,xx6) from b where b.xx1 in (xx,xxx)
建个aa 表,然后将aa表改名即可
ORACLE INSERT触发器如何写
createorreplacetriggerabc
beforeinrtonic_purchain_b
foreachrow
when(new.norigtaxprice<>new.ntaxnetprice)
begin
:new.norigtaxprice:=:new.ntaxnetprice;
:new.norigprice:=:new.nnetprice;
end;
oracle中inrt语句怎么嵌入lect
inrt into lect可以将lect 出来的N行(0到任意数)结果集复制一个新表中,lect into
from只能将"一行"结果复制到一个变量中。这样说吧,lect into是PL/SQL language
的赋值语句。而前者是标准的SQL语句。
做一个测试看两者差别。
首先创建两个表,一个作为源表,一个作为目标表。
create table t_source(
id number primary key,
testname varchar2(20),
createtime date,
flag varchar2(10)
);
create table t_target(
id number primary key,
testname varchar2(20),
createtime date,
flag varchar2(10)
);
接着,插入测试数据
inrt into t_source values(1,'测试数据1....1',sysdate-2,'N');
inrt into t_source values(2,'测试数据1....2',sysdate-2,'N');
inrt into t_source values(3,'测试数据1....3',sysdate-2,'N');
commit;
测试inrt into lect 操作
inrt into test2 lect * from t_source where id=1;
commit;
测试lect into 操作
因为lect into是一个plsql语言中的复制语句,和:=实现的目标一样。
create or replace procedure sp_sync_test is
aa varchar2(100);
v_record t_source%rowtype;
begin
lect t1.testname into aa from t_source t1 where id = 1;
dbms_output.put_line('普通变量 t1.testname= ' || aa);
lect t1.* into v_record from t_source t1 where id = 1;
dbms_output.put_line('记录变量 t1.testname= ' || v_record.testname);
end;
这里增加了原始类型的变量和记录类型的变量