1. 程式人生 > >如何在Oracle中一次執行多條sql語句,結束符很重要

如何在Oracle中一次執行多條sql語句,結束符很重要

有時我們需要一次性執行多條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;

相關推薦

Oracle執行sql語句,結束符重要

有時我們需要一次性執行多條sql語句,而用來更新的sql是根據實際情況用程式碼拼出來的解決方案是把sql拼成下面這種形式:begin update TB_VG set seq = 1, vessel_id = 'Jin14', vessel_type = 'TRACK' w

如何在Oracle執行sql語句,結束符重要

有時我們需要一次性執行多條sql語句,而用來更新的sql是根據實際情況用程式碼拼出來的解決方案是把sql拼成下面這種形式:begin  update TB_VG set seq = 1, vessel_id = 'Jin14', vessel_type = 'TRACK' where batch_number

oracle執行語句

工作中需要一次執行多條語句,本來想直接使用sql拼接成一個字串進行批處理,原sql如下: String sql = ""; for(int i=0; i<deviceInfo.getDevice_ip().length; i++){

MyBatis執行SQL語句

有個常見的場景:刪除使用者的時候需要先刪除使用者的外來鍵關聯資料,否則會觸發規則報錯。 解決辦法不外乎有三個:1、多條sql分批執行;2、儲存過程或函式呼叫;3、sql批量執行。 今天我要說的是MyBatis中如何一次執行多條語句(使用mysql資料庫)。 1、修改資料庫連線引數加上allowMultiQu

Java執行SQL語句

startBatch()方法執行一組SQL語句。首先建立執行SQL語句的Statement物件,通過Statement類的addBatch方法將待執行SQL語句新增到執行緩衝區中,再呼叫executeBatch方法將執行緩衝區中的SQL語句全部執行,返回一個整型陣列,如果陣列元素的值大於等於0,則表示該語

MyBatis 執行SQL語句

在實際工作會遇到什麼情況下,需要在MyBatis中一次執行多條語句,那應該怎麼處理呢?(此處使用MySql資料庫) 1、修改資料庫連線引數加上allowMultiQueries=true,如:

mybatis 執行SQL

此處僅描述問題處理方法,關於mysql、mybatis的內容不在此贅述。因為專案需要,需要在mybatis同個標籤中執行多條sql語句。如下:Xml程式碼  <insert id="insertUser" parameterType="com.test.model.User">          

Java 執行sql

//一次執行多條SQL,如果傳來的SQL如果有一條不成功將顯示失敗 //Arraylist 為已封裝的SQL語句  //sMsg 為資訊提示。當執行出問題時,輸出相應的資訊。(如:輸入類名方法名,出錯時可以看到出問題的方法名稱) public boolean exeManySQL(ArrayList arr

mysql 的 佔位符使用 以及執行sql語句

佔位符的使用: drop PROCEDURE if EXISTS test12; -- 使用drop 來刪除儲存過程或者表 create PROCEDURE test12() -- 建立儲存過程 命名為test12 BEGIN set @tab

C#(.net)連線資料庫執行sql語句(兩種方法)

第一種方法: string str="server=.;uid=sa;pwd=111111;database=text_db";//連線字串 SqlConnection SCON = null;//連線物件 SqlCommand SCom=new SqlCommand();/

SQL插入資料

SQL中insert一次可以插入一條資料,我們有三種方法可以一次性插入多條資料。 1. 語法:select 欄位列表 into 新表 from 源表 注意事項:此種方法新表是系統自動建立,語句執行前不可以存在新表,並且新表只能保留源表的標識列特性,其他約束不能保留。 若只需要源表的資料結構,我們可以在語句中

oracle Insert 插入記錄

pan rac ora 方法 tab where ble code 兩種方法 oracle Insert 一次插入多條記錄有兩種方法: 1)Insert All Into table_name values ... insert all into table_name v

Mybatis+MySql 一個標籤執行sql語句

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/cxfly957/article/details/77896590 MySql預設是不支援這種騷操作的,但是並不代表不能實現,只需要在jdbc的配置檔案中

懶人的python——執行linux命令

今天在公司搞了半天EE2I,一直在敲相同的命令累死了。每次執行ee2i.sh temp命令後,都要到cd到某個目錄下執行下一個shell指令碼。做完一次後又要刪除臨時檔案。總之,重複工作很多,我的指甲都敲累了。所以晚上回到家就寫了個類似的python指令碼來自動化執行這些討厭

如何在mybatis一個insert,delete,update執行SQL語句

一般我們會在applicationContect中這麼配置: <!-- 1. 資料來源 : DriverManagerDataSource --> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSo

mysql+mybatis 在mybatis一個標籤,執行sql語句

然後在mybatis對映檔案中的標籤中,一般不能執行多條sql,如下: <insert id="addUser" parameterType="User" > insert into t_users (name,password,phone) values (#{na

Oracle 怎樣插入記錄

Oracle 一次性插入多條記錄跟 MYSQL 有很大不同。MYSQL  是這樣的,但在 Oracle 中行不同。 INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees'),('Gates', 'Champs-E

linux 執行命令

1、mkdir myfile ; chmod -R 777 myfile [[email protected] myfile]# mkdir www ; chmod -R 777 www [[email protected] myfile]# ls ww

mysql基礎-- 請求執行SQL語句

最近做一個資料庫初始化工具的時候發現了這個問題,就是在一個Statement中執行一條SQL語句的時候可以正確執行,如果同時執行多條,就會報SQL語法錯誤,傷透了腦筋。 經過網上查詢,發現有兩種解決辦法: 1、最簡單的辦法,在MySQL的連線字串中設定allowMulti

使用jmeter執行sql語句

多個 true targe csdn allow 知識 word sta lib 註意2個地方 1、 【JDBC Connection Configuration】 在配置DataBase URL的時候,加上allowMultiQueries=true參數如: jdbc: