数据库连接技术 (ODBC/JDBC)
开放式数据库互连(Open DataBase Connectivity,简写为ODBC)
ODBC定义了一套基于SQL的、公共的、与数据库无关的API(应用程序设计接口);
使每个应用程序利用相同的源代码就可访问不同的数据库系统,存取多个数据库中的数据;
从而使得应用程序与数据库管理系统(DBMS)之间在逻辑上有独立性,使应用程序具有数据库无关性。
应用程序使用ODBC访问数据库的步骤
①首先必须用ODBC管理器注册一个数据源;
②管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系;
③应用程序只需将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接;
④这样,应用程序就可以通过驱动程序管理器与数据库交换信息;
⑤驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序;
⑥驱动程序在执行完相应的SQL操作后,将结果通过驱动程序管理器返回给应用程序
使用ODBC管理器配置数据源
①首先必须在数据库厂商的官网下载与你的数据库对应的驱动程序;
②例如:名字为psqlodbc_x64.msi的驱动程序支持PostgreSQL 64位数据库;
③执行psqlodbc_x64.msi,安装PostgreSQL数据库驱动程序;
④打开windows 7的ODBC管理器,配置数据源。
JDBC(Java DataBase Connectivity,Java数据库连接)技术的简称 ,是一种用于执行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循环可以遍历命令的结果并操作相应的数据
触发器是特殊类型的存储过程,主要由操作事件(INSERT、UPDATE、DELETE) 触发而被自动执行。
触发器可以实现比约束更复杂的数据完整性,经常用于加强数据的完整性约束和业务规则。
触发器本身是一个特殊的事务单位。
触发器
与表相关联:必须定义在表或视图上。
自动触发:由执行INSERT、DELETE、UPDATE操作时触发
不能直接调用,也不能传递或接受参数
是事务的一部分:触发器和触发语句作为可在触 发器内回滚的单个事务
触发器按执行的次数可分:
(1)语句级触发器:由关键字FOR EACH STATEMENT声明,在触发器作用的表上执行一条SQL语句时,该触发器只执行一次,即使是修改了零行数据的SQL,也会导致相应的触发器执行。如果都没有被指定,FOR EACH STATEMENT会是默认值。
(2)行级触发器:由关键字FOR EACH ROW标记的触发器,当触发器作用的表的数据发生变化时,每变化一行就会执行一次触发器。例如,假设学生成绩表有DELETE触发器,当在该表执行DELETE语句删除记录时,如果删除了20条记录,则将导致 DELETE触发器被执行20 次。
触发器按触发的时间分为三类:
(1)BEFORE触发器:在触发事件之前执行触发器。
(2)AFTER触发器:在触发事件之后执行触发器。
(3)INSTEAD OF触发器:当触发事件发生后,执行触发器中指定的函数,而不是执行产生触发事件的SQL 语句,从而替代产生触发事件的SQL操作。在表或视图上,对于INSERT、UPDATE 或 DELETE 三种触发事件,每种最多可以定义一个INSTEAD OF 触发器
触发器相关的特殊变量
(1)NEW
数据类型是RECORD。对于行级触发器,它存有INSERT或UPDATE操作产生的新的数据行。对于语句级触发器,它的值是NULL。
(2)OLD
数据类型是RECORD。对于行级触发器,它存有被UPDATE或DELETE操作修改或删除的旧的数据行。对于语句级触发器,它的值是NULL。
(3)TG_OP
数据类型是text;是值为INSERT、UPDATE、DELETE 的一个字符串,它说明触发器是为哪个操作引发。
PostgreSQL创建触发器的基本语法
CREATE TRIGGER 触发器名
{ BEFORE | AFTER | INSTEAD OF }
ON 表名
[ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE 存储过程名 ( 参数列表 )
(1)指明所定义的触发器名
(2) BEFORE | AFTER | INSTEAD OF 指明触发器被触发的时间
(3) ON 表名 指明触发器所依附的表
(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为由逗号分隔的参数列表,用于打开游标时向游标传递参数,类似于存储过程或函数的形式参数;query是select数据查询语句,返回的值存储在游标变量中。
打开游标
(1)OPEN FOR:
其声明形式为:
OPEN unbound_cursor FOR query;
打开未绑定的游标变量,其query查询语句是返回记录的SELECT语句。
例如: OPEN curVars1 FOR SELECT * FROM student WHERE SID = mykey;
(2)OPEN 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打开游标,这时游标重新查询返回新的结果。
下面示例使用带参数的游标,从成绩表中查询分数大于某给定值的学号和课程号