重点与难点

  • 熟练掌握 SQL语句的动态构造技巧
  • 了解数据字典的作用,掌握使用技巧
  • 了解 ODBC/JDBC的工作原理

一. 动态SQL的概念和作用

  • 要解决的问题:
    • 问题 3:SQL语句如何执行
    • 问题 2:动态 SQL,依据条件动态构造 SQL语句,但欲访问的表名和字段名对编程者已知

1. 动态SQL的概念和作用

动态SQL是相对静态SQL而言的

  • 静态SQL 特点:SQL语句在程序中已经按要求写好,只需要把一些参数通过变量(高级语言程序语句中不带冒号)传送给嵌入式SQL语句即可(嵌入式SQL语句中带冒号)
  • 动态SQL 特点:SQL语句可以在程序中动态构造,形成一个字符串(就是一条SQL语句),然后再交给DBMS执行,交给DBMS执行时仍旧可以传递变量(动态SQL语句的构造,如何被执行)
image-20220326002230330

2. 动态SQL构造小结(案例:作业二)

3. 动态SQL语句的执行方式

  • 立即执行语句:运行时编译并执行

    • ```c strcpy(sqltext, "delete from customers where cid = 'C01'"); exec sql execute immediate :sqltext; exec sql commit work;
      1
      2
      3
      4
      5
      6
      7
      8

      - ***<u>Prepare-Execute-Using语句(延迟执行):</u>PREPARE语句先编译,编译后的 SQL语句运行动态参数,EXECUTE语句执行,USING语句将动态参数值传送给编译好的 SQL语句***

      - ```c
      strcpy(sqltext, "delete from customers where cid = :dcid");
      exec sql prepare delcust from :sqltext; /* prepare statement */
      exec sql execute delcust using :cust_id; /* using clause replaces ":n" above */
      exec sql commit work;

区别:构造的字符串 SQL内部有没有“变量 ”参数,P-E-U语句主要是高级语言要向SQL传递变量

二. 数据字典与SQLDA

要解决的问题:

  • 问题 8:依据条件动态 SQL的构造问题,表名和字段名对程序员未知

1. 数据字典的概念

数据字典又称为系统目录:是系统维护的一些表或视图的集合,这些表或视图存储了数据库中各类对象的定义信息(包括表、列、索引、视图、权限、约束等),这些信息又称数据库的 元数据——关于数据的数据

不同DBMS中系统目录存储方式可能是不同的,但会有一些信息对DBA公开。这些公开的信息,DBA可以使用一些特殊的SQL命令来检索。

2. 数据字典的内容构成

数据字典通常存储的是数据库和表的元数据,即模式本身的信息:

  • 与关系相关的信息(名字、属性名及其类型、视图名字及其定义、完整性约束)
  • 用户与账户信息,包括密码
  • 统计与描述性数据(如关系元组数目)
  • 物理文件组织信息(关系存储方式,关系的物理结构)
  • 索引相关的信息

3. 数据字典的表结构或视图

数据字典的结构:存储在磁盘上的关系,为内存高效访问设计的特定数据结构

image-20220328162613460

4. X/Open标准的系统目录

X/Open标准中有一个目录表Info_Schem.Tables,表中的一行是应该已经定义的表的相关信息

image-20220328162910656

模式的含义是指某一用户所设计和使用的表、索引及其他与数据库有关的对象的集合,因此表的完整名应是:模式名.表名。这样做可允许不同用户使用相同的表名,而不混淆。

5. Oracle 数据字典

Oracle数据字典由视图组成,分为三种不同形式,由不同的前缀标识

  • USER_:用户视图,用户所拥有的对象,在用户模式中
  • ALL_:扩展的用户视图,用户可访问的对象
  • DBA_:DBA视图(所有用户都可访问的DBA对象的子集)

例1:关于 的信息

image-20220328163814141

例2:关于表的列的信息

image-20220328163826895
1
2
3
// 获取Oracle定义的所有视图信息
Select view_name from all_views where owner=‘SYS’ and
view_name like ‘ALL_%’ or view_name like ‘USER_%’;

6. SQLDA

SQLDA(SQL Description Area):SQL描述符区域,是一个内存数据结构,内可装载关系模式的定义信息

SQLDA储存的是数据库和表的一些定义信息

三. ODBC

1. ODBC简介

ODBC (Open DataBase Connection):不同语言的应用程序 之间与不同数据库服务器之间 的通讯标准

统一接口,具体的DBMS通过一些Driver驱动程序(被ODBC安装),由ODBC调用,传递给不同的DBMS来对数据库进行操作。

2. ODBC连接数据库服务器

image-20220401103647997

image-20220401103731347

  • 确认具体 DBMS Driver 被安装到 ODBC 环境
  • 应用程序调用 ODBC API 时,ODBC API 会调用具体 DBMS Driver 库函数,DBMS Driver 库函数则与数据库服务器通信,执行相应的请求动作返回检索结果
  • ODBC 应用程序首先要分配一个 SQL 环境,再产生一个数据库连接句柄
  • 应用程序使用 SQLConnect() 打开一个数据库连接

3. ODBC 其他功能

  • 动态SQL语句的预编译——动态参数传递功能
  • 获取元数据特征(发现数据库中的所有关系特征,以及每一个查询结果的列的名字和类型等)
  • 默认每一条SQL语句都被作为一个独立的能够自动提交的事务来处理

四. JDBC

1. 概念

JDBC (Java DataBase Connection):Java版的应用程序接口API,提供了Java应用程序与数据库服务器的连接和通讯能力,分为Java.sql核心API和Javax.sql可选扩展API两个程序包。

2. JDBC功能

image-20220401123634037

  • java.sql.Statement——对特定的数据库执行SQL语句
  • java.sql.PreparedStatement——用于执行预编译的SQL语句
  • java.sql.CallableStatement——用于执行对数据库内嵌过程的调用
  • java.sql.ResultSet——从当前执行的SQL语句中返回结果数据
  • java.sql.DriverManager——处理驱动的调入并且对产生新数据库连接提供支持
  • Java.sql.Driver——通过驱动进行数据库访问,连接到数据库的应用程序必须具备 该数据库的特定驱动。
  • java.sql.Connection——代表对特定数据库的连接。
  • Try {...} Catch {...}——异常捕获及其处理

3. JDBC API 访问数据库过程

概念性的基本过程:打开一个连接 创建“Statement”对象,并设置查询语句 使用Statement对象执行查询,发送查询给数据库服务器和返回结果给应用程序 处理错误的例外机制

具体过程:

  • 传递一个Driver给DriverManager,加载数据库驱动
    • Class.forName()
  • 通过URL得到一个Connection对象,建立数据库连接
    • DriverManager.getConnection(sDBUrl)
    • DriverManager.getConnection(sDBUrl,sDBUserID,sDBPassword)
  • 接着创建一个Statement对象(PreparedStatement或CallableStatements),用来查询或者修改数据库
    • Statement stmt=con.createStatement()
  • 查询返回一个ResultSet
    • ResultSet rs=stmt.executeQuery(sSQL)

4. JDBC和ODBC比较

嵌入式 SQL思维模式

image-20220401210626875

ODBC思维模式

image-20220401210730883

JDBC思维模式

image-20220401210754005