在Oracle中一次執行多條sql語句,結束符很重要
阿新 • • 發佈:2018-12-31
有時我們需要一次性執行多條sql語句,而用來更新的sql是根據實際情況用程式碼拼出來的
解決方案是把sql拼成下面這種形式:
begin
update TB_VG set seq = 1, vessel_id = 'Jin14', vessel_type = 'TRACK' where batch_number = '20837' and train_id = '0233086';
update TB_VG set seq = 2, vessel_id = 'Jin14', vessel_type = 'TRACK' where batch_number = '20992' and train_id = '0233110';
end;
總結如下:
以begin開始,以end;結尾(end後的分號不能省),中間的每個sql語句要以分號;結尾
在實際編碼中,發現即使這樣也會有錯誤發生,把sql語句中的換行符替換成空格就可以了
比較穩妥的編碼方式是:
1、以正常的方式編寫sql,根據閱讀與編寫的需要,中間肯定會有換行符
2、在執行之前進行替換:strSql = strSql.Replace("r\n", " ").Replace('\n', ' ');
-------------------------------------------------------------------------------------------
前幾天做專案的時候發現了一個問題,那就是將許多的SQL語句連在一起去執行時竟然會出錯,在SQLserver2000中就可把每句SQL用空格分開,直接就可以執行,這樣在寫程式的時候增加了不少的靈活性,而在ORACLE中就不行了。也許大家都會認為在每句的最後加上“;”就可以了,其實不然。在網上找了好多的方法,有的認為在SQLPLUS中用begin~~end可以解決,經過多次的實驗還是解決不了問題,有的方法可以在SQLPLUS中執行,但是不符合專案的需要,如果在sqlplus中錄入的話不用begin和end也可執行多條語句,只要每一行用分號結束,一行一條語句就可以。
問題,執行一段程式碼反回一個字串,這個串中就是要執行我多條SQL語句。怎樣讓它在ORACLE中通過呢。想來想去想到了動態SQL,EXECUTE IMMEDIATE 這是一個解析和執行標準SQL語句的語法。只要在這條字串中格式化一下我們要執行的語句就可以了,比如這條要執行的多條SQL的字串為:
delete tableA where Aid=1;update tableB where Bid=2;insert into tableC values(id,3,4);
像這樣的SQL語句想一起執行是不可以的,只要加點格式化就OK了,
要這樣:BEGIN EXECUTE IMMEDIATE 'delete tableA where Aid=1';EXECUTE IMMEDIATE 'update tableB where Bid=2';EXECUTE IMMEDIATE 'insert into tableC values(id,3,4)';END;
注意,一定要寫好格式,比如END後的分號。這樣就可以在ORACLE中執行這個字串了。
今天我在做一個專案的時候,需要向資料庫(資料庫是Oracle 8.0.5)一次同時插入多條資料,但是程式執行卻出錯:ORA-00911: 無效字元。SQL語句如下:
-------------------------------------------------------------------------------------------
DELETE FROM SYSROLEOPENR WHERE ROLEID = 2;
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090010';
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090020';
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090050';
我去掉所有的;號,也報錯。困惑了許久。如果資料庫是SQL SERVER 2000,程式去掉分號後是可以正常執行的。後來發現在Oracle中需要加上begin
end才正確。改成以下的SQL就正確了:
BEGIN
DELETE FROM SYSROLEOPENR WHERE ROLEID = 2;
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090010';
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090020';
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090050';
END;
解決方案是把sql拼成下面這種形式:
begin
update TB_VG set seq = 1, vessel_id = 'Jin14', vessel_type = 'TRACK' where batch_number = '20837' and train_id = '0233086';
update TB_VG set seq = 2, vessel_id = 'Jin14', vessel_type = 'TRACK' where batch_number = '20992' and train_id = '0233110';
end;
總結如下:
以begin開始,以end;結尾(end後的分號不能省),中間的每個sql語句要以分號;結尾
在實際編碼中,發現即使這樣也會有錯誤發生,把sql語句中的換行符替換成空格就可以了
比較穩妥的編碼方式是:
1、以正常的方式編寫sql,根據閱讀與編寫的需要,中間肯定會有換行符
2、在執行之前進行替換:strSql = strSql.Replace("r\n", " ").Replace('\n', ' ');
-------------------------------------------------------------------------------------------
前幾天做專案的時候發現了一個問題,那就是將許多的SQL語句連在一起去執行時竟然會出錯,在SQLserver2000中就可把每句SQL用空格分開,直接就可以執行,這樣在寫程式的時候增加了不少的靈活性,而在ORACLE中就不行了。也許大家都會認為在每句的最後加上“;”就可以了,其實不然。在網上找了好多的方法,有的認為在SQLPLUS中用begin~~end可以解決,經過多次的實驗還是解決不了問題,有的方法可以在SQLPLUS中執行,但是不符合專案的需要,如果在sqlplus中錄入的話不用begin和end也可執行多條語句,只要每一行用分號結束,一行一條語句就可以。
問題,執行一段程式碼反回一個字串,這個串中就是要執行我多條SQL語句。怎樣讓它在ORACLE中通過呢。想來想去想到了動態SQL,EXECUTE IMMEDIATE 這是一個解析和執行標準SQL語句的語法。只要在這條字串中格式化一下我們要執行的語句就可以了,比如這條要執行的多條SQL的字串為:
delete tableA where Aid=1;update tableB where Bid=2;insert into tableC values(id,3,4);
像這樣的SQL語句想一起執行是不可以的,只要加點格式化就OK了,
要這樣:BEGIN EXECUTE IMMEDIATE 'delete tableA where Aid=1';EXECUTE IMMEDIATE 'update tableB where Bid=2';EXECUTE IMMEDIATE 'insert into tableC values(id,3,4)';END;
注意,一定要寫好格式,比如END後的分號。這樣就可以在ORACLE中執行這個字串了。
今天我在做一個專案的時候,需要向資料庫(資料庫是Oracle 8.0.5)一次同時插入多條資料,但是程式執行卻出錯:ORA-00911: 無效字元。SQL語句如下:
-------------------------------------------------------------------------------------------
DELETE FROM SYSROLEOPENR WHERE ROLEID = 2;
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090010';
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090020';
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090050';
我去掉所有的;號,也報錯。困惑了許久。如果資料庫是SQL SERVER 2000,程式去掉分號後是可以正常執行的。後來發現在Oracle中需要加上begin
end才正確。改成以下的SQL就正確了:
BEGIN
DELETE FROM SYSROLEOPENR WHERE ROLEID = 2;
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090010';
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090020';
INSERT INTO SYSROLEOPENR
(PKID, ROLEID, OPERID)
SELECT SYSROLEOPENR_PKID_SEQ.NEXTVAL, '2' ROLEID, OPERID
FROM SYSMODULEOPER
WHERE OPERCODE = '300090050';
END;