備注學院

          LuLu

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            5 隨筆 :: 50 文章 :: 16 評論 :: 0 Trackbacks
          學習如何創建自文檔化 SQL 命令文件,通過將 SQL 命令與有用的注釋一起放置在文本文件中,可以根據需要執行任意多次。介紹 SQL 腳本文件的基本原理之后,本文展示了三種執行腳本文件的方法。然后您將回顧使用 SQL INSERT 語句將數據插入表中的基本原理,其中包括查看使用不同方式插入 10 個新行的示例。最后,本文展示了一個腳本,該腳本自動化該 INSERT 操作并顯示新插入的數據以供驗證。

          SQL 腳本

          在本系列的上一篇文章 “用 Apache Derby 進行數據庫開發,第 2 部分:模式”(2006 年 4 月),在 ij 工具的提示符處直接執行 SQL 命令。通過使用 ij 工具,可以簡單地用不同的 SQL 或 Derby 命令進行試驗。但是,通常您將需要執行多個復雜的命令。為了簡化調試一組復雜的 SQL 命令,將其寫入文本文件中然后一次執行文本文件中的所有命令通常更加容易。該操作被稱為運行 SQL 腳本,可以通過使用 Apache Derby 很容易地實現該操作。通過將 SQL 命令放置在腳本文件中,您將獲得能夠根據需要多次執行命令的附加好處。

          腳本文件不難使用,如 清單 1 所示的第一個 Derby SQL 腳本示例。


          清單 1. 第一個 Derby SQL 腳本
          -- Ignore the database not created warning if present
                      connect 'jdbc:derby:test;create=true' ;
                      -- First delete the tables if they exist.
                      -- Ignore the table does not exist error if present
                      DROP TABLE bigdog.products ;
                      DROP TABLE bigdog.vendors ;
                      -- CREATE the products table for bigdog's Surf Shop
                      CREATE TABLE bigdog.products (
                      itemNumber INT NOT NULL,
                      price DECIMAL(5, 2),
                      stockDate DATE,
                      description VARCHAR(128)
                      ) ;
                      -- CREATE the products table for bigdog's Surf Shop
                      CREATE TABLE bigdog.vendors (
                      itemNumber INT NOT NULL,
                      vendornumber INT NOT NULL,
                      vendorName CHAR(64)
                      ) ;
                      exit ;
                      

          清單 1 所示的腳本重新創建了本系列上一篇文章中演示的 bigdog 模式和兩個表(productsvendors)。如果不清楚其中任何一個概念,在繼續本文之前您應該返回并 閱讀該文章。因為本文將介紹將數據插入表的基本原理,所以您首先需要創建準備接受新數據的表。

          編輯 Derby SQL 腳本
          腳本文件只是一種包含可以從 Apache Derby ij 工具直接運行的 SQL 命令和 Apache Derby 命令的組合的文本文件。腳本文件簡化了 Apache Derby 數據庫的開發和維護,并提供了一種用于構建數據庫的自文檔化技術。您應該將這些文件存儲為 ASCII 文本文件,而非 RTF 文件(或其他任何格式),以防止文本編碼錯誤。一些文本應用程序(比如 Microsoft® Windows® 系統中的寫字板)可能試圖將文件自動保存為富文本文件。一定要小心這一點,否則可能在嘗試執行腳本文件時出現問題。

          無需將用于創建表的 SQL 命令直接輸入到 Derby ij 工具中,您可以將其放入文本文件中,并讓 ij 工具直接運行文件中的命令。本文包括一個 .zip 文件(參閱 下載 一節以訪問該文件),其中包含兩個腳本文件;一個是 derby.create.sql,如 清單 1 所示。因為本文將逐步介紹該腳本文件中的代碼行,所以您既可以參照 清單 1 所示的代碼,也可以用您偏愛的文本編輯器打開該腳本文件。

          該腳本文件包括了用兩個破折號 (--) 開頭的幾行。這些行是 SQL 注釋;您應該使用它們來提供腳本文件中每個主要組件的用途的基本描述。 腳本中的第一個實際命令是 Derby connect 命令,它告訴 ij 工具連接 test 數據庫,必要的話要先創建數據庫。下一個命令是 SQL DROP 語句,它刪除 bigdog 模式中的產品和供應商表。如果表不存在(當數據庫剛創建時就會出現這種情況),將顯示一條錯誤消息;但前面的 SQL 注釋指明,您可以安全地忽略這些消息。

          如果存在的話,首先放棄這些表,以便您可以用所需的正確的列定義創建新表。后兩條 SQL 語句就執行該操作,在 bigdog 模式中創建產品和供應商表。腳本以 exit 命令結束,終止了與數據庫的連接,并允許 ij 工具優雅地退出。下一步將學習如何執行 Derby 腳本文件。

          在 ij 中運行腳本

          腳本文件僅在可用于執行文件中列出的命令時才有用。要執行 SQL 腳本文件中的命令,最簡單的方法是從 ij 工具中運行腳本文件。但是,在可以運行之前,需要創建一個測試目錄并展開 derby4.zip 文件,該文件可在本文下載(參閱 下載 一節)。該過程如 清單 2 所示。


          清單 2. 在 ij 中運行 SQL 腳本
          rb$ mkdir test
                      rb$ cp derby4.zip test/
                      rb$ cd test/
                      rb$ unzip derby4.zip
                      Archive:  derby4.zip
                      inflating: derby.create.sql
                      inflating: derby.insert.sql
                      rb$ ls
                      derby.create.sql      derby.insert.sql      derby4.zip
                      rb$ java org.apache.derby.tools.ij
                      ij version 10.1
                      ij> run 'derby.create.sql' ;
                      ij> -- Ignore the database not created warning if present
                      connect 'jdbc:derby:test;create=true' ;
                      ij> -- First delete the tables if they exist.
                      -- Ignore the table does not exist error if present
                      DROP TABLE bigdog.products ;
                      ERROR 42Y07: Schema 'BIGDOG' does not exist
                      ij> DROP TABLE bigdog.vendors ;
                      ERROR 42Y07: Schema 'BIGDOG' does not exist
                      ij> -- CREATE the products table for Bigdog's Surf Shop
                      CREATE TABLE bigdog.products (
                      itemNumber INT NOT NULL,
                      price DECIMAL(5, 2),
                      stockDate DATE,
                      description VARCHAR(128)
                      ) ;
                      0 rows inserted/updated/deleted
                      ij> -- CREATE the products table for Bigdog's Surf Shop
                      CREATE TABLE bigdog.vendors (
                      itemNumber INT NOT NULL,
                      vendornumber INT NOT NULL,
                      vendorName CHAR(64)
                      ) ;
                      0 rows inserted/updated/deleted
                      ij> exit ;
                      

          雖然 清單 2 似乎對于執行 Derby 腳本有些冗長,但過程十分簡單。該示例假設您具有開放的終端(或Windows Command 進程窗口,但要注意,本例中的一些步驟是特定于 UNIX® 的),并且您已經更改到保存包含本文提供的 兩個腳本文件 的 derby4.zip 文件的目錄。要最小化任何錯誤的幾率,首先創建一個新目錄,將 derby4.zip 文件復制到新目錄中,并更改到這個新目錄。然后展開示例 .zip 文件。如目錄清單所示,現在您在新目錄中具有三個文件:derby4.zip、derby.create.sql 和 derby.insert.sql。現在,您將只使用 create 腳本文件; insert 腳本文件將在本文的最后使用。

          如果出問題怎么辦?
          有時候,不管您怎么努力,事情不會總是如您所愿。如果不能安全地執行 derby.create.sql 腳本,有許多可能性需要檢查:
          • 確保 Derby ij 工具正確啟動。若非如此,您可能遇到 CLASSPATH 工具問題。
          • 確保具有創建新數據庫的空閑磁盤空間。
          • 確保在試圖執行腳本文件的目錄中具有正確的權限(讀取腳本文件和創建新數據庫)。
          • 確保腳本文件是簡單的 ASCII 文本文件。
          如果全都不是,則檢查最新的 Derby 文檔,該文檔可從 Apache Derby Web 站點(參閱 參考資料 一節中的鏈接)上免費獲得,或在 Derby 郵件列表中詢問您的問題。

          清單 2 的其余部分展示如何從 Derby ij 工具中執行 derby.create.sql 腳本文件。 首先啟動 ij 工具。如果啟動時出現問題,您可能需要回顧 本系列第一篇文章 中提供的 Derby 安裝驗證步驟。看到 ij> 提示之后,就可以運行合適的腳本文件了。通過使用 run 命令可實現該操作,該命令接受單個參數:單引號括起的腳本文件名。

          當該腳本執行時,您可能會看到新 ij> 提示、命令和警告或錯誤消息的組合。這種顯示可能有些笨拙,但 run 命令會執行您的腳本文件,就像您直接將命令鍵入 ij 工具中一樣。最后,處理 exit 命令,腳本完成,關閉 ij 工具。如果第一個腳本執行的輸出與 清單 2 所示的相匹配,那么恭喜您了。您現在已經有了一個帶有兩個可以保存數據的新表的新測試數據庫了。

          雖然從 ij 工具中執行腳本十分有效,但是有時候進一步自動化該過程會更加容易。下一節將討論如何從命令行直接執行 Derby 腳本文件。

          從命令行運行腳本

          本節介紹從命令行運行腳本的兩種方法。第一種方法如 清單 3 所示。


          清單 3. 從命令行運行 SQL 腳本
          rb$ java org.apache.derby.tools.ij derby.create.sql
                      ij version 10.1
                      ij> -- Ignore the database not created warning if present
                      connect 'jdbc:derby:test;create=true' ;
                      WARNING 01J01: Database 'test' not created, connection made to existing database instead.
                      ij> -- First delete the tables if they exist.
                      -- Ignore the table does not exist error if present
                      DROP TABLE bigdog.products ;
                      0 rows inserted/updated/deleted
                      ij> DROP TABLE bigdog.vendors ;
                      0 rows inserted/updated/deleted
                      ij> -- CREATE the products table for Bigdog's Surf Shop
                      CREATE TABLE bigdog.products (
                      itemNumber INT NOT NULL,
                      price DECIMAL(5, 2),
                      stockDate DATE,
                      description VARCHAR(128)
                      ) ;
                      0 rows inserted/updated/deleted
                      ij> -- CREATE the products table for Bigdog's Surf Shop
                      CREATE TABLE bigdog.vendors (
                      itemNumber INT NOT NULL,
                      vendornumber INT NOT NULL,
                      vendorName CHAR(64)
                      ) ;
                      0 rows inserted/updated/deleted
                      ij> exit ;
                      

          清單 3 展示了直接從命令行執行腳本文件的第一種方法。在這種情況下,提供腳本文件名作為 ij 工具的命令行參數。腳本文件中的行像以前一樣讀取,并順序處理。如果首先從 ij 工具中直接執行 derby.create.sql 文件,現在在命令行運行相同目錄中的同一腳本文件,您應該會看到類似于 清單 3 中的輸出(一切都在清單中第一行之后)。如上所示,您收到一條警告消息,指明測試數據庫未創建,因為它已經存在。但是,這次您不會收到指明不能放棄兩個表的錯誤消息,因為您已經創建了它們(如 清單 2 所示)。在放棄產品和供應商表之后,您重新創建它們,腳本退出。

          還有另一種方法來運行 Derby 腳本:重定向 ij 工具的標準輸入以從腳本文件中讀取。在基于 UNIX 的操作系統中,通過使用適合您的 shell 的 STDIN 重定向字符最容易實現了,比如為 Bash shell 使用小于號 (<)。這種方法在 清單 4 中展示,具有減少屏幕上顯示的輸出量的好處。


          清單 4. 從命令行運行 SQL 腳本(第 2 部分)
          rb$ java org.apache.derby.tools.ij < derby.create.sql
                      ij version 10.1
                      ij> WARNING 01J01: Database 'test' not created, connection made to existing database instead.
                      |-------- XML error:  The previous line is longer than the max of 90 characters ---------|
                      ij> 0 rows inserted/updated/deleted
                      ij> 0 rows inserted/updated/deleted
                      ij> 0 rows inserted/updated/deleted
                      ij> 0 rows inserted/updated/deleted
                      ij>
                      rb$
                      

          清單 4 中可以看到,當您通過重定向 ij 工具的標準輸入執行腳本時,惟一顯示的文本是來自 ij 工具的消息,其中包括 0 rows inserted/updated/deleted 等信息消息或警告和錯誤消息。如果想要消除這些消息,可以重定向 ij 工具的標準輸出和標準錯誤。例如,如果正在 Bash shell 中工作,則可以使用

          java org.apache.derby.tools.ij < derby.create.sql > derby.create.out 2> derby.create.err

          實現這一點,它運行 derby.create.sql 腳本文件,將輸出消息保存到 derby.create.out 中,并將所有 ij 錯誤消息保存到 derby.create.err 中。

          現在您將關注使用 Apache Derby 將數據插入表的過程。要繼續進行,您需要一個 Derby 數據庫,它必須具有可用的產品表。如果您還未實現此步驟,您需要執行 derby.create.sql 腳本文件。





          回頁首


          在 Apache Derby 中插入數據

          構建數據庫應用程序時最重要的任務之一是將數據插入到數據庫中。這與數據庫軟件的好壞無關,如果將壞數據放入數據庫中,其他一切都不重要了。有許多方法可以將數據插入數據庫中,但下文將主要使用 SQL INSERT 語句將數據插入 Apache Derby 數據庫中。

          SQL INSERT 語句

          在使用 SQL INSERT 語句將數據插入 Apache Derby 數據庫中之前,必須知道如果正確地使用該語句。清單 5 提供了 Apache Derby 中 SQL INSERT 語句的完整語法。


          清單 5. SQL INSERT 語法
          INSERT INTO table-Name
                      [ (Simple-column-Name [ , Simple-column-Name]* ) ]
                      Expression
                      

          該語法應該比較熟悉。如本系列的 上一篇文章 所述,方括號 ([ ]) 包括可選參數。其用途不是立即清楚的惟一組件是 Expression;但這個簡單的短語能夠有多復雜呢?當然,外表可能會蒙蔽人;Expression 詞可以擴展為下列四個不同的結構之一:

          • 單行 VALUES 列表
          • 多行 VALUES 列表
          • SELECT 表達式
          • UNION 表達式

          其中,最后兩個超出了本文范圍,將在后續文章中詳細介紹。前兩個相似;惟一的區別在于第一種形式將一行插入表中,而后一種形式將多行插入表中。

          可以使用 SQL INSERT 語句的可選部分指定要插入到表中的值的列順序。默認情況下,數據插入到表中的列順序與創建表時列的列出順序相同。有時候您希望更改這種順序或可能希望只為具有 NOT NULL 約束的列指定值。通過在 SQL INSERT 語句中顯式列出列,您將獲得對操作的更多控制,并可以更容易地處理這些特定的用例。

          SQL VALUES 表達式的語法相當簡單,如 清單 6 所示。


          清單 6. SQL VALUES 語法
          {
                      VALUES ( Value {, Value }* )
                      [ , ( Value {, Value }* ) ]* |
                      VALUES Value [ , Value ]*
                      }
                      

          該語法首先顯示多行格式,然后是單行格式(記住,豎線字符 | 表示或者,星號字符 * 表示一個或多個)。value 詞表示想要插入特定列的值。要將數據插入多列,必須將一行的數據括在逗號分隔的括號內。

          下面兩節展示要實現的語法示例。

          使用 SQL 插入數據

          清單 7 所示,要將數據插入表中,首先需要啟動 ij 工具并連接數據庫。記住,要將數據插入表中,表必須存在。如果還沒有表的話,則執行本文之前所述的用于創建表的腳本。


          清單 7. 插入單行
          rb$ java org.apache.derby.tools.ij
                      ij version 10.1
                      ij> connect 'jdbc:derby:test' ;
                      ij> INSERT INTO bigdog.products
                      VALUES(1, 19.95, '2006-03-31', 'Hooded sweatshirt') ;
                      1 row inserted/updated/deleted
                      ij> INSERT INTO bigdog.products(itemNumber, price, stockDate, description)
                      VALUES(2, 99.99, '2006-03-29', 'Beach umbrella') ;
                      1 row inserted/updated/deleted
                      ij> INSERT INTO bigdog.products(itemNumber, price, stockDate)
                      VALUES(3, 0.99, '2006-02-28') ;
                      1 row inserted/updated/deleted
                      ij> exit ;
                      

          本例展示了對 bigdog.products 表的三個單行插入。第一個 SQL INSERT 語句沒有提供列列表;它插入 itemNumberpricestockDatedescription。注意,插入到 stockDatedescription 列的值括在單引號字符中。description 列是長度可變的字符串,所以它預計是一個字符串(通過將字符數據括在單引號中指明)。另一方面,stockDate 列是一個日期列;它需要您將日期括在單引號中以正確解析出正確的日、月和年信息。(有關 SQL INSERT 操作期間數據類型格式的更多指南,請閱讀聯機文檔或參閱本系列的 上一篇文章。)

          第二個 SQL INSERT 語句顯式列出所有四列并相應地插入新值。最后一個 SQL INSERT 語句只列出三列并只插入三個值。description 列留為空白,這意味著它將具有 NULL 值。

          雖然單行 SQL INSERT 語句可能有用,但當您需要插入多行時,直接插入多行可能更有效,如 清單 8 所示。


          清單 8. 插入多行
          rb$ java org.apache.derby.tools.ij
                      ij version 10.1
                      ij> connect 'jdbc:derby:test' ;
                      ij> INSERT INTO bigdog.products(itemNumber, price, stockDate, description)
                      VALUES (4, 29.95, '2006-02-10', 'Male bathing suit, blue'),
                      (5, 49.95, '2006-02-20', 'Female bathing suit, one piece, aqua'),
                      (6, 9.95, '2006-01-15', 'Child sand toy set'),
                      (7, 24.95, '2005-12-20', 'White beach towel'),
                      (8, 32.95, '2005-12-22', 'Blue-striped beach towel'),
                      (9, 12.95, '2006-03-12', 'Flip-flop'),
                      (10, 34.95, '2006-01-24', 'Open-toed sandal') ;
                      7 rows inserted/updated/deleted
                      ij> exit ;
                      

          在本例中,首先啟動 ij 工具并連接數據庫。下一代碼行通過顯式列出所有四列并為每行提供新值,將 7 行插入數據庫中。如前所述,多行插入將每個新行的值包括在括號內,這些值之間用逗號分隔。該 SQL INSERT 語句執行之后,ij 工具報告這 7 新行已經插入。

          在 Apache Derby 中插入數據

          多行插入優于多個單行插入;但更好的方法是將 SQL INSERT 語句放在腳本文件中,運行腳本來插入數據。這種方法允許您更容易地修復錯誤或根據需要重新插入數據,而無需重新創建必需的 SQL INSERT 語句。如前所述,可以 隨本文下載 的 .zip 文件包括兩個 SQL 腳本文件。第二個腳本文件 (derby.insert.sql) 將上一節提供的 10 行插入到數據庫中,并執行簡單查詢以顯示結果,從而驗證插入操作。執行查詢操作的機制將在下一篇文章中詳細討論,但您不必理解查詢就能夠運行插入腳本。

          要執行腳本,可以選擇本文開頭展示的三個方法之一。在 清單 9 中,通過重定向 ij 工具的標準輸入以從腳本文件中讀取的方式,來執行插入腳本。插入 10 行,然后結果顯示到屏幕上。


          清單 9. 驗證插入操作
          $ java org.apache.derby.tools.ij < derby.insert.sql
                      ij version 10.1
                      ij> ij> 10 rows inserted/updated/deleted
                      ij> ITEMNUMBER |PRICE   |STOCKDATE |DESCRIPTION
                      -------------------------------------------------------------------------------
                      1          |19.95   |2006-03-31|Hooded sweatshirt
                      2          |99.99   |2006-03-29|Beach umbrella
                      3          |0.99    |2006-02-28|
                      4          |29.95   |2006-02-10|Male bathing suit, blue
                      5          |49.95   |2006-02-20|Female bathing suit, one piece, aqua
                      6          |9.95    |2006-01-15|Child sand toy set
                      7          |24.95   |2005-12-20|White beach towel
                      8          |32.95   |2005-12-22|Blue-striped beach towel
                      9          |12.95   |2006-03-12|Flip-flop
                      10         |34.95   |2006-01-24|Open-toed sandal
                      10 rows selected
                      ij> ij> rb$
                      





          回頁首


          結束語

          本文討論了兩個主要主題。首先向您介紹了 SQL 腳本文件的概念,該腳本文件可用于以自動方式執行多個 SQL(或 Derby)命令。使用 Apache Derby ij 工具執行 SQL 腳本文件有三種方法:從工具中、使用 run 命令或直接從命令行使用這兩種方法之一。然后,您回顧了 INSERT 語句的 SQL 語法,并查看了如何使用該語句將數據插入 Derby 數據庫中的示例。后續文章將在此基礎上查詢、更新和刪除 Apache Derby 數據庫中的數據。






          回頁首


          下載

          描述 名字 大小 下載方法
          Derby SQL scripts for this article derby4.zip 1KB HTTP
          關于下載方法的信息

          posted on 2007-11-27 23:39 smildlzj 閱讀(1494) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 彭州市| 房产| 上林县| 鄂温| 邛崃市| 刚察县| 肥西县| 西充县| 高陵县| 崇州市| 北海市| 南安市| 肥西县| 塘沽区| 浪卡子县| 博白县| 宝应县| 镇安县| 湖南省| 义马市| 新闻| 阳东县| 文水县| 若羌县| 四子王旗| 宾阳县| 绥阳县| 盐山县| 新巴尔虎左旗| 广宗县| 东乡县| 宾阳县| 五指山市| 丹凤县| 景洪市| 泾川县| 龙陵县| 兴宁市| 固镇县| 辽阳县| 华宁县|