第15讲:嵌入式SQL语句(动态SQL)

一、动态SQL概述

1. 静态SQL vs 动态SQL

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

    ②静态SQL特点:SQL语句在程序中已经按要求写好,只需要把一些参数通过变量传递给SQL语句即可

  • specName = "张三";
  • exec sql select ... where Sname = :specName;

    ③动态SQL特点:SQL语句可以在程序中动态构造,形成一个字符串

  • sqltext = "delete from customers where cid = \'c006\'";
  • exec sql execute immediate :sqltext;

 

2. 动态SQL的作用

    ①如编写一个由用户确定检索条件的应用程序,我们就需要根据用户输入的条件来动态构造SQL语句(字符串)

 

二、动态SQL的两种执行方式

前提:SQL语句已经被构造在宿主语言的字符串变量中

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

  • exec sql execute immediate :字符串变量;

 

2. 延迟执行语句:prepare-execute-using语句

    ①prepare语句先编译,编译后的SQL语句允许有动态参数

    ②execute语句执行,用using语句将动态参数值传递给编译好的SQL语句

  • exec sql prepare sql_temp from :字符串变量;
  • exec sql execute sql_temp using :动态参数;

 

3. 两种执行方式的比较

    ①立即执行方式:

        strcpy(sqltext, "delete from customers where cid = 'C01'");        // 完整的SQL语句

        ...

        exec sql execute immediate :sqltext;

        exec sql commit work;

    ②延迟执行方式:

        strcpy(sqltext, "delete from customers where cid = :dcid");        // 带参数的SQL语句

        ...

        exec sql prepare delcust from :sqltext;

        exec sql execute delcust using :cust_id;        // cust_id值传递给dcid变量

        exec sql commit work;

    ③前一种方式中,字符串变量中没有“变量”参数,而后一种方式中,字符串变量中含有“变量”参数

 

三、数据字典及其作用

1. 数据字典的概念

    ①数据字典是系统维护的一些表或视图的集合,这些表或视图存储了数据库中各类对象的定义信息,这些信息又称作数据库的元数据(关于数据的数据)

    ②在不同的DBMS中,数据字典也被称为系统目录、目录表、系统视图等

    ③数据字典也是以关系的形式存储在磁盘上的,它具有特定的数据结构(以便高效访问内存)

 

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

    ①与关系相关的信息:关系名字、每个关系的属性名及其类型、视图的名字及其定义、完整性约束

    ②用户与账户信息

    ③统计与描述性信息:每个关系中元组的数目

    ④物理文件组织信息:关系是如何存储的(顺序/无序/散列等)、关系的物理位置

    ⑤索引相关的信息

    补:应用程序员在构造动态SQL语句时可能需要①中的信息。

 

3. 可能的字典数据结构

  • Relation_metadata = (关系名, 属性个数, 存储方式, 物理位置)
  • Attribute_metadata = (属性名, 关系名, 域类型, 位置, 长度)
  • User_metadata = (用户名, 登录密码, 组)
  • Index_metadata = (索引名, 关系名, 索引类型, 索引属性)
  • View_metadata = (视图名, 视图定义)

 

4. Oracle的数据字典

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

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

    ②如要使用Oracle数据字典中关于表的信息,Oracle定义了视图USER_Tables、ALL_Tables和DBA_Tables

    ③如要使用Oracle数据字典中关于表的列的信息,Oracle定义了视图USER_TAB_Columns、ALL_TAB_Columns...

    ④可以使用SQL语句来访问如上信息:select Column_Name from ALL_TAB_Columns where ...

    ⑤Oracle数据字典中还定义了其他视图,如TABLE_PRIVILEDGE、COLUMN_PRIVILEDGE、CONSTRAINT_DEFS等

 

5. SQLDA的概念

    ①SQLDA是一个内存数据结构,其内可装载关系模式的定义信息,如列的数目、每一列的名字和类型等

    ②通过读取SQLDA信息可以进行更为复杂的动态SQL的处理,不同DBMS提供的SQLDA格式并不是一致的

 

四、更为复杂的动态SQL:动态构造SQL语句,但欲访问的表名和字段名是未知的

    ①如针对一组表,编写由用户确定检索表和检索条件的查询程序

    ②要构造这样的一个SQL语句,需要了解数据字典和SQLDA

posted @ 2019-05-08 16:21  GGBeng  阅读(1735)  评论(0编辑  收藏  举报