您当前的位置:首页 > 互联网教程

java如何获得mysql存储过程的返回值

发布时间:2025-05-14 07:30:15    发布人:远客网络

java如何获得mysql存储过程的返回值

一、java如何获得mysql存储过程的返回值

本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference》这本书中摘引来的。JavaSoft目前正在准备这本书。这本书是一本教程,同时也是 JDBC的重要参考手册,它将作为 Java系列的组成部份在 1997年春季由 Addison-Wesley出版公司出版。

CallableStatement对象为所有的 DBMS提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参数,另一种形式不带结果参数(有关换码语法的信息,参见第 4节“语句”)。结果参数是一种输出(OUT)参数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入和输出(INOUT参数)的参数。问号将用作参数的占位符。

在 JDBC中调用已储存过程的语法如下所示。注意,方括号表示其间的内容是可选项;方括号本身并不是语法的组成部份。

不带参数的已储存过程的语法类似:

通常,创建 CallableStatement对象的人应当知道所用的 DBMS是支持已储存过程的,并且知道这些过程都是些什么。然而,如果需要检查,多种 DatabaseMetaData方法都可以提供这样的信息。例如,如果 DBMS支持已储存过程的调用,则 supportsStoredProcedures方法将返回 true,而 getProcedures方法将返回对已储存过程的描述。

CallableStatement继承 Statement的方法(它们用于处理一般的 SQL语句),还继承了 PreparedStatement的方法(它们用于处理 IN参数)。CallableStatement中定义的所有方法都用于处理 OUT参数或 INOUT参数的输出部分:注册 OUT参数的 JDBC类型(一般 SQL类型)、从这些参数中检索结果,或者检查所返回的值是否为 JDBC NULL。

7.1.1创建 CallableStatement对象

CallableStatement对象是用 Connection方法 prepareCall创建的。下例创建 CallableStatement的实例,其中含有对已储存过程 getTestData调用。该过程有两个变量,但不含结果参数:

CallableStatement cstmt= con.prepareCall(

其中?占位符为 IN、 OUT还是 INOUT参数,取决于已储存过程 getTestData。

将 IN参数传给 CallableStatement对象是通过 setXXX方法完成的。该方法继承自 PreparedStatement。所传入参数的类型决定了所用的 setXXX方法(例如,用 setFloat来传入 float值等)。

如果已储存过程返回 OUT参数,则在执行 CallableStatement对象以前必须先注册每个 OUT参数的 JDBC类型(这是必需的,因为某些 DBMS要求 JDBC类型)。注册 JDBC类型是用 registerOutParameter方法来完成的。语句执行完后,CallableStatement的 getXXX方法将取回参数值。正确的 getXXX方法是为各参数所注册的 JDBC类型所对应的 Java类型(从 JDBC类型到 Java类型的标准映射见 8.6.1节中的表)。换言之, registerOutParameter使用的是 JDBC类型(因此它与数据库返回的 JDBC类型匹配),而 getXXX将之转换为 Java类型。

作为示例,下述代码先注册 OUT参数,执行由 cstmt所调用的已储存过程,然后检索在 OUT参数中返回的值。方法 getByte从第一个 OUT参数中取出一个 Java字节,而 getBigDecimal从第二个 OUT参数中取出一个 BigDecimal对象(小数点后面带三位数):

CallableStatement cstmt= con.prepareCall(

cstmt.registerOutParameter(1, java.sql.Types.TINYINT);

cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);

java.math.BigDecimal n= cstmt.getBigDecimal(2, 3);

CallableStatement与 ResultSet不同,它不提供用增量方式检索大 OUT值的特殊机制。

既支持输入又接受输出的参数(INOUT参数)除了调用 registerOutParameter方法外,还要求调用适当的 setXXX方法(该方法是从 PreparedStatement继承来的)。setXXX方法将参数值设置为输入参数,而 registerOutParameter方法将它的 JDBC类型注册为输出参数。setXXX方法提供一个 Java值,而驱动程序先把这个值转换为 JDBC值,然后将它送到数据库中。

这种 IN值的 JDBC类型和提供给 registerOutParameter方法的 JDBC类型应该相同。然后,要检索输出值,就要用对应的 getXXX方法。例如,Java类型为 byte的参数应该使用方法 setByte来赋输入值。应该给 registerOutParameter提供类型为 TINYINT的 JDBC类型,同时应使用 getByte来检索输出值(第 8节“JDBC和 Java类型之间的映射”将给出详细信息和类型映射表)。

下例假设有一个已储存过程 reviseTotal,其唯一参数是 INOUT参数。方法 setByte把此参数设为 25,驱动程序将把它作为 JDBC TINYINT类型送到数据库中。接着,registerOutParameter将该参数注册为 JDBC TINYINT。执行完该已储存过程后,将返回一个新的 JDBC TINYINT值。方法 getByte将把这个新值作为 Java byte类型检索。

CallableStatement cstmt= con.prepareCall(

cstmt.registerOutParameter(1, java.sql.Types.TINYINT);

7.1.4先检索结果,再检索 OUT参数

由于某些 DBMS的限制,为了实现最大的可移植性,建议先检索由执行 CallableStatement对象所产生的结果,然后再用 CallableStatement.getXXX方法来检索 OUT参数。

如果 CallableStatement对象返回多个 ResultSet对象(通过调用 execute方法),在检索 OUT参数前应先检索所有的结果。这种情况下,为确保对所有的结果都进行了访问,必须对 Statement方法 getResultSet、getUpdateCount和 getMoreResults进行调用,直到不再有结果为止。

检索完所有的结果后,就可用 CallableStatement.getXXX方法来检索 OUT参数中的值。

7.1.5检索作为 OUT参数的 NULL值

返回到 OUT参数中的值可能会是 JDBC NULL。当出现这种情形时,将对 JDBC NULL值进行转换以使 getXXX方法所返回的值为 null、0或 false,这取决于 getXXX方法类型。对于 ResultSet对象,要知道 0或 false是否源于 JDBC NULL的唯一方法,是用方法 wasNull进行检测。如果 getXXX方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则返回 flase。

二、mysql怎么储存长字符

blob是二进制大对象,可以容纳可变量数量的数据,其中blob分为4中类型:TINYBLOB,BLOB,mediumblob和LongBlob,他们容纳的长度是不同的.

Text同样也分为四种类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT

blob被视为二进制字符串,Text被视为非二进制字符串;

blob列没有字符集,并且排序和比较基于列值字节的数值值。

TEXT列有一个字符集,并且根据字符集的校对规则对值进行排序和比较。

在MySQL TEXT或BLOB列的存储或检索过程中,不存在大小写转换,当未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值值,值被截取以保证适合。如果截掉的字符不是空格,将会产生一条警告。

使用严格SQL模式,会产生错误,并且值将被拒绝而不是截取并给出警告.在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列。同样,可以将TEXT列视为VARCHAR列。

BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR.

当保存或检索BLOB和TEXT列的值时不删除尾部空格。(这与VARBINARY和VARCHAR列相同).

对于BLOB和TEXT列的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的.

LONG和LONG VARCHAR对应MEDIUMTEXT数据类型。这是为了保证兼容性。如果TEXT列类型使用BINARY属性,将为列分配列字符集的二元校对规则.

MySQL连接程序/ODBC将BLOB值定义为LONGVARBINARY,将MySQL TEXT值定义为LONGVARCHAR。由于BLOB和TEXT值可能会非常长,使用它们时可能遇到一些约束.

BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改 max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序。例如,可以使用 MySQL和MySQLdump来更改客户端的max_allowed_packet值.

三、sql如何存储sql如何存储照片

1.首先,打开企业管理器并选择工具-查询分析器:

2.然后,输入SQL语句。如下所示:

创建过程byroyalty1@percentageint

其中titleauthor.royaltyper=@percentage

3.然后,单击“确定”后,该命令将自动添加到查询中:

5.最后,您可以在小弹出窗口中查看存储过程:

1.先存储图片链接了,这里先要设置图片链接字段,如下图所示。

2.接着就是直接将图片的链接添加到SQL数据表的字段里就行了,如下图所示。

3.另外还可以用二进制的方式存储图片字段,如下图所示,在SQLServer数据库中先设计成image字段,如下图所示。

4.接着在后台通过代码将图片转化为二进制数据,如下图所示。

5.接下来得到二进制数据以后,一般就是通过sql语句插入到数据表中,如下图所示。

6.然后数据表就存储了图片字段了,取得时候在将二进制转化为图片就行了。

7.最后不同的数据库二进制字段类型是不一样得,如下图所示mysql是blob。

sqlserver2008怎么建立储存过程?

第一步:点击数据库下的“可编程性”,选择“存储过程”,点击鼠标右键,选择“新建存储过程”

第二步:在createPROCEDURE后输入存储过程的名字,紧跟着的就是定义存储过程的参数,接下来就可以去编写自己所需要组装的存储过程语句了第三步:编译存储过程,在工具栏上按下执行按钮,如果没有错误,就编写成功了。

第四步:调用:在sqlserver的语句查询框中,输入exec存储过程名参数,执行就可以了。基本语法格式如下:中括号带的是可选项createproc|procedurepro_name,{@参数数据类型},....]asbeginSQL_statements--业务处理end

1、打开SQLservermanagementstudio,连接到数据库,展开想要创建的数据库,找到【可编程性】->【存储过程】的菜单。

2、在第一步找到的【存储过程】菜单项上面,点击鼠标右键,依次选择【新建】->【存储过程】,就可以开始创建存储过程了。

3、当点击了第二步的【存储过程】之后,在右侧就会出现一个新的窗口,而且默认有好多的代码和注释,这些就是sqlserver默认创建的存储过程的结构和注释。

4、如图为sqlserver默认创建的存储过程的结构和注释的中文解释。

5、此处仅仅创建一个简单的演示存储过程,名字叫做usp_SimpleStoreProcedure,拥有一个整型的传入参数@x,存储过程直接返回传入参数乘以10倍的结果。写完存储过程之后,按F5就可以将其存储到数据库中。

6、在第二步中找到的【存储过程】菜单下面找到第5步创建的存储过程名字usp_SimpleStoreProcedure,在这个名字上面点击鼠标右键,选择【执行存储过程】。

7、紧接着,会弹出一个【执行过程】的界面,里面有存储过程的参数,在【值】这一列输入想要传入的参数值,比如10,然后点击【确定】按钮,就可以看到执行结果100了。

sql调用存储过程:存储过程里用exec执行另一存储过程名及它需要的参数就可以了如execabc'1','2'(abc是存储过程的名字,'1','2'是它的参数。

结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。

sqlserver里存储过程怎么调用存储过程?

sqlserver里调用存储过程的具体操作步骤如下:1、打开SQLServerManagment管理工具,新建一个表。