精华内容
下载资源
问答
  • 数据库小白,平时工作偏向数据分析,经常操作数据库,用的比较多的是视图,想了解下什么场景下才会用到存储过程呢?谢谢
  • mysql存储过程使用场景

    千次阅读 2019-10-24 16:20:22
    一、什么是存储过程 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,有点类似于应用程序的一个功能函数。 存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比...

    一、什么是存储过程

    简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,有点类似于应用程序的一个功能函数。

    存储过程跟触发器有点类似,都是一组SQL集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;

    二、存储过程特性

    有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;

    函数的普遍特性:模块化,封装,代码复用;

    速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

    基于以上特性,所以对于一些性能要求高,业务复杂的模块可以写到存储过程中,应用层直接调用即可。

    三、创建简单的存储过程

    3.1基本的语法

    CREATE PROCEDURE pro_now() -- 存储过程名称,自定义
    BEGIN -- 开始存储过程
           # 需要执行操作的sql语句集,可对数据表 进行CRUD 操作
           -- insert some sql here
    
    end; -- 结束存储过程
    

    3.2、创建一个查询当前时间的存储过程:

    CREATE  PROCEDURE pro_now() 
    BEGIN
        SELECT now();
    END;
    

    3.3、调用存储过程: call pro_now(); – call 关键字, “pro_now()” 存储过程名称

    3.4、查看已创建的存储过程: show PROCEDURE STATUS [ where name=‘pro_now’] ;

    3.5、删除存储过程:DROP PROCEDURE pro_now; – “pro_now” 存储过程名称

    四、创建带参数的存储过程

    4.1、 带输入参数的存储过程, 使用关键字: in

    a、示例如下:
    
    CREATE PROCEDURE pro_now_in(in time  VARCHAR(20) CHARACTER set "utf8")	
            -- CHARACTER set "utf8",设定字符集,解决中文乱码
    BEGIN
    	 SELECT now(),time;
    end;
    

    b、调用存储过程:

      set @time='当前时间';
      call pro_now_in(@time); --  call pro_now_in('当前时间'); 这样也可以
    

    c、结果如下:
    在这里插入图片描述

    4.2 带输出参数的存储过程,使用关键字: out

    a、示例如下:

    CREATE PROCEDURE pro_now_out(out time  VARCHAR(20),out title VARCHAR(20) CHARACTER set utf8)
    BEGIN
    	 SELECT now(),'当前时间' into time , title;
    end;
    

    b、调用存储过程:

    call pro_now_out(@times,@title);
    SELECT @title AS "标题",@times AS "时间";
    

    c、结果:
    在这里插入图片描述

    4.3、带输入、输出参数的存储过程,使用关键字: inout

    a、示例如下:

    CREATE PROCEDURE pro_now_inout(inout name VARCHAR(20),in title VARCHAR(10), out time VARCHAR(10))
    BEGIN
    	 SELECT CONCAT(name,'<--->',title) AS name,now() into name,time;
    end;
    

    b、调用存储过程:

    set @name='jack';
    set @title='toady';
    call pro_now_inout(@name,@title,@time);
    select @name as 'name and title',@time as 'time';
    

    c、结果:
    在这里插入图片描述
    d、理解:

    in (输入): name 、title
    out (输出): name 、 time
    CONCAT(name,’<—>’,title) 字符串拼接,对应 name 输出、 now() 对应 time 输出。

    五、创建带控制流程的存储过程

    5.1、if 语句
    a、示例如下:

     CREATE PROCEDURE pro_if(in num INT)
         BEGIN
    	    DECLARE result VARCHAR(20) CHARACTER set  utf8 DEFAULT null;
    	    IF num = 0 THEN  -- 开始if判断,注意用一个等号"="
    	        set result='num 为0啦'; -- 满足条件
    	    ELSEIF num > 0 THEN -- 下一个if判断
    		set result='num 大于 0';
      	    ELSEIF num < 0 THEN
    		set result='num 小于 0';
    	    ELSE -- 所有条件不满足的情况下
    		set result='num is null or other status';
    	    end if; -- 结束if 判断 
    	    SELECT result;
     end;
    

    b、调用存储过程:

     call pro_if('33');
    

    c、结果如下:
    在这里插入图片描述
    5.2 case 语句

    a、示例如下:

         CREATE PROCEDURE pro_case(in num INT)
    BEGIN
    	DECLARE result VARCHAR(20) CHARACTER set  utf8 DEFAULT null;
    	case num  -- 开始case 判断
    	when  2 THEN  -- 满足条件执行
    		set result='num 值是2';
     	 when -2 THEN  
    		set result='num 值是-2';
    	else  -- 所有条件不满足,执行
    		set result='num 不等于2和-2';
    	end case ; -- 结束case语句
    	SELECT result;
    end;
    

    b、调用存储过程:

    call pro_case(-2);
    

    c、结果如下:
    在这里插入图片描述

    5.3、while 循环语句

    a、示例如下:
    
    CREATE PROCEDURE pro_while(in num INT)
    BEGIN
    	DECLARE i int;
    	DECLARE result int;
    	set i=0;
    	set result=0;
    	while i < num DO -- 开始while 循环
    		set result=result+i;
    		set i=i+1;
    	end while; -- 结束while 循环 
    	SELECT result,i;
    end;
    

    b、调用存储过程:

    call pro_while(100);
    

    c、结果如下:
    在这里插入图片描述

    六、创建带游标循环的存储过程

    1、示例如下:

    CREATE PROCEDURE pro_cursor(out count int)
    BEGIN
    	declare  paper_id  VARCHAR(1000) ; -- 论文主键id
    	declare doctroName VARCHAR(1000) character set gbk; -- 医生名称
    	DECLARE paper_hos VARCHAR(1000); -- 医院id
    	DECLARE paper_room      VARCHAR(100); -- 医生专业
    	declare done int DEFAULT false ; -- 自定义控制游标循环变量,默认false
    	DECLARE  my_cursor CURSOR for (SELECT id,authorName,hospitalId,room
    							from yee_article_paper_authorid ); -- 定义游标并输入结果集  
    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE; -- 绑定控制变量到游标,游标循环结束自动转true 
    	OPEN my_cursor; -- 打开游标
    	myLoop:LOOP -- 开始循环体,myLoop为自定义循环名,结束循环时用到  
    	FETCH my_cursor into paper_id,doctroName,paper_hos,paper_room ;  -- 将游标当前读取行的数据顺序赋予自定义变量12  
    	if done THEN -- 判断是否继续循环  
    		LEAVE myLoop;-- 结束循环
    	END IF;
    	 -- 自己要做的事情,在 sql 中直接使用自定义变量即可  
    	insert into temp(str_id,name,hospitalId,room) 	
    VALUES(paper_id,doctroName,paper_hos,paper_room);
    	COMMIT; -- 提交事务
      END  LOOP myLoop; -- 结束 自定义循环体
    	CLOSE my_cursor; -- 关闭游标
    	# 循环结束后,统计导入个数
    	SELECT count(id)  count from temp into count; -- 计算个数
    end
    

    游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。

    七、Spring mvc 调取存储过程

    SimpleJdbcCall 类可以被用于调用一个包含 IN 和 OUT 参数的存储过程。你可以在处理任何一个 RDBMS 时使用这个方法,就像 Apache Derby, DB2, MySQL, Microsoft SQL Server, Oracle,和 Sybase。

    7、1创建表:

    CREATE TABLE ssers(
       ID   INT NOT NULL AUTO_INCREMENT,
       NAME VARCHAR(20) NOT NULL,
       AGE  INT NOT NULL,
       PRIMARY KEY (ID)
    );
    

    7.2 创建存储过程:

    DELIMITER $$
    DROP PROCEDURE IF EXISTS `TEST`.`getRecord` $$
    CREATE PROCEDURE `TEST`.`getRecord` (
    IN in_id     INTEGER,
    OUT out_name VARCHAR(20)  CHARACTER set "utf8",
    OUT out_age  INTEGER
    )
    BEGIN
       SELECT name, age
       INTO out_name,out_age
       FROM users where id = in_id;
    END $$
    DELIMITER ;
    

    delimiter是MySQL中的命令,这个命令与存储过程没什么关系。
    其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。
    即改变输入结束符。
    默认情况下,delimiter是分号“;”。

    7.3 dao 层调用存储过程

    Public class UserDaoImpl implements UserDao {
    
        @Autowired
        private JdbcTemplate myJdbc;
    
        @Autowired
        private DataSource dataSource;
    
    
        private UserModel  userModel;
    
        @Override
        public UserModel getUser(int id){
    
            //创建jdbccall对象
            SimpleJdbcCall jdbcCall = new SimpleJdbcCall(dataSource).withProcedureName("getRecord");
    
            //调用存储过程
            SqlParameterSource in   = new MapSqlParameterSource().addValue("in_id", id);
            Map<String, Object> out = jdbcCall.execute(in);
    
            UserModel user = new UserModel(0,null,0);
    
            user.setId(id);
            user.setName((String) out.get("out_name"));
            user.setAge((Integer) out.get("out_age"));
            return user;
    
            //普通的sql查询
            //String SQL     = "select * from users id = ?";
            //UserModel user = myJdbc.queryForObject(SQL,new Object[]{id}, new UserMapper());
            //return user;
    
        }
    
    }
    

    八、存储过程弊端

    不同数据库,语法差别很大,移植困难,换了数据库,需要重新编写;

    不好管理,把过多业务逻辑写在存储过程不好维护,不利于分层管理,容易混乱,一般存储过程适用于个别对性能要求较高的业务,其它的必要性不是很大;

    参考链接:

    https://blog.csdn.net/HaHa_Sir/article/details/79728854

    https://www.cnblogs.com/chenpi/p/5136483.html

    https://www.w3cschool.cn/wkspring/3yh61mmc.html

    展开全文
  • 存储过程五种使用场景比较

    千次阅读 2018-01-19 01:40:56
    存储过程五种使用场景比较 1. 使用 JDBC API 直接调用存储过程 Java Database Connectivity (JDBC) API 是 J2EE 的一部分,是 Java 语言访问关系数据库的基于标准的首要机制,提供了对数据库访问和缓存管理的直接...

    存储过程五种使用场景比较

    1. 使用 JDBC API 直接调用存储过程

    Java Database Connectivity (JDBC) API 是 J2EE 的一部分,是 Java 语言访问关系数据库的基于标准的首要机制,提供了对数据库访问和缓存管理的直接控制。

    JDBC 中的 CallableStatement 对象为所有的关系数据库管理系统 (RDBMS: Relational Database Management System) 提供了一种标准形式调用存储过程的方法。对存储过程的调用有两种形式:带结果参数和不带结果参数。结果参数是一种输出参数,是存储过程的返回值。两种形式都可带有数量可变的输入(IN 参数)、输出(OUT 参数)或输入和输出(INOUT 参数)的参数。

    在 JDBC 中调用存储过程的语法为:{call procedure_name[(?, ?, …)]};返回结果参数的存储过程的语法为:{? = call procedure_name[(?, ?, …)]};不带参数的存储过程的语法为:{call procedure_name}。其中,问号代表参数,方括号表示其间的内容是可选项。

    使用 CallableStatement 对象调用存储过程的过程如下:

    1. 使用 Connection.prepareCall 方法创建一个 CallableStatement 对象。
    2. 使用 CallableStatement.setXXX 方法给输入参数(IN)赋值。
    3. 使用 CallableStatement.registerOutParameter 方法来指明哪些参数只做输出参数(OUT),哪些是输入输出参数(INOUT)。
    4. 调用以下方法之一来调用存储过程:

       

      • int CallableStatement.executeUpdate: 存储过程不返回结果集。
      • ResultSet CallableStatement.executeQuery: 存储过程返回一个结果集。
      • Boolean CallableStatement.execute: 存储过程返回多个结果集。
      • int[] CallableStatement.executeBatch: 提交批处理命令到数据库执行。

       

    5. 如果存储过程返回结果集,则得到其结果集。
    6. 调用 CallableStatement.getXXX 方法从输出参数 (OUT) 或者输入输出参数 (INOUT) 取值。
    7. 使用完 CallableStatement 对象后,使用 CallableStatement.close 方法关闭 CallableStatement 对象。

    举例:清单 1. 使用 executeUpdate 来执行的存储过程

    Connection con = null;
    ...
    // Create a CallableStatement object
    CallableStatement cstmt = con.prepareCall("CALL exampleJDBC (?, ?, ?, ?, ?)");  
    cstmt.setString (1, “BeiJing”);  // Set input parameter
    cstmt.setInt (2, 2008);        // Set input parameter
    cstmt.registerOutParameter (3, Types.INTEGER);
    cstmt.registerOutParameter (4, Types.INTEGER);
    cstmt.registerOutParameter (5, Types.VARCHAR);
    cstmt.executeUpdate();  // Call the stored procedure
    int goldnumber = cstmt.getInt(3);   // Get the output parameter values
    int silvernumber = cstmt.getInt(4);
    String errorinfo = cstmt.getString(5);
    cstmt.close();

    当存储过程返回一个结果集时,只需遍历该结果集便可以得到存储过程执行的所有结果。具体例子见清单2。


    清单 2. 存储过程返回一个结果集
    CallableStatement cstmt = null;
    …
    boolean moreResultSets = cstmt.execute();
    ResultSet rs1 = cstmt.getResultSet();
    while (rs1.next())
         System.out.println(rs1.getString(1) + " " + rs1.getString(2));

    当存储过程返回多个结果集时,遍历所有结果集才能得到执行的所有结果,使用 getMoreResults() 方法跳转到下一个结果集。具体例子见清单3。


    清单 3. 存储过程返回多个结果集
    CallableStatement cstmt = null;
    …
    While (cstmt.getMoreResults()) {
    ResultSet rs2 = cstmt.getResultSet();
    while (rs2.next())
         System.out.println(rs2.getString(1) + " " + rs2.getString(2));
    rs2.close();
    }

    如果存储过程返回多个结果集,每个结果集的数据结构都不一样,或者某些结果集的数据结构未知,则可以使用 getColumnName() 方法来得到结果集中数据的列名。具体例子见清单 4。


    清单 4. 存储过程返回多个结果集,并且每个结果集的数据结构未知或者不一样
    CallableStatement cstmt = null;
    …
    boolean moreResultSets = cstmt.execute();
    while (moreResultSets) {
        ResultSet rs = cstmt.getResultSet();
        ResultSetMetaData rsmd = rs.getMetaData();
        StringBuffer buffer = new StringBuffer();
        for (int i = 1; i <= rsmd.getColumnCount(); i++){
             buffer.append(rsmd.getColumnName(i)).append("/t");
             System.out.println(buffer.toString());
             while (rs.next()) {
               buffer.setLength(0);
               for (int i = 1; i <= rsmd.getColumnCount(); i++)
                    buffer.append(rs.getString(i)).append("/t");
               System.out.println(buffer.toString());
             }
    }
    rs.close();
        moreResultSets = cstmt.getMoreResults();
    }

    适用场景:2. 使用 IBM DB Beans 调用存储过程

    多年来 JDBC 一直是 Java 开发人员进行数据访问的标准,这是一种稳定且被广泛证实的技术,目前已经发展成可以提供完全具有高速缓存和资源池机制的完善的数据库驱动程序。使用 JDBC 来调用存储过程是最常见的一种方式,由于 JDBC 是最接近于数据库的 API,因而其效率也是最高的。CallableStatement 对象为所有的 DBMS 提供了标准形式调用存储过程的方法,对于要求实现灵活,执行效率要求比较高应用,直接采用 JDBC API 来实现存储过程能很好地满足需要。

     

    JDBC API 是 J2EE 定义的访问后端数据库的标准 API,在 JDBC 的基础上,IBM WebSphere 部门从 WebSphere Application Server 5.0 开始提供了一个扩展的数据库访问框架 IBM DB Beans。这个框架提供了 JDBC 所不具有的众多扩展功能,包括带参数的查询、跨越多个事务的结果集缓冲以及通过缓冲执行更新、元数据映射等等,同时它也隐藏了用 JDBC 访问后端数据库时必须涉及的许多复杂细节,被设计成支持任何支持 JDBC 的数据源,使得 Bean与各种 DBMS 无关。

    WebSphere 的数据库访问扩展框架的 API 可以在 IBM 基于 Eclipse 的各种集成开发工具的 plugins 目录下找到,通常为 plugins 目录下插件 com.ibm.datatools.dbjars 所在目录下的 dbbeans.jar 文件中,开发时只要把这个 jar 文件放入项目的编译路径就可以使用。

    在 IBM 扩展的数据库访问框架中,DBProcedureCall 对象用于调用后端数据库的存储过程,并管理存储过程的执行结果。调用 DBStatement.setConnectionSpec() 可以设置 SQL 命令的连接属性,由于这一机制,同一个连接属性设置可用于一个以上的 SQL 命令。

    DBProcedureCall 继承自 DBStatement,通过 DBProcedureCall 调用存储过程时,获取元数据使用 DBStatement 的 getParameterMetaData() 方法。参数可以是自定义的 Java 类,也可以是 Java 的标准数据类型;如果要将 Java 数据类型映射到数据库字段类型,这一机制是非常有用的。下面是一个例子:

    举例:清单 5. 使用 DBProcedureCall 调用存储过程

    DBProcedureCall procCall = null;
    DBParameterMetaData parmMetaData = null;
    
    try {
      // Create DatabaseConnection object and set its properties
      procCall = new DBProcedureCall();
    
      // Connect to database via DataSource object
      procCall.setDataSourceName("jdbc/sample");
    
      // Set user name and password
      procCall.setUsername(userid);
      procCall.setPassword(password);
    
      // Make it auto commit
      procCall.setAutoCommit(false);
    
      // Set SQL statement
      procCall.setCommand("{ CALL DB2ADMIN.INSERTORDER (:ORDERID,:DATE) }");
    
      // Get DBParameterMetaData object and set its properties
      parmMetaData = procCall.getParameterMetaData();
      parmMetaData.setParameter(1, "ORDERID",
      java.sql.DatabaseMetaData.procedureColumnIn,
      java.sql.Types.CHAR, String.class);
      parmMetaData.setParameter(2, "DATE",
      java.sql.DatabaseMetaData.procedureColumnIn,
      java.sql.Types.CHAR, String.class);
    
    
    // Set input parameter for stored procedure
      procCall.setParameter("ORDERID", order);
      procCall.setParameter("DATE", date);
    
      // Execute stored procedure
      procCall.execute();
    
      // Return DBProcedureCall object
      return procCall;
    
    } catch (Exception ex) {
      ex.printStackTrace();
    } finally {
      // Release resource used by DBProcedureCall
      try {
    if (procCall != null)
      procCall.close();
      } catch (java.sql.SQLException ex) {
      }
    }

    IBM 集成开发环境 RDA(Rational Data Architect) 提供了对 DB Beans 的支持,能够图形化地生成 DB Beans 的绝大部分代码。RDA 是 IBM 提供的企业数据建模和整合设计工具,旨在帮助数据架构师理解数据资产及其关系,设计联邦数据库,以及流线化数据库项目,能够帮助数据架构师发现、建模、可视化、关联和开发异构数据资产。更多关于 RDA 的使用参见参考文献。

    适用场景:3. WebShpere Adapter for JDBC 发现和访问存储过程

    IBM 数据库访问框架提供了丰富的扩展功能,例如带参数的查询、结果集缓冲以及通过缓冲执行更新、元数据映射,等等,同时它也隐藏了用 JDBC 访问后端数据库时必须涉及的许多复杂细节,这种方式使开发人员不用针对各种 JDBC 应用单独实现这些功能。

     

    J2EE Connector Architecture (JCA) 1.5标准定义了资源适配器 (Resource Adapter) 组件规范,使J2EE应用程序可以通过标准接口和各种企业信息系统(EIS: Enterprise Information System)交互,如ERP 系统、SCM 系统以及各种数据库系统等等,以便获取所需的数据和服务。

    基于 JCA 标准,IBM 提供了 WebShpere Adapter 实现 J2EE 组件和 EIS 之间数据的交互。WebShpere Adapter 可以部署在 WebSphere 业务流程服务器 WPS (WebSphere Process Server) 或者 WebSphere 企业服务总线 ESB (WebSphere Enterprise Service Bus) 上,以连接服务器上的 J2EE 应用程序和 EIS,如图 1。


    图 1. 部署在 WPS 上的 IBM WebSphere Adapter
    ![这里写图片描述](https://img-blog.csdn.net/20180119013005448?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzc4Nzg1Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 

    WebShpere Adapter 可以分为两类:Application Adapters 和 Technology Adapters。Application Adapters 是针对各种特定 EIS 的适配器,如 SAP, Siebel, Peoplesoft 和 Oracle eBusiness Suite 等;Technology Adapters 是针对实现某种技术的 EIS 系统,如 WebSphere Adapter for JDBC、Mail 适配器、Text 适配器和 XML 适配器。

    WebSphere Adapter for JDBC 是一种提供 J2EE 应用和支持 JDBC 2.0 的数据库系统之间的连接的 WebShpere Adapter,属于 Technology Adapters。WebSphere Adapter for JDBC 使用业务对象 (BO: Business Object) 的形式来传递数据,提供了 Inbound 和 Outbound 两种方式。其工作机制见图 2。

    WebSphere Adapter for JDBC 的工作机制:


    图 2. WebSphere Adapter for JDBC 的工作机制
    ![这里写图片描述](https://img-blog.csdn.net/20180119013404993?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzc4Nzg1Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)  

    对于 Outbound 操作,J2EE 应用程序产生 BO,并将其传递给 WebSphere Adapter for JDBC,Adapter 根据 BO 中指定的操作,比如增加、删除、修改,查找,创建记录等操作,访问其连接的数据库并进行响应的操作。

    对于 Inbound 操作,数据库中的数据通过某个 EIS 得到了更新,这个更新通过触发器或者其他方式被捕获,将这个事件和相应的事件信息插入到一个 “EventStore” 表中。Adapter 会监测 Event Table 中的数据,将每个事件构建成一个 Business Graph 并发送到订阅相应的数据表改变事件的 J2EE 应用程序中。

    使用 IBM Websphere 集成开发环境 WID (Websphere Integration Developer) 能够开发各种 WebShpere Adapter 的组件。WID 实现了企业元数据发现(EMD: Enterprise Metadata Discovery)规范,使用企业服务发现器(ESD: Enterprise Service Discovery)来连接各种 EIS,以发现其上存在的数据和服务,并自动产生相应的访问接口。有关企业元数据发现规范和企业服务发现器的详细介绍,请看后面的参考资料。

    WebSphere Adapter for JDBC 的 Outbound 操作能够自动发现数据库中的存储过程,并生成相应的业务对象和接口。这样 J2EE 应用程序只需要使用生成的业务对象和接口就可以调用数据库中的存储过程。使用 WID 创建针对存储过程的 Outbound 组件原理和步骤如下:

    1. 在WID中创建商业模块(Business Module):切换到Business Integration视图下,创建一个商业模块,之后创建的EIS的Outbound组件将成为这个商业模块的一部分。
    2. 导入 JDBC 资源适配器:将 JDBC Adapter 的 CWYBC_JDBC.RAR 文件导入到 WID 中,这个文件既包括了实现了 JCA 标准的 JDBC 适配器,也包括了企业服务发现器的文件。通常可以在下面的路径中找到这个文件:<WIDInstallDIR>/Resource Adapters/JDBC/deploy。
    3. 创建企业服务发现向导,并使用其创建业务对象和接口与设置连接属性:主要包括如下内容:
    • 设置连接数据库属性,包括用户名,密码,数据库 URL 和 JDBC 驱动等。
    • 企业服务发现器使用上述连接属性,连接到现有数据库中,自动发现数据库中的数据库表,视图,存储过程等数据库对象。
    • 从发现的结果中选择某个数据库对象,设置适配器的连接方式为Outbound,企业服务发现器将创建业务对象和相应的接口。在这里,我们选择存储过程这种数据库对象。
    • 设置WebSphere Adapter for JDBC运行时需要的连接属性,可以通过设置JNDI名和设置激活认证别名两种方式。使用激活别名认证方式时,大部分属性必须在创建JDBCAdapter 项目时指定,使用JNDI名认证时,这些属性需要在配制运行环境时在WPS管理控制台设置。

    举例:图 3. 使用 IBM WID 生成的 WebSphere Adapter for JDBC EIS 导出组件
    ![这里写图片描述](https://img-blog.csdn.net/20180119013704304?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzc4Nzg1Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

    需要说明的是,对于需要 7*24 小时的应用或者对于含有多个适配器的应用,推荐使用 JNDI 方式设置WebSphere Adapter for JDBC 运行时需要的连接属性。这样的话,当数据库发生变化,例如数据库迁移,用户名密码变更等,只需要动态修改 WPS 中 JNDI 的配置信息即可,无需重新部署和启动适配器所在的商业模块也无需修改每个适配器。

    适用场景:4. 将存储过程暴露成 Web Service

    IBM WebSphere Adapter for JDBC 将存储过程自动生成一系列的业务对象和接口供开发人员使用,数据库充当服务提供程序或者使用者,开发人员只需要处理 Inbound 和 Outbound 即可。这种方式适用于数据库结构已经固定,不会再有显著变化的情况,比如对现有系统或者遗留的整合或者再次开发。假如在一个新项目中大量采用WebSphere Adapter for JDBC 这种方式,很可能反而降低开发效率,尤其不推荐将这种方式用于极限编程。当用户的需求或者数据库表结构经常不断变化时,使用 IBM WebSphere Adapter 进行开发的成本将大大提高,因为数据库表的每一次变化都会导致需要重新生成 WebSphere Adapter for JDBC 的 Inbound 或者 Outbound 组件,业务对象和接口的变化进而导致调用这些组件的模块也需要重新进行修改。

     

    随着 Web Service 的广泛使用,Web Service 已经成为了异构系统服务相互调用的事实标准。各种语言各种环境下的服务都可以封装成 Web Service,暴露给别人使用,存储过程也不例外。

    在这方面,IBM 和微软一直是先行者。IBM 开发了 Web 服务对象运行时框架 WORF(Web service Object Runtime Frameworks),WORF 支持使用 DB2 作为 Web 服务提供程序,可以很容易地将数据库数据和存储过程暴露为 Web 服务。微软提供了 SQLXML 3.0(SQL Server 2000 Web Release 3)来实现该功能。SQLXML 3.0 使你能够从数据库中选择存储过程并从虚拟目录中选择 XML 模版,把它们暴露为 Web 服务的方法。

    在介绍 WORF 之前,先介绍几个概念:DAD, DXX, DADX。

    DAD(Document Access Definition)即文档访问定义,是一种定义 XML 与关系数据之间的映射的 XML 文档格式,通过DAD文件可以将XML文件中的数据映射到数据库中来,见图4。DAD使用DTD来定义其文件结构,更多关于DAD的内容可以阅读参考资料中DB2 XML Extender相关的链接。


    图 4. 通过 DAD 文件实现 XML 文件和 DB2 数据的映射
    ![这里写图片描述](https://img-blog.csdn.net/20180119013810660?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzc4Nzg1Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)  

    DXX(DB2 XML Extender)为 DB2 提供了一组新的数据类型、函数和存储过程,用于存储和访问 XML 文档,从关系数据生成 XML 文档或者将 XML 文档分解成关系数据。DB2 XML Extender 使用 DAD 来定义 XML 和关系数据之间的映射。

    DADX(Document Access Definition Extension)即文档访问定义扩展,是一种指定如何通过使用由 DAD 文档和 SQL 语句定义的操作来创建 Web 服务的 XML 文档格式,目前其规范版本为 DADX1.0。

    下面是一个简单的 DADX 文件,这个 DADX 文件定义了一个名字为 findCustomer 的操作,其操作是查询Customer 表中的所有记录。


    清单 6. DADX 文件示例
    <?xml version="1.0" encoding="UTF-8"?>
    <DADX xmlns="http://schemas.ibm.com/db2/dxx/dadx" >
      <documentation>
      A simple DADX example that accesses the Company database.
      </documentation>
      <operation name="findCustomer">
      <documentation>
      Lists all the customers.
      </documentation>
      <query>
      <SQL_query>SELECT * FROM Customer</SQL_query>
      </query>
      </operation>
    </DADX>

    WORF 提供了一个构建 XML Web 服务和访问 DB2 的环境,这个环境包含在 IBM WID 中,也可以单独下载。WORF 使用 DADX 文件描述可以通过 Internet 调用的 SQL 操作;支持通过 HTTP GET、POST 和 SOAP 绑定访问服务,当收到一个服务请求时,WORF 将装载请求中指定的 DADX 文件,连接到 DB2,运行 SQL 语句,并提交数据库事务。它将把结果格式化成 XML,必要时转换数据类型,然后把响应返回给请求者。

    DAD 和 DADX 都是 IBM 定义的 XML 文档格式,目前主要用于 IBM DB2 产品中,这一点从 DADX 的命名空间 “http://schemas.ibm.com/db2/dxx/dadx” 看出。只有安装上 DB2 XML Extender 之后,DB2 才能支持 XML 和 DB2 关系数据之间的映射。DAD, DADX, DB2 XML Extender 以及 WORF 四者之间的关系如下:


    图 5. DAD, DADX, DB2 XML Extender, WORF 四者之间的关系
    ![这里写图片描述](https://img-blog.csdn.net/20180119013906141?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzc4Nzg1Nzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)  

    从 SQL 语句或存储过程创建 Web Service 过程主要分为两步:第一步是使用 WID 从 SQL 语句或存储过程创建一个 DADX 文件;第二步是从 DADX 文件创建 Web 服务,包括生成 WSDL 服务描述。这里只是对其原理作进行介绍,更详细步骤可见参考文献。

    适用场景:5. 在会话 EJB 中调用存储过程

    在分布式应用,多个系统的业务整合等情况下,使用 DADX 将存储过程封装成 Web Service 暴露给其他系统使用是一种不错的方法。通过 IBM 提供的 WORF, DADX, WID 等工具和规范,不需要对 SOAP,WSDL,JDBC 等有太多的了解,也不需要编写复杂和费时的代码,即可快速地将 DB2 以数据提供者或数据消费者的方式,集成到企业应用程序和应用环境中,这在相当程度上简化了开发过程,能帮助企业面对需求迅速做出响应,实现自己 SOA 解决方案。由于 XML 对于 Web 服务的运行是必不可少的一部分,因此 XML 处理的开销会引起性能方面的代价,对于单机应用程序以及要求快速响应的系统,将存储过程暴露成 Web Service 将会抵消掉存储过程高效的优点,并不是一种较好的方案。

     

    EJB(Enterprise Java Bean)是 Sun 推出的 java 平台上的服务器端组件。EJB 技术能够加速和简化基于 java 技术的分布式、事务性的、安全的和可移植性的应用开发,主要用于企业级应用中。EJB 包括实体 Bean,会话 Bean 和消息驱动 Bean。

    其中,实体 Bean 主要用来实现数据的持久化。会话 EJB 在 J2EE 应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他 EJB 组件。实体 Bean 因其设计复杂,消耗大量的资源等缺点而声名狼藉。因而,在实际应用中,应该尽可能少地使用实体 Bean,其中,一种解决方案就是使用会话 Bean 和 JDBC 或者 IBM DB Beans 的组合方式,使用 JDBC 或者 IBM DB Beans 来调用存储过程。参考文献中的《将 DBMS 存储过程封装为会话 EJB 组件中的方法》详细介绍了如何将使用会话 Bean 和 IBM DB Beans 结合的方式来封装 DBMS 存储过程。

    在使用会话 Bean 和 JDBC 或者 IBM DB Beans 的组合方式时,会话 Bean 将对数据库的所有访问委托给 JDBC 或者 IBM DB Beans 来实现。这种方式相对于实体 Bean 来说,能使开发人员对数据管理有细粒度的控制权,利用成熟和灵活的 JDBC 或者 IBM DB Beans 数据库管理访问技术,容易进行功能优化,并将这些功能全部封装成一个相对简单的组件体系结构中。

    其缺点在于,与 JDBC 或者 IBM DB Beans 结合的会话 Bean 有三个关键问题:Bean 的实现通常比较复杂;会话 Bean 需要开发人员实现自己的事务支持;持久性也需要开发人员自己控制,无法由容器提供和保障。

    适用场景:

    相对于实体 Bean,使用会话 Bean 和 JDBC 或者 IBM DB Beans 的组合方式来封装 DBMS 存储过程具有灵活性高,资源消耗小等优点。这种方式对于不需要事务支持的业务流程或者只是对数据库进行查询操作的存储过程,是一种比较好的选择。

     

    上述操作完成之后便可以在商业模块的装配图(Assembly Diagram)中看到一个 EIS 的 Outbound 组件。图 3 是一个创建成功的 EIS 的 Outbound 组件的效果图。存储过程的输入和输出参数自动映射为业务对象,存储过程的方法自动映射为组件的接口。用户使用时,只需要将输入参数封装成相应业务对象,调用该组件提供的接口即可。

     

     

    清单1是一个使用 executeUpdate 来执行的存储过程的例子。存储过程名为 exampleJDBC,含有五个参数,前两个分别是 String 和 Int 类型的输入参数,后三个分别是整型,整型和字符型的输出参数。分别给输入参数赋值 ”Beijing” 和 2008,执行 executeUpdate 命令后,从后三个输出参数中可以得到输出值,没有结果集返回。需要说明的是,这里的参数下标是以 1 开始的,与 java 数组下标以 0 开始不同。

    展开全文
  • 使用场景:1.通常,复杂的业务逻辑需要多条 SQL 语句。...优点:1、存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL语句每执行一次就编译一次,因此使用存储过程可以大大提高数...

    使用场景:

    1.通常,复杂的业务逻辑需要多条  SQL  语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。

    优点:

    1、存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般  SQL语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。

    2、存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量。

    3、安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用    EXECUTE  权限调用存储过程,无需拥有访问底层数据库对象的显式权限。正是由于存储过程的上述优点,目前常用的数据库都支持存储过程,例如  IBM DB2Microsoft SQL ServerOracleAccess 等,开源数据库系统 MySQL 也在  5.0  的时候实现了对存储过程的支持。

    展开全文
  • 1、存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。 2、通常,复杂的业务逻辑需要多条 SQL 语句。这些...

    存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后以后再调用任意次都不需要重新编译了。说白了就是一堆SQL语句的合并,中间加了点逻辑控制,俗称为数据库中的函数。在一些金融等大型企业中,基本都是由内部人员编写好存储过程,然后由外部程序员调用存储过程,因为内部数据逻辑处理方式涉及商业机密等等。

    也就是说我们现在有两种方式来处理数据库中的数据,一是通过JDBC从数据库中取出数据然后通过业务层编写处理数据的逻辑代码;二是在数据库中定义数据的存储过程,在这个存储过程中完成对数据的逻辑操作,就好比数据库中的函数,而我们在Java程序中只要调用数据库中的这个存储过程即可。

    数据库存储过程具有如下优点:

    1、存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。

    2、通常,复杂的业务逻辑需要多条 SQL 语句。这些语句要分别地从客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网络传输。如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低了网络负载。

    3、存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量。

    4、安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用 EXECUTE 权限调用存储过程,无需拥有访问底层数据库对象的显式权限。

    正是由于存储过程的上述优点,目前常用的数据库都支持存储过程,例如 IBM DB2,Microsoft SQL Server,Oracle,Access 等

    展开全文
  • 分析存储过程使用场景  当 一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对 多个状态的判断更改等)要考虑...
  • 存储过程的优缺点及使用场景

    万次阅读 2014-06-05 08:26:48
    里写了存储过程性能的优点,主要是减少网络交互。 以下存储过程存在问题的详细描述: a、不可移植性,每种数据库的内部编程语法都不太相同,当你的系统需要兼容多种数据库时最好不要用存储过程。 当你的系统需要...
  • MySQL存储过程与触发器(应用场景)

    千次阅读 2017-11-04 11:43:04
    一、存储过程 存储过程的基本格式如下: -- 声明结束符 -- 创建存储过程 DELIMITER $ -- 声明存储过程的结束符 CREATE PROCEDURE pro_test() --存储过程名称(参数列表) BEGIN -- 可以写多个sql语句; -- sql语句+...
  • Greenplum 存储使用场景

    千次阅读 2020-01-13 10:53:12
    1、行存,以行为形式组织存储, 查询的时候需要全表扫描要扫描更多的数据块;压缩比较低;读取任意列的成本不一样,越靠后的列,成本越高。 2、列存,以列为形式组织存储,每列对应一个或一批文件。读取任一列的...
  • 存储过程定义及应用场景   一、什么是存储过程  顾名思义,存储过程(Stored Procedure)就是一组为了完成特定功能的SQL语句的集合,经过编译之后存储在数据库 中,用户通过指定存储过程的名字并给定其参数...
  • ORACLE存储过程

    万次阅读 多人点赞 2018-11-02 18:14:48
    oracle存储过程 目录 一.什么是存储过程 二.为什么要写存储过程 三.存储过程基础 1.存储过程结构 2.存储过程语法 3.pl/sql处理存储过程 四.存储过程进阶 1.BUIK COLLECT 2.FORALL 3.pl/sql调试存储过程 ...
  • InnoDB存储引擎InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎。InnoDB主要特性有:1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的...
  • SpringBoot调用存储过程

    千次阅读 2020-09-01 20:39:23
    程序中需要直接调用存储过程场景 第一种:返回带参数的存储过程 第二种:返回结果集 第三种:第一种+第二种(不讨论) 数据库环境准备 数据库:MySQL 创建表及数据 CREATE TABLE `order` ( `uuid` varchar(32...
  • 详谈为什么互联网公司禁止使用存储过程

    万次阅读 热门讨论 2021-09-14 14:06:41
    【强制】禁止使用存储过程存储过程难以调试和扩展,更没有移值性。 其实这一句话足以说明问题,有小伙伴肯定会疑惑,在银行或者证券等公司工作为什么会大量使用存储过程呢?这就是我们今天讲解的内容 首先两个...
  • 存储过程 1:概述: 存储过程是被命名的 PL/SQL 块,存储于数据库中,是数据库对象的一种。 应用程序可以调用存储过程,执行相应的逻辑。 2:存储过程与存储函数区别 存储过程与存储函数都可以封装一定的业务逻辑...
  • oracle存储过程----游标(cursor)的学习

    万次阅读 多人点赞 2018-08-13 15:43:10
    oracle存储过程—-存储过程游标(cursor)、遍历的使用方法   今天又学了一个新的概念Cursor ,即游标。   接上一篇,oracle存储过程—-存储过程执行简单的增删改查sql ,上一篇中,写到存储过程的查询sql ,...
  • 该不该用存储过程

    千次阅读 2018-01-23 15:02:55
    本篇文章讨论并不是:不要使用存储过程,因为有些事情还是要存储过程来完成,不可能不用。而是关于:"业务逻辑是不是要封装在存储过程中实现,这样子php、java等就是调用存储过程"。   业务逻辑,通俗说就是:比如...
  • 在实际业务中,一些数据的抽取是通过存储过程的,当我们查看的表的数据不是我们需要的数据,或者表数据有问题时,说明存储过程抽取数据是有问题的,需要更改存储,而项目中,如果有成百以上的存储,一个一个找起来是相当麻烦...
  • SQL存储过程的优缺点

    千次阅读 2018-07-28 17:17:22
    存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它,也可以从另一个过程或...
  • ORACLE存储过程中sleep的使用

    千次阅读 2020-06-05 11:04:50
    随意创建一个存储过程,例如: create or replace procedure test_sleep is ii positive:=1; begin loop dbms_lock.sleep(1); dbms_output.put_line(ii||' '||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')); ii:=ii+1;...
  • 浅谈oracle中的视图和存储过程

    千次阅读 2016-11-21 22:35:20
    视图,存储过程,oracle
  • oracle 动态SQL在存储过程中的使用

    万次阅读 2019-07-23 09:07:45
    Oracle编译PL/SQL程序块分为两个种(其它SQL代码块包括存储过程也是如此): 其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late ...
  • 存储过程常见语法

    万次阅读 2018-12-23 16:39:37
    存储过程常见语法 一、存储过程的概念: 1、存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行 2、存储过程中可以包含逻辑控制语句和...
  • 一.首先变量的声明有3中方式 ...注:存储过程中声明变量必须在begin之前 并且声明字符串时必须指定大小,不然会报错 2.使用%TYPE声明 ①格式:变量名 表名.字段名%TYPE ②含义:该变量的数据类型与指定...
  • 问题场景:做一个物品系统, 需要批量存入。 思考:储存过程的的参数不支持数组,是否可以用json字符串代替 测试用的JSON字符串: let obj = { itemlist:[ { regid:0, iteminfo:{ item_uid:"10441&...
  • 在开发一个项目的过程当中,有个场景是这样的,通过在存储过程里面循环的执行一个更新操作,执行的过程会持续比较长时间,这个时候操作员会根据现场的情况,把更新操作停止,改为手动更新模式。 根据这个现实的...
  • 一文读懂 HBase 使用场景

    千次阅读 2019-05-17 13:39:29
    HBase(Hadoop database)是一个分布式、可扩展、面向列的NoSQL数据库,本质上是一个Key-Value数据库,底层存储基于HDFS,原生支持MapReduce计算框架,具有高吞吐、低延时的读写特点。那么问题来了,我们满足哪些...
  • 什么是存储过程?用什么来调用?

    万次阅读 2018-08-20 23:34:24
    答:存储过程是一个预编译的SQL语句,比如一些场景的sql比较复杂,并且需要经常使用或者多次使用的。存储过程的优点是说只需创建一次编译一次,以后在该程序中就可以多次直接调用。如果一个sql是经常需要操作的,...
  • Ceph架构原理及使用场景介绍

    千次阅读 2018-11-06 13:13:04
    Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 498,681
精华内容 199,472
关键字:

存储过程使用场景