绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
apache derby_使用Apache Derby进行数据库开发,第3部分
2022-04-08 11:38:53

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脚本
  1. -- Ignore the database not created warning if present
  2. connect 'jdbc:derby:test;create=true' ;
  3. -- First delete the tables if they exist.
  4. -- Ignore the table does not exist error if present
  5. DROP TABLE bigdog.products ;
  6. DROP TABLE bigdog.vendors ;
  7. -- CREATE the products table for bigdog's Surf Shop
  8. CREATE TABLE bigdog.products (
  9. itemNumber INT NOT NULL,
  10. price DECIMAL(5, 2),
  11. stockDate DATE,
  12. description VARCHAR(128)
  13. ) ;
  14. -- CREATE the products table for bigdog's Surf Shop
  15. CREATE TABLE bigdog.vendors (
  16. itemNumber INT NOT NULL,
  17. vendornumber INT NOT NULL,
  18. vendorName CHAR(64)
  19. ) ;
  20. exit ;

清单1中显示的脚本重新创建了bigdog模式以及本系列的上一篇文章中演示的两个表( productsvendors )。 如果不清楚这些概念中的任何一个,则应先回过头再重新阅读该文章,然后再解决该问题。 由于本文介绍了将数据插入表的基础,因此您首先需要创建准备接受新数据的表。

编辑Derby SQL脚本

脚本文件只是一个文本文件,其中包含SQL命令和Apache Derby命令的组合,这些命令可以直接从Apache Derby ij工具运行。 脚本文件简化了Apache Derby数据库的开发和维护,并提供了用于构建数据库的自文档技术。 您应该将这些文件存储为ASCII文本文件,而不是RTF文件(或任何其他格式),以防止出现文本编码错误。 某些文本应用程序(例如Microsoft®Windows®系统上的Wordpad)可能会尝试自动将文件另存为RTF文件。 请小心避免这样做,否则在尝试执行脚本文件时可能会遇到问题。

您可以将表创建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脚本
  1. rb$ mkdir test
  2. rb$ cp derby4.zip test/
  3. rb$ cd test/
  4. rb$ unzip derby4.zip
  5. Archive: derby4.zip
  6. inflating: derby.create.sql
  7. inflating: derby.insert.sql
  8. rb$ ls
  9. derby.create.sql derby.insert.sql derby4.zip
  10. rb$ java org.apache.derby.tools.ij
  11. ij version 10.1
  12. ij> run 'derby.create.sql' ;
  13. ij> -- Ignore the database not created warning if present
  14. connect 'jdbc:derby:test;create=true' ;
  15. ij> -- First delete the tables if they exist.
  16. -- Ignore the table does not exist error if present
  17. DROP TABLE bigdog.products ;
  18. ERROR 42Y07: Schema 'BIGDOG' does not exist
  19. ij> DROP TABLE bigdog.vendors ;
  20. ERROR 42Y07: Schema 'BIGDOG' does not exist
  21. ij> -- CREATE the products table for Bigdog's Surf Shop
  22. CREATE TABLE bigdog.products (
  23. itemNumber INT NOT NULL,
  24. price DECIMAL(5, 2),
  25. stockDate DATE,
  26. description VARCHAR(128)
  27. ) ;
  28. rows inserted/updated/deleted
  29. ij> -- CREATE the products table for Bigdog's Surf Shop
  30. CREATE TABLE bigdog.vendors (
  31. itemNumber INT NOT NULL,
  32. vendornumber INT NOT NULL,
  33. vendorName CHAR(64)
  34. ) ;
  35. rows inserted/updated/deleted
  36. ij> exit ;

尽管清单2仅执行Derby脚本似乎很长,但是过程很简单。 本示例假定您已打开终端(或Windows Command进程窗口-但请注意,本示例中的某些步骤是特定于UNIX®的),并且您已更改为保存derby4.zip文件的目录。包含本文提供的两个脚本文件 。 为了大程度地减少出错的可能性,您首先创建一个新目录,将derby4.zip文件复制到该新目录中,然后切换到该新目录。 然后展开示例.zip文件。 如目录清单所示,新目录中现在有三个文件:derby4.zip,derby.create.sql和derby.insert.sql。 现在,您将只使用创建脚本文件; 插入脚本文件将在本文末尾使用。

如果事情不顺利怎么办?

有时候,无论您多么努力,事情都不是很正确。 如果您不能安全地执行derby.create.sql脚本,则可以进行多种检查:

  • 确保Derby ij工具正确启动。 如果不是,则可能是CLASSPATH工具问题。
  • 确保您有可用的磁盘空间来创建新数据库。
  • 确保在尝试执行脚本文件的目录中具有适当的权限(以读取脚本文件并创建新数据库)。
  • 确保您的脚本文件是简单的ASCII文本文件。

如果所有其他方法均失败,请查看新的Derby文档,该文档可从Apache Derby网站免费获得(请参阅参考资料部分以获取链接),或在Derby邮件列表中询问您的问题。

清单2的其余部分演示了如何从Derby ij工具中执行derby.create.sql脚本文件。 首先,您启动ij工具。 如果这样做有问题,则可能需要阅读本系列篇文章中介绍的Derby安装验证步骤。 出现ij>提示符后,就可以运行适当的脚本文件了。 通过使用run命令来执行此操作,该命令带有一个参数:用单引号引起来的脚本文件的名称。

在执行此脚本时,您可能会看到新的ij>提示,命令以及警告或错误消息的组合。 该显示可能看起来很尴尬,但是run命令执行脚本文件的方式就像您在ij工具中直接键入命令一样。 后,处理exit命令,并完成脚本,关闭ij工具。 如果您的个脚本执行的输出与清单2中的显示匹配,那么恭喜您。 现在,您有了一个新的测试数据库,其中有两个准备好容纳数据的新表。

尽管从ij工具中执行脚本的技术可以有效,但有时更容易进一步自动化该过程。 下一节讨论如何直接从命令行执行Derby脚本文件。

从命令行运行脚本

本节研究了两种从命令行运行脚本的技术。 种技术如清单3所示。

清单3.从命令行运行一个SQL脚本
  1. rb$ java org.apache.derby.tools.ij derby.create.sql
  2. ij version 10.1
  3. ij> -- Ignore the database not created warning if present
  4. connect 'jdbc:derby:test;create=true' ;
  5. WARNING 01J01: Database 'test' not created, connection made to existing database instead.
  6. ij> -- First delete the tables if they exist.
  7. -- Ignore the table does not exist error if present
  8. DROP TABLE bigdog.products ;
  9. rows inserted/updated/deleted
  10. ij> DROP TABLE bigdog.vendors ;
  11. rows inserted/updated/deleted
  12. ij> -- CREATE the products table for Bigdog's Surf Shop
  13. CREATE TABLE bigdog.products (
  14. itemNumber INT NOT NULL,
  15. price DECIMAL(5, 2),
  16. stockDate DATE,
  17. description VARCHAR(128)
  18. ) ;
  19. rows inserted/updated/deleted
  20. ij> -- CREATE the products table for Bigdog's Surf Shop
  21. CREATE TABLE bigdog.vendors (
  22. itemNumber INT NOT NULL,
  23. vendornumber INT NOT NULL,
  24. vendorName CHAR(64)
  25. ) ;
  26. rows inserted/updated/deleted
  27. ij> exit ;

清单3演示了直接从命令行执行脚本文件的种方法。 在这种情况下,您将脚本文件的名称作为ij工具的命令行参数提供。 脚本文件中的行将像以前一样读取并顺序处理。 如果您首先直接从ij工具中直接执行derby.create.sql脚本,现在在命令行的同一目录中运行相同的脚本文件,那么您应该会看到类似于清单3的输出(所有内容在行之后)列表)。 如图所示,您收到一条警告消息,表明未创建测试数据库,因为该数据库已经存在。 但是,这一次,您没有收到错误消息说不能删除这两个表,因为您已经创建了它们(如清单2所示)。 删除产品和供应商表后,重新创建它们,然后脚本退出。

还有另一种运行Derby脚本的方法:重定向ij工具的标准输入以从脚本文件中读取。 在基于UNIX的操作系统上,使用适合您的Shell的STDIN重定向字符(例如Bash Shell的小于号( < ))可以很容易地实现这一目标。 如清单4所示 ,该技术的好处是减少了屏幕上显示的输出量。

清单4.从命令行运行SQL脚本(第2部分)
  1. rb$ java org.apache.derby.tools.ij < derby.create.sql
  2. ij version 10.1
  3. ij> WARNING 01J01: Database 'test' not created, connection made to existing database instead.
  4. ij> rows inserted/updated/deleted
  5. ij> rows inserted/updated/deleted
  6. ij> rows inserted/updated/deleted
  7. ij> rows inserted/updated/deleted
  8. ij>
  9. 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语法
  1. INSERT INTO table-Name
  2. [ (Simple-column-Name [ , Simple-column-Name]* ) ]
  3. Expression

这种语法看起来应该很熟悉。 如本系列前一篇文章所述,方括号( [ ] )包含可选参数。 目的尚不清楚的组件是Expression ; 但是这个简单的短语有多复杂? 当然,外表可能是骗人的; Expression项可以扩展为以下四个不同结构之一:

  • 单行VALUES列表
  • 多行VALUES列表
  • SELECT表达式
  • UNION表达式

其中,后两个超出了本文的范围,将在以后的文章中进行更详细的讨论。 前两个相似; 的区别是种形式将一行插入表中,而后一种形式将多行插入表中。

您可以使用SQL INSERT语句的可选部分来指定要插入表中的值的列顺序。 默认情况下,数据以创建表时列出的列的顺序插入表的列中。 有时您可能想要更改此顺序,或者可能仅为具有NOT NULL约束的列指定值。 通过在SQL INSERT语句中显式列出各列,您可以更好地控制操作并可以更轻松地处理这些特定用例。

SQL VALUES表达式的语法非常简单,如清单6所示。

清单6. SQL VALUES语法
  1. {
  2. VALUES ( Value {, Value }* )
  3. [ , ( Value {, Value }* ) ]* |
  4. VALUES Value [ , Value ]*
  5. }

此语法首先显示多行格式,然后显示单行格式(请记住,垂直线字符|表示“ 或” ,而星号字符*表示一个或多个)。 value项代表您要插入到特定列中的值。 要将数据插入多列,必须将一行的数据括在用逗号分隔的括号中。

接下来的两节显示了正在实现的语法的示例。

使用SQL插入数据

清单7所示,要将数据插入表中,首先需要启动ij工具并连接到数据库。 请记住,要将数据插入表中,该表必须存在。 如果尚未执行此操作,请执行本文前面讨论的表创建脚本。

清单7.插入单行
  1. rb$ java org.apache.derby.tools.ij
  2. ij version 10.1
  3. ij> connect 'jdbc:derby:test' ;
  4. ij> INSERT INTO bigdog.products
  5. VALUES(1, 19.95, '2006-03-31', 'Hooded sweatshirt') ;
  6. 1 row inserted/updated/deleted
  7. ij> INSERT INTO bigdog.products(itemNumber, price, stockDate, description)
  8. VALUES(2, 99.99, '2006-03-29', 'Beach umbrella') ;
  9. 1 row inserted/updated/deleted
  10. ij> INSERT INTO bigdog.products(itemNumber, price, stockDate)
  11. VALUES(3, 0.99, '2006-02-28') ;
  12. 1 row inserted/updated/deleted
  13. 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.插入多行
  1. rb$ java org.apache.derby.tools.ij
  2. ij version 10.1
  3. ij> connect 'jdbc:derby:test' ;
  4. ij> INSERT INTO bigdog.products(itemNumber, price, stockDate, description)
  5. VALUES (4, 29.95, '2006-02-10', 'Male bathing suit, blue'),
  6. (5, 49.95, '2006-02-20', 'Female bathing suit, one piece, aqua'),
  7. (6, 9.95, '2006-01-15', 'Child sand toy set'),
  8. (7, 24.95, '2005-12-20', 'White beach towel'),
  9. (8, 32.95, '2005-12-22', 'Blue-striped beach towel'),
  10. (9, 12.95, '2006-03-12', 'Flip-flop'),
  11. (10, 34.95, '2006-01-24', 'Open-toed sandal') ;
  12. 7 rows inserted/updated/deleted
  13. ij> exit ;

在此示例中,您首先启动ij工具并连接到数据库。 下一行通过显式列出所有四列并为每一行提供新值,将七行插入数据库。 如前所述,多行插入将每个新行的值括在括号内,并且这些值之间用逗号分隔。 在此SQL INSERT语句之后, ij工具报告已插入七个新行。

在Apache Derby中插入数据

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

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

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

分享好友

分享这个小栈给你的朋友们,一起进步吧。

ApacheDerby
创建时间:2022-04-08 11:22:42
ApacheDerby
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • LCR_
    专家
戳我,来吐槽~