第六章 数据库应用编程

 

数据库连接技术  (ODBC/JDBC)

开放式数据库互连Open DataBase Connectivity,简写为ODBC

ODBC定义了一套基于SQL的、公共的、与数据库无关的API(应用程序设计接口);

使每个应用程序利用相同的源代码就可访问不同的数据库系统,存取多个数据库中的数据

从而使得应用程序与数据库管理系统DBMS)之间在逻辑上有独立性,使应用程序具有数据库无关性。

应用程序使用ODBC访问数据库的步骤

首先必须用ODBC管理器注册一个数据源

管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系;

应用程序只需将数据源名提供给ODBCODBC就能建立起与相应数据库的连接;

这样,应用程序就可以通过驱动程序管理器与数据库交换信息;

驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序;

驱动程序在执行完相应的SQL操作后,将结果通过驱动程序管理器返回给应用程序

使用ODBC管理器配置数据源

首先必须在数据库厂商的官网下载与你的数据库对应的驱动程序;

例如:名字为psqlodbc_x64.msi的驱动程序支持PostgreSQL  64位数据库;

执行psqlodbc_x64.msi安装PostgreSQL数据库驱动程序;

打开windows 7ODBC管理器,配置数据源。

JDBCJava DataBase ConnectivityJava数据库连接)技术的简称 ,是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成。

JDBC访问数据库步骤

Java使用JDBC连接数据库的例子

数据库存储过程

存储过程(Stored Procedure)是一种数据库的对象;

由一组能完成特定功能的SQL 语句集构成;

是把经常会被重复使用的SQL语句逻辑块封装起来,经编译后,存储在数据库服务器端;

当被再次调用时,而不需要再次编译;

当客户端连接到数据库时,用户通过指定存储过程的名字并给出参数,数据库就可以找到相应的存储过程予以调用。

CREATE [ OR REPLACE ] FUNCTION  name
    ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
    [ RETURNS retype | RETURNS TABLE ( column_name column_type [, ...] ) ]
AS $$         //$$用于声明存储过程的实际代码的开始
DECLARE
        -- 声明段
BEGIN
        --函数体语句
END;
$$ LANGUAGE lang_name;  //$$ 表明代码的结束, LANGUAGE后面指明所用的编程语言

//example
CREATE OR REPLACE FUNCTION countRecords ()  
RETURNS integer AS $count$  
declare  
    count integer;  
BEGIN  
   SELECT count(*) into count FROM STUDENT;  
   RETURN count;  
END;  
$count$ LANGUAGE plpgsql;

PL/SQL基本语法

1.声明局部变量

变量声明的语法如下:

 declare

     变量名  变量类型;

如果声明变量为记录类型,变量声明格式为: variable_name RECORD;

注:RECORD不是真正的数据类型,只是一个占位符。

例如:

declare

                 count intger;

                 rec RECORD ;

2、条件语句

 在PL/pgSQL中有以下三种形式的条件语句,与其他高级语言的条件语句意义相同。

1). IF-THEN

IF boolean-expression THEN

     statements

END IF;

 2). IF-THEN-ELSE

IF boolean-expression THEN

 statements

ELSE

 3). IF-THEN-ELSIF-ELSE

IF boolean-expression THEN

 statements

ELSIF boolean-expression THEN

 statements

ELSIF boolean-expression THEN

     statements

ELSE

  statements

END IF;

 

3、循环语句

1). LOOP 语句

LOOP

 statements

END LOOP [ label ];

2). EXIT

 EXIT [ label ] [ WHEN expression ];

例如:

 LOOP

                   count=count+1;

                   EXIT WHEN count >100;

              END LOOP;

3). CONTINUE

 CONTINUE [ label ] [ WHEN expression ];

例如:

: LOOP
          count=count+1;
          EXIT WHEN count > 100;
          CONTINUE WHEN count < 50;
          count=count+1;
    END LOOP; 

4). WHILE

WHILE expression LOOP

    statements

END LOOP ;

5). FOR

FOR name IN [ REVERSE ] expression ... expression LOOP

    statements

END LOOP;

例如:

 FOR i IN 1...10 LOOP

                    RAISE NOTICE 'i IS %', i;

              END LOOP;

 FOR i IN REVERSE 10...1  LOOP

      --do something

 END LOOP;

4.遍历命令结果

FOR record_or_row IN query LOOP

     statements

END LOOP ;

FOR循环可以遍历命令的结果并操作相应的数据

触发器是特殊类型的存储过程,主要由操作事件(INSERTUPDATEDELETE) 触发而被自动执行。

触发器可以实现比约束更复杂的数据完整性经常用于加强数据的完整性约束和业务规则

触发器本身是一个特殊的事务单位

触发器

与表相关联:必须定义在表或视图上。

自动触发:由执行INSERTDELETEUPDATE操作时触发

不能直接调用,也不能传递或接受参数

是事务的一部分:触发器和触发语句作为可在触 发器内回滚的单个事务

触发器按执行的次数可分:

   1)语句级触发器:由关键字FOR  EACH  STATEMENT声明,在触发器作用的表上执行一条SQL语句时,该触发器只执行一次,即使是修改了零行数据的SQL,也会导致相应的触发器执行。如果都没有被指定,FOR EACH STATEMENT会是默认值

   2)行级触发器:由关键字FOR  EACH  ROW标记的触发器,当触发器作用的表的数据发生变化时,每变化一行就会执行一次触发器。例如,假设学生成绩表有DELETE触发器,当在该表执行DELETE语句删除记录时,如果删除了20条记录,则将导致 DELETE触发器被执行20 次。

触发器按触发的时间分为三类:

1BEFORE触发器:在触发事件之前执行触发器。

2AFTER触发器:在触发事件之后执行触发器。

3INSTEAD OF触发器:当触发事件发生后,执行触发器中指定的函数,而不是执行产生触发事件的SQL 语句,从而替代产生触发事件的SQL操作。在表或视图上,对于INSERTUPDATE DELETE 三种触发事件,每种最多可以定义一个INSTEAD OF 触发器

触发器相关的特殊变量

1NEW

      数据类型是RECORD。对于行级触发器,它存有INSERTUPDATE操作产生的新的数据行。对于语句级触发器,它的值是NULL

2OLD

       数据类型是RECORD。对于行级触发器,它存有UPDATEDELETE操作修改或删除的旧的数据行。对于语句级触发器,它的值是NULL

3TG_OP

     数据类型是text;是值为INSERTUPDATEDELETE 的一个字符串,它说明触发器是为哪个操作引发。

PostgreSQL创建触发器的基本语法

CREATE  TRIGGER  触发器名  

    { BEFORE | AFTER | INSTEAD OF }

     ON 表名

     [ FOR [ EACH ] { ROW | STATEMENT } ]

     EXECUTE PROCEDURE 存储过程名 ( 参数列表 )

1指明所定义的触发器名  

2 BEFORE | AFTER | INSTEAD OF  指明触发器被触发的时间

3ON 表名 指明触发器所依附的表

4 FOR  EACH  { ROW | STATEMENT }  指明触发器被触发的次数

5 EXECUTE PROCEDURE 存储过程名 ( 参数列表指明触发时所执行的存储过程

PostgreSQL创建触发器的基本步骤

1检查数据库中将要创建的触发器所依附的表或视图是否存在,如果不存在,必须首先创建该表或视图。

2创建触发器被触发时所要执行的触发器函数,该函数的类型必须是TRINGER型,是触发器的执行函数。但要注意,有些数据库不需要独立定义触发器函数,而是在创建触发器时,定义触发器的过程体。

3创建触发器,一般需要指明触发器依附的表,触发器被触发执行的时间,触发器是行级触发器还是语句级触发器,触发器执行需要满足的条件。

数据库游标

1游标(Cursor是一种临时的数据库对象;

2用来存放从数据库表中查询返回的数据记录

3提供了从结果集中提取并分别处理每一条记录的机制;

4游标总是与一条SQL查询语句相关联;

5游标包括:SQL语言的查询结果,指向特定记录的指针。

游标的声明

1在存储过程中游标类型的变量。例如:游标变量  refcursor;

refcursor是关键字;

        此时,游标变量还没有绑定查询语句,因此不能访问游标变量

2使用游标专有的声明语法,如:

       游标名  CURSOR [ ( arguments ) ] FOR query;

      其中arguments为由逗号分隔的参数列表,用于打开游标时向游标传递参数,类似于存储过程或函数的形式参数;queryselect数据查询语句,返回的值存储在游标变量中。

打开游标

1OPEN FOR:

        其声明形式为:

        OPEN unbound_cursor FOR query;

       打开未绑定的游标变量,其query查询语句是返回记录的SELECT语句。

例如: OPEN curVars1 FOR SELECT * FROM student WHERE SID = mykey;

2OPEN FOR EXECUTE

     其声明形式为:  OPEN unbound_cursor FOR EXECUTE query-string;  

     打开未绑定的游标变量。EXECUTE将动态执行查询字符串。例如:

    OPEN curVars1 FOR EXECUTE 'SELECT * FROM ' || quote_ident($1);

    注意:$1是指由存储过程传递的第1个参数。

3)打开一个绑定的游标,其声明形式为:

         OPEN bound_cursor [ ( argument_values ) ];  

        仅适用于绑定的游标变量,只有当该变量在声明时包含接收参数,才能以传递参数的形式打开该游标,参数将传入到游标声明的查询语句中,例如:

    OPEN curStudent;

    OPEN curStudentOne (‘20160230302001’);

使用游标

      其声明形式为:    FETCH cursor INTO target;

      FETCH命令从游标中读取下一行记录的数据到目标中,读取成功与否,可通过PL/SQL内置系统变量FOUND来判断

  例如:

    FETCH curVars1 INTO rowvar;  --rowvar为行变量

    FETCH curStudent INTO SID, Sname, sex;

    请注意:游标的属性列必须与 目标列的数量一致,并且类型兼容。

关闭游标

     CLOSE cursorName;

     当游标数据不再需要时,需要关闭游标,以释放其占有的系统资源,主要是释放游标数据所占用的内存资源,cursorName是游标名。

    例如:   CLOSE curStudent;

     需要注意:当游标被关闭后,如果需要再次读取游标的数据,需要重新使用open打开游标,这时游标重新查询返回新的结果。

下面示例使用带参数的游标,从成绩表中查询分数大于某给定值的学号和课程号

猜你喜欢

转载自blog.csdn.net/lyc44813418/article/details/86176914