第十讲 嵌入式SQL语言之动态SQL

作者: 天际神游 | 来源:发表于2018-08-27 17:41 被阅读0次

    动态SQL的概念

    静态SQL特点:SQL语句在程序中已经按要求写好,只需要把一些参数通过变量(高级语言程序语句中不带冒号) 传送给嵌入式SQL语句即可(嵌入式SQL语句中带冒号)
    例如:

    SpecName = ‘张三’;
    exec sql select Sno, Sname, Sclass into :vSno, :vSname, :vSclass from
    Student where Sname= :SpecName ;
    

    动态SQL特点:SQL语句可以在程序中动态构造,形成一个字符串,然后再交给DBMS执行,交给DBMS执行时仍旧可以传递变量

    动态的构造SQL的字符串, 然后执行...

    动态SQL的执行方式

    • 立即执行语句: 运行时编译并运行
      EXEC SQL EXECUTE IMMEDIATE :host-variable;
    • Prepare-Execute-Using语句: PREPARE语句先编译,编译后的SQL语句允许动态参数,EXECUTE语句执行,用USING语句将动态参数值传送给编译好的SQL语句
    EXEC SQL PREPARE sql_temp FROM :host-variable;
    ...
    EXEC SQL EXECUTE sql_temp USING :cond-variable
    

    数据字典与SQLDA

    数据字典(Data dictionary),又称为系统目录(System Catalogs)

    • 是系统维护的一些表或视图的集合, 这些表或视图存储了数据库中各类对象的定义信息, 这些对象包括用Create语句定义的表、列、索引、视图、权限、约束等, 这些信息又称数据库的元数据--关于数据的数据
    • 不同DBMS术语不一样: 数据字典(Data Dictionary(Oracle))、目录表(DB2 UDB)、系统目录(INFORMIX)、系统视图(X/Open)
    • 不同DBMS中系统目录存储方式可能是不同的, 但会有一些信息对DBA公开. 这些公开的信息, DBA可以使用一些特殊的SQL命令来检索

    数据字典的内容构成

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

    ------程序员需要知道这些信息------

    • 与关系相关的信息
      • 关系名字
      • 每一个关系的属性名及其类型
      • 视图的名字及其定义
      • 完整性约束
    • 用户与账户信息, 包括密码
    • 统计与描述性数据: 如每个关系中元组的数目

    ------数据库管理系统实现算法需要用到这些信息------

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

    数据字典的结构:

    • 也是存储在磁盘上的关系
    • 专为高效访问设计的特定的数据结构

    不同的DBMS, 有不同的定义. 例如:

    X/Open标准的系统目录

    SQLDA

    SQL Descriptor Area, SQL描述符区域.

    • SQLDA是一个内存数据结构,内可装载关系模式的定义信息,如列的数目,每一列的名字和类型等等.
    • 通过读取SQLDA信息可以进行更为复杂的动态SQL的处理
    • 不同DBMS提供的SQLDA格式并不是一致的

    ODBC简介

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

    • 一组API(应用程序接口),支持应用程序与数据库服务器的交互
    • 应用程序通过调用ODBC API, 实现
      • 与数据服务器的连接
      • 向数据库发送SQL命令
      • 一条一条的提取数据库检索结果的元组传递给应用程序的变量
    • ODBC可以配合很多高级语言来使用,如C,C++, C#, Visual Basic, PowerBuilder等...
    ODBC

    JDBC

    JDBC是一组Java版的应用程序接口API,提供了Java应用程序与数据库服务器的连接和通讯能力.

    概念性的基本过程

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

    具体的实施过程

    1. 传递给Driver给DriverManager, 加载数据库驱动
      Class.forName()
    2. 通过URL得到一个Connection对象, 建立数据库连接
      • DriverManager.getConnection(sDBUrl)
      • DriverManager.getConnection(sDBUrl, sDBUserID, sDBPassword)
    3. 接着创建一个Statement对象(PreparedStatement或CallableStatement), 用来查询或者修改数据库
      • Statement stmt=con.createStatement()
    4. 查询返回一个ResultSet
      • ResultSet rs=stmt.executeQuery(sSQL)
    public static void JDBCexample(String dbid, String userid, String passwd){ 
        try { //错误捕获
            Class.forName ("oracle.jdbc.driver.OracleDriver");
            Connection conn = DriverManager.getConnection(
            "jdbc:oracle:thin:@db.yale.edu:1521:univdb", userid, passwd);
            //加载数据库驱动,建立数据库连接
            Statement stmt = conn.createStatement();
            //创建一个语句对象
            … Do Actual Work ….
            //进行SQL语句的执行与处理工作
            stmt.close();
            conn.close();
            //关闭语句对象,关闭连接
        } catch (SQLException sqle) {
            System.out.println("SQLException : " + sqle); 
        }
    }
    

    插入语句:

    try { 
        stmt.executeUpdate( "insert into instructor values(‘77987', ‘Kim', ‘Physics’,98000)");
        //插入一条记录
    } catch (SQLException sqle) {
        System.out.println("Could not insert tuple. " + sqle); 
    }
    

    获取值:

    // 执行一条SQL语句。获取下一条记录。提取“dept_name”属性值,提取第2列即“平均工资”列的值
    ResultSet rset = stmt.executeQuery( "select dept_name, avg(salary)"+ "from instructor group by dept_name");
    while ( rset.next() ) {
        System.out.println(rset.getString("dept_name") + " " + rset.getFloat(2)); 
    }
    

    嵌入式语言-ODBC-JDBC比较

    嵌入式SQL的思维模式

    嵌入式SQL的思维模式

    ODBC的思维模式

    ODBC的思维模式

    JDBC的思维模式

    JDBC的思维模式
    • 相同点: 都是建立数据库连接, 执行sql, 处理结果, 释放连接, 流程基本一致
    • 不同点, 操作方式的不同:
      • 嵌入式SQL按照语句进行操作
      • ODBC按照函数来进行操作
      • JDBC按照对象来进行操作
    有无ODBC的差别

    体会: 不断的抽象, 不断的分层达到, 通用, 易用的目的.

    本讲回顾



    数据库系统学习笔记

    相关文章

      网友评论

        本文标题:第十讲 嵌入式SQL语言之动态SQL

        本文链接:https://www.haomeiwen.com/subject/lmftwftx.html