求助JAVA调用MYSQL存储过程的问题

求助JAVA调用MYSQL存储过程的问题,第1张

1.数据库存储过程:简单滴说,存储过程就是存储在数据库中的一个程序。

2..数据库存储过程作用:

第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快

第二:存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。  

第三:存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。  

第四:存储过程主要是在服务器上运行,减少对客户机的压力。

第五:存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。

第六:存储过程可以在单个存储过程中执行一系列   SQL   语句。

第七:存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

此外,如果多条SQL语句执行过程中,过程环节返回了数据作为后面环节的输入数据,如果直接通过

SQL语句执行,势必导致大量的数据通过网络返回到客户机,并在客户机运算;如果封装在存储过程中,

则将运算放在服务器进行,不但减少了客户机的压力,同时也减少了网络流量,提高了执行的效率。

3.mysql存储过程:

MySQL5存储过程,用得人好像不多。按照数据库设计原理来讲,存储过程是在db server上预编译的,所以查询速度会比较起纯SQL语句快很多。可能是现在流行OO,导至存储过程使用的余地大打折扣。但如果从效果上来讲,用存储过程来实现业务规则所带得DB SERVER压力,比用JAVA类实现业务规则所带来的WEB SERVER压力要小。当然存储过程也不应滥用,象普通的insert、update之类的语句就不需要使用存储过程了。

MySQL创建procudure的语法与sql server/Oracle差别较大。

例1:传入参数的procedure

create procedure usp_test(param varchar(20)

  select * from talbeName where column=param  

例2:更新表的procedure

create procedure usp_test2 (t varchar(20))

  begin

    set xname = 'test'

    update table set column = xname where column1=t

 end

 

    MySQL创建存储过程时不带as,而且()不能省略,即便是没有传入参数。这一点象sql server或是oracle那样直观,而且声明变量时直接用declare,不用加的@或@@(in out变量除外)。还有一点是很怪的语法,如果是以“select”为开头的存储过程,是不能加"begin end"的。"begin end"表示多条SQL语句的复合体。

   当然,事实上几乎没有哪款数据库是完全符合SQL3标准的,多少都含有自己的一些成份里面,这也造成使用存储过程会使程序的可移性降低。

   调用procedure

   MySQL使用call关键字。例:call usp_test('test');而不是execute,同样()是不能省略的。

  创建完procedure后,再看看java是如何调用procedure的。

    Connection conn = null

    CallableStatement cstmt = null

    ResultSet rs = null

    try{

        conn = DbConn.getDbConn()//get pool conn

        CallableStatement cstmt = conn.prepareCall("{call usp_test(?)}")

            call.setString(1, "test")

            rs = call.executeQuery()

            while(rs.next()){

                String te = rs.getString(1)

                System.out.println("te:"+te)

            }

        }catch(Exception e){

            System.out.println("e: "+e)

        }finally{

            try{

                rs.close()

                cstmt.close()

                conn.close()

            }catch(Exception ex){

                System.out.println("ex:"+ex)

            }

        }

这里使用的是"{call usp_test()}"来调用存储过程。同时也可以编程传入参数,进行查询。

一个存储过程包括名字,参数列表,以及可以包括很多SQL语句的SQL语句集。

创建存储过程:

语法:

CREATE PROCEDURE p()

BEGIN

/*此存储过程的正文*/

END

CREATE PROCEDURE productpricing()

BEGIN

SELECT Avg(pro_price) AS priceaverage

FROM products

END

# begin…end之间是存储过程的主体定义

# mysql的分界符是分号(;)

调用存储过程的方法是:

# CALL加上过程名以及一个括号

# 例如调用上面定义的存储过程

CALL productpricing()

# 哪怕是不用传递参数,存储过程名字后面的括号“()”也是必须的

删除存储过程的方法是:

DROP PROCUDURE productpricing

创建带参数的存储过程:

CREATE PROCUDURE productpricing(

OUT p1 DECIMAL(8,2),

OUT ph DECIMAL(8,2),

OUT pa DECIMAL(8,2)

)

BEGIN

SELECT Min(prod_price) INTO pl FROM products

SELECT Max(prod_price) INTO ph FROM products

SELECT Avg(prod_price) INTO pa FROM products

END

# DECIMAL用于指定参数的数据类型

# OUT用于表明此值是用于从存储过程里输出的

# MySQL支持 OUT, IN, INOUT

调用带参数的存储过程:

CALL productpricing(@pricelow,

@pricehigh,

@priceaverage)

# 所有的参数必须以@开头

# 要想获取@priceaverage的值,用以下语句

SELECT @priceaverage

# 获取三个的值,用以下语句

SELECT @pricehigh, @pricelow, @priceaverage

另一个带IN和OUT参数的存储过程:

CREATE PROCEDURE ordertotal(

IN onumber INT,

OUT ototal DECIMAL(8,2)

)

BEGIN

SELECT Sum(item_price*quantity)

FROM orderitems

WHERE order_num = onumber

INTO ototal

END

CALL ordertotal(20005, @total)

SELECT @total

添加一个完整的例子:(这是一个自定义分页的存储过程)

DELIMITER $$

DROP PROCEDURE IF EXISTS `dbcall`.`get_page`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_page`(

/**//*Table name*/

tableName varchar(100),

/**//*Fileds to display*/

fieldsNames varchar(100),

/**//*Page index*/

pageIndex int,

/**//*Page Size*/

pageSize int,

/**//*Field to sort*/

sortName varchar(500),

/**//*Condition*/

strWhere varchar(500)

)

BEGIN

DECLARE fieldlist varchar(200)

if fieldsNames=''||fieldsNames=null THEN

set fieldlist='*'

else

set fieldlist=fieldsNames

end if

if strWhere=''||strWhere=null then

if sortName=''||sortName=null then

set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize)

else

set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' ORDER BY ',sortName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize)

end if

else

if sortName=''||sortName=null then

set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' WHERE ',strWhere,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize)

else

set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' WHERE ',strWhere,' ORDER BY ',sortName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize)

end if

end if

PREPARE stmt1 FROM @strSQL

EXECUTE stmt1

DEALLOCATE PREPARE stmt1

END$$

DELIMITER

1.查看数据库,选中使用数据库,并查看数据库表,具体 *** 作命令如下:

show databases

use student

show tables

2.选择student数据库中的一张表stu_score,查看数据库表数据,并利用explain分析数据库表,如下图所示:

select * from stu_score

explain select * from stu_score

3.查看数据库使用索引的情况,使用命令:

show status like 'Handler_read%'

4.用于分析和存储表的关键字,分析的结果可以得到精准的信息,利用命令analyze,

analyze table stu_score

5.检查数据库表stu_score,检查表是否有错误,利用命令:

check table stu_score

6.优化数据库表,利用命令:

optimize table stu_score

扩展资料:

可以使用命令行工具管理 MySQL 数据库(命令 mysql 和 mysqladmin),也可以从 MySQL 的网站下载图形管理工具 MySQL Administrator, MySQL Query Browser 和 MySQL Workbench。

phpMyAdmin是由 php 写成的 MySQ L资料库系统管理程程序,让管理者可用 Web 界面管理 MySQL 资料库。

phpMyBackupPro也是由 PHP 写成的,可以透过 Web 界面创建和管理数据库。它可以创建伪 cronjobs,可以用来自动在某个时间或周期备份 MySQL 数据库。

另外,还有其他的 GUI 管理工具,例如 mysql-front 以及 ems mysql manager, navicat等等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8745483.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存