存储过程及java调用

来源:互联网 发布:mac无法安装flash 编辑:程序博客网 时间:2024/05/22 12:33

过程和触发器概述


过程和触发器在数据库中存储过程 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 qFROM 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){ // ....}
原创粉丝点击