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

动态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的差别

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

本讲回顾



数据库系统学习笔记

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容