过程和触发器概述


过程和触发器在数据库中存储过程 SQL 语句,以供所有应用程序使用。它们包括允许 SQL 语句的重复执行(LOOP 语句)和条件执行(IF 语句和 CASE 语句)的控制语句。

过程是通过 CALL 语句调用的,并且使用参数来接受值和将值返回到调用环境中。通过将过程名包括在 FROM 子句中,SELECT 语句也可以对过程结果集进行操作。

过程可以将结果集返回给调用者、调用其它过程或触发触发器。例如,用户定义的函数是一种将单个值返回到调用环境的存储过程。用户定义的函数不修改传递给它们的参数,而是拓展可用于查询和其它 SQL 语句的函数的范围。

触发器与特定数据库表相关联。只要有人插入、更新或删除关联表的行,触发器就会自动触发。触发器可以调用过程和触发其它触发器,但它们不具有任何参数并且无法由 CALL 语句调用 

示例

以下简单示例创建过程 new_dept,该过程执行 INSERT 到示例数据库的 department 表的操作,从而创建新的部门。


CREATE PROCEDURE new_dept ( IN id INT, IN name CHAR(35), IN head_id INT ) BEGIN INSERT INTO DBA.department ( dept_id, dept_name, dept_head_id ) VALUES ( id, name, head_id ); END


过程的主体是复合语句。复合语句以 BEGIN 语句起始,以 END 语句结束。在 new_dept 的例子中,复合语句是包括在 BEGIN 和 END 语句之间的单个 INSERT。

过程的参数可以标记为 IN、OUT 或 INOUT 之一。缺省情况下,参数是 INOUT 参数。new_dept 过程的所有参数都是 IN 参数,因为该过程并不更改它们。

调用过程

CALL 语句调用过程。过程可由应用程序调用,或者由其它过程和触发器调用。

有关详细信息,请参见 CALL 语句

以下语句调用 new_dept 过程来插入 Eastern Sales 部门:

CALL new_dept( 210, 'Eastern Sales', 902 );

在此调用后,您最好检查 department 表,以查看是否已添加该新部门。

已被授予该过程的 EXECUTE 权限的所有用户都可以调用 new_dept 过程,即使他们对 department 表不具有任何权限。

有关 EXECUTE 权限的详细信息,请参见 EXECUTE 语句 [ESQL]

调用返回结果集的过程的另一种方法是在查询中调用它。您可以对过程的结果集执行查询,并应用 WHERE 子句和其它 SELECT 功能以限制结果集。

SELECT t.id, t.quantity_ordered AS q
FROM sp_customer_products( 149 ) t

有关详细信息,请参见 FROM 子句

示例

以下语句从数据库中删除过程 new_dept:

DROP PROCEDURE new_dept

 


try{ 
int age = 39; 
String poetName = "dylan thomas"; 
CallableStatement proc = connection.prepareCall("{ call set_death_age(?, ?) }"); 
proc.setString(1, poetName); 
proc.setInt(2, age); 
cs.execute(); 
}catch (SQLException e){ // ....}