apache derby_使用Apache Derby进行数据库开发,第3部分

apache derby

SQL脚本

在本系列的上一篇文章“ 使用Apache Derby进行数据库开发,第2部分:模式 ”(developerWorks,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 )。 如果不清楚这些概念中的任何一个,则应先回过头再重新阅读该文章,然后再解决该问题。 由于本文介绍了将数据插入表的基础,因此您首先需要创建准备接受新数据的表。

您可以将表创建SQL命令直接输入到Derby ij工具中,而不是直接将其放入文本文件中,并使ij工具直接在文件中运行命令。 本文包括一个包含两个脚本文件的.zip文件(请参阅下载部分以访问该文件)。 清单1中显示了其中之一derby.create.sql。 在本文逐步介绍该脚本文件中的各行时,您可以按照清单1中所示的代码进行操作,或者在您喜欢的文本编辑器中打开脚本文件。

脚本文件包含多行以两个破折号( -- )开头的行。 这些行是SQL注释; 您应该使用它们来提供脚本文件中每个主要组件用途的基本描述。 脚本中的第一个实际命令是Derby connect命令,该命令告诉ij工具连接到test数据库,并在必要时首先创建它。 接下来的命令是SQL DROP语句,该语句从bigdog架构中删除产品和供应商表。 如果表不存在(如果刚创建数据库,则是这种情况),将显示错误消息;否则,将显示错误消息。 但正如前面SQL注释所示,您可以放心地忽略这些消息。

首先删除表(如果存在),以便可以使用所需的确切列定义来干净地创建新表。 接下来的两个SQL语句就是这样做的,在bigdog模式中创建了product和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。 现在,您将只使用创建脚本文件; 插入脚本文件将在本文末尾使用。

清单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.
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语句不提供列列表; 它插入一个itemNumber ,一个price ,一个stockDate和一个description 。 请注意,插入到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工具并连接到数据库。 下一行通过显式列出所有四列并为每一行提供新值,将七行插入数据库。 如前所述,多行插入将每个新行的值括在括号内,并且这些值之间用逗号分隔。 在此SQL INSERT语句之后, ij工具报告已插入七个新行。

在Apache Derby中插入数据

多行刀片优于多个单行刀片。 但是更好的技术是将SQL INSERT语句放置在脚本文件中,然后运行脚本以插入数据。 这种方法使您可以更轻松地修复错误或在必要时重新插入数据,而无需重新创建必需SQL INSERT语句。 您可以通过本文下载的.zip文件包括两个SQL脚本文件,如前所述。 第二个脚本文件(derby.insert.sql)将上一节中介绍的十行插入数据库,并执行简单的查询以显示结果,从而验证插入操作。 在下一篇文章中将详细讨论执行查询操作的机制,但是您不必了解查询就能运行插入脚本。

要执行脚本,可以选择本文开头介绍的三种方法中的任何一种。 在清单9中 ,通过重定向ij工具的标准输入以从脚本文件读取来执行插入脚本。 插入十行,结果显示在屏幕上。

清单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数据库中的数据。


翻译自: https://www.ibm.com/developerworks/opensource/library/os-ad-trifecta4/index.html

apache derby

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值