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;
這里增加了原始類型的變量和記錄類型的變量