本文目录一览:
- 1、MySQL 5.0的存储过程,保存在什么地方?
- 2、mysql中怎么存储数组
- 3、asp.net+mysql5.0上传到服务器空间,出现startIndex 不能大于字符串长度。
- 4、在java web中怎样将数据存储在数据库中
- 5、mysql中的存储过程、触发器、视图的用法
MySQL 5.0的存储过程,保存在什么地方?
mysql 的存储过程在 mysql.proc表里。 只上传frm,MYI,MYD不能上传procedure。你可以mysqldump --table mysql proc proc.sql -uroot -p 之后再到你的虚拟机中 source 目录\proc.sql
mysql中怎么存储数组
mysql中不能存储数组,但是可以通过传入的字符串截取成多个字符然后传入到临时表中,然后使用游标或者直接关联表过滤数据来储存。
具体步骤如下所示:
1、创建数据库,就如下图所示一样。
2、根据学生编号批量删除学生信息,如下图所示。
3、声明初始化变量,看到以下画面。
4、获取传入参数数组长度,创建临时表,所输入的如下图所示。
5、截取数组字符串并依次存入到临时表中供后面业务使用。
asp.net+mysql5.0上传到服务器空间,出现startIndex 不能大于字符串长度。
ArgumentOutOfRangeException: startIndex 不能大于字符串长度。
参数名: startIndex]
System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) +2819819
MySql.Data.MySqlClient.ISSchemaProvider.ParseProcedureBody(DataTable parametersTable, String body, DataRow row, String nameToRestrict) +406
MySql.Data.MySqlClient.ISSchemaProvider.GetParametersFromShowCreate(DataTable parametersTable, String[] restrictions, DataTable routines) +418
MySql.Data.MySqlClient.ISSchemaProvider.GetProcedureParameters(String[] restrictions, DataTable routines) +502
MySql.Data.MySqlClient.ProcedureCache.GetProcData(MySqlConnection connection, String spName) +227
MySql.Data.MySqlClient.ProcedureCache.AddNew(MySqlConnection connection, String spName) +35
MySql.Data.MySqlClient.ProcedureCache.GetProcedure(MySqlConnection conn, String spName) +104
MySql.Data.MySqlClient.StoredProcedure.GetParameters(String procName) +98
MySql.Data.MySqlClient.StoredProcedure.Resolve() +148
MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) +272
MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +4
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +7
System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +141
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +137
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) +86
Handler.NewSoldWare(String state, Int32 top) in d:\wwwroot\yuanfang513855\wwwroot\App_Code\WebShoppingDBO.cs:1250
ASP.index_aspx.Page_Load(Object sender, EventArgs e) in d:\wwwroot\yuanfang513855\wwwroot\Index.aspx:8
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
请哪位高手指点,感激!
在java web中怎样将数据存储在数据库中
Java可以使用JDBC对数据库进行读写。JDBC访问一般分为如下流程:
1、加载JDBC驱动程序:
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),
这通过java.lang.Class类的静态方法forName(String className)实现。
例如:
try{
//加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace() ;
}
成功加载后,会将Driver类的实例注册到DriverManager类中。
2、提供JDBC连接的URL
?连接URL定义了连接数据库时的协议、子协议、数据源标识。
?书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
例如:(MySql的连接URL)
jdbc:mysql://localhost:3306/test?useUnicode=truecharacterEncoding=gbk ;
useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为
gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。
3、创建数据库的连接
?要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
?使用DriverManager的getConnectin(String url,String username,String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
例如:
//连接MySql数据库,用户名和密码都是root
String url = "jdbc:mysql://localhost:3306/test" ;
String username = "root" ;
String password = "root" ;
try{
Connection con =
DriverManager.getConnection(url , username , password ) ;
}catch(SQLException se){
System.out.println("数据库连接失败!");
se.printStackTrace() ;
}
4、创建一个Statement
?要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。
具体的实现方式:
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
CallableStatement cstmt = con.prepareCall("{CALL demoSp(? , ?)}") ;
5、执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute
1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
具体实现的代码:
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;
int rows = stmt.executeUpdate("INSERT INTO ...") ;
boolean flag = stmt.execute(String sql) ;
6、处理结果
两种情况:
1、执行更新返回的是本次操作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些行中数据的访问。
使用结果集(ResultSet)对象的访问方法获取数据:
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1); // 此方法比较高效(列是从左到右编号的,并且从列1开始)
}
7、关闭JDBC对象
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
1、关闭记录集
2、关闭声明
3、关闭连接对象
if(rs != null){ // 关闭记录集
try{
rs.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(stmt != null){ // 关闭声明
try{
stmt.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
if(conn != null){ // 关闭连接对象
try{
conn.close() ;
}catch(SQLException e){
e.printStackTrace() ;
}
}
mysql中的存储过程、触发器、视图的用法
建立存储过程
Create procedure、Create function
下面是它们的格式:
Create proceduresp_Name ([proc_parameter ])
routine_body
这里的参数类型可以是 IN OUT INOUTT ,意思和单词的意思是一样的,IN 表示是传进来的参数,
OUT 是表示传出去的参数,INOUT 是表示传进来但最终传回的参数。
Create functionsp_Name ([func_parameter ])
Returns type
Routine_body
Returns type 指定了返回的类型,这里给定的类型与返回值的类型要是一样的,否则会报错。
下面给出两个简单的例子来说明:
1、 显示 Mysql 当前版本
执行结果
mysql use welefen;
Database changed
mysql delimiter // #定义//作为结束标记符号
mysql create procedure getversion(out param1 varchar(50)) #param1为传出参数
- begin
- select version() into param1; #将版本的信息赋值给 param1
- end
- //
Query OK, 0 rows affected (0.00 sec)
mysql call getversion(@a); #调用getversion()这个存储过程
- //
Query OK, 0 rows affected (0.00 sec)
mysql select @a;
- //
+--------------------------+
| @a |
+--------------------------+
| 5.1.14-beta-community-nt |
+--------------------------+
1 row in set (0.00 sec)
2、 显示”hello world”
执行结果
mysql delimiter //
mysql create function display(w varchar(20)) returns varchar(50)
- begin
- return concat('hello ‘,w);
- end
- //
Query OK, 0 rows affected (0.05 sec)
mysql select display("world");
- //
+------------------+
| display("world") |
+------------------+
| hello world |
+------------------+
1 row in set (0.02 sec)
其他操作存储过程的语句
前面我们已经知道了怎么创建存储过程,下面看看其他常用的用于操作存储过程的语句。
Alter {procedure | function} sp_Name []
Alter 语法是用来改变一个过程或函数的特征,当你想改变存储过程或者函数的结构时可以使
用它。当然你也可以先 drop 它再 create。
Drop {procedure | function} [if exists] sp_Name
Drop 语法即用来删除一个存储程序或者函数,当你创建的一个存储过程或者函数的名字已经存
在时,你想把以前的给覆盖掉,那么此时你就可以使用 drop ,然后在创建。
Show create {procedure | function } sp_Name
Show 语法用来显示创建的存储过程或者函数的信息。这里的 show 用法跟数据表中的 show 用
法是很相似的。
Show {procedure | function} status [like 'partten']
它返回子程序的特征,如数据库,名字,类型,创建者及创建和修改日期。如果没有指定样式,
根据你使用的语句,所有存储程序和存储函数的信息都被列出。
看了以上的几个语法,你是不是感觉跟对表的操作很相象,那你就想对了,他们确实是很相似
的。带着一份激动心情我们继续往下看,你会发现很简单。
Begin ... End 语句
通过 begin end 可以来包含多个语句,每个语句以“;”结尾。
Declare
用Declare 来声明局部变量
Declarevar_Name type defaulevaule
Delare 条件
Declarecondition_Name CONDITION FOR condition_value
调用存储过程
Call
格式:
Callsp_Name [parameter ]
这里的 sp_Name 必须是由 create procedure 创建的名称。它可以通过声明的参数来传回值,
它也返回受影响的行数,在 MySQL 中可以通过 mysql_affected_rows() 来获得。
流程控制语句
IF 语句
IFsearch_condition THENstatement_list
[ELSEIFsearch_condition THENstatement_list]
[ELSEstatement_list]
END IF
CASE 语句
CASE case_value
WHEN when_value THENstatement_list
WHEN when_value THENstatement_list]
ELSEstatement_list]
END CASE
LOOP 语句
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 实现了一个简单的循环,通过 LEAVE 来退出
LEAVE 语句
LEAVE lable
退出语句,一般可以用在循环中。
ITERATE 语句
ITERATE lable
ITERATE 一般出现在 LOOP、REPEATE、WHILE 里,意思是再次循环。
REPEATE 语句
[begin_label:] REPEAT
statement_list
UNTILsearch_condition
END REPEAT [end_label]
REPEAT 语句内的语句或语句群被重复,直至 search_condition 为真。
WHILE 语句
[begin_label:] WHILEsearch_condition DO
statement_list
END WHILE [end_label]
WHILE 语句内的语句或语句群被重复,直至 search_condition 为真。
运用实例
下面通过几个例子来讲述他们的应用:
对网站用户的操作
为了简单,用户表只有用户名和密码的信息.在服务端,我们建立如下的表:
代码片段
Drop table if exists user;
Create table user(
Id int unsigned not null auto_increment,
Name varchar(20) not null,
Pwd char(32) not null,
Primary key(Id)
);
添加用户的存储过程:
代码片段
Delimiter //
Create procedure insertuser(in username varchar(20),in userpwd varchar(32))
Begin
Insert into welefen.user(Name,Pwd) values (username,md5(userpwd));
End
//
验证用户的存储过程:
代码片段
Delimiter //
Create procedure validateuser(in username varchar(20),out param1)
Begin
Select Pwd into param1 from welefen.user where Name=username;
End
//
修改密码的存储过程:
代码片段
Delimiter //
Create procedure modifyPwd(in username varchar(20),in userpwd varchar(32))
Begin
Update welefen.user set Pwd=md5(userpwd) where Name=username;
End
//
删除用户的存储过程:
代码片段
Delimiter //
Create procedure deleteuser(in username varchar(20))
Begin
delete from welefen.user where Name=username;
End
//
在客户端,我们给出如下的程序:
代码片段
文件名:ProcedureUser.php
?php
if (!mysql_connect("localhost","root","welefen")){
echo "连接数据库失败";
}
if (!mysql_select_db("welefen")){
echo "选择数据库表失败br";
}
$insert_user=array("welefen","welefen");//这里的welefen分别为用户名、密码
if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){
echo "添加用户$insert_user[0]成功br";
}else {
echo "添加用户$insert_user[0]失败br";
}
$validate_user=array("welefen","welefen");//这里的welefen分别为用户名、密码
mysql_query("call validateuser('$validate_user[0]',@a)");
$Pwd=mysql_query("select @a");
$result=mysql_fetch_array($Pwd);
if ($result[0]==md5($validate_user[1])){
echo "用户$validate_user[0]验证正确br";
}else {
echo "用户$validate_user[0]验证错误br";
}
$modify_Pwd=array("welefen","weilefeng"); //welefen为用户名weilefeng为新密码
if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){
echo "用户$modigy_Pwd[0]的密码修改成功br";
}else {
echo "用户$modigy_Pwd[0]的密码修改失败br";
}
$delete_user=array("welefen"); //welefen为用户名
if (mysql_query("call deleteuser('$delete_user[0]')")){
echo "用户$delete_user[0]删除成功br";
}else {
echo "用户$delete_user[0]删除失败br";
}
?
程序运行的结果:
执行结果
添加用户welefen 成功
用户welefen 验证正确
用户welefen 的密码修改成功
用户welefen 删除成功
以上的这个程序简单的说明了Mysql 中的存储过程结合PHP 的应用,当然在实际应用要比这个
复杂的多。
验证角谷猜想
角谷猜想:给定一个整数x,若x%2=1,则x=3*x+1,否则x=x/2,如此循环下去,经过有限步骤必
能得到1。
例 如 : 初 始 整 数 为 9 , 则
9-28-14-7-22-11-34-17-52-26-13-40-20-10-5-16-8-4-2-1
为了说明存储过程中一些语法的应用,我们通过存储过程来实现它:
执行结果
mysql delimiter //
mysql create procedure jgguess(in number int)
- begin
- declare param1 int default 1;
- set @a=concat(number);
- jiaogu:loop #循环开始
- set param1=number%2;
- if param1=1 then set number=number*3+1; #number 为奇数,将它乘3加 1
- else set number=number/2;
- end if;
- set @a=concat(@a,'-',number);
- if number1 then iterate jiaogu; #number 不为 1,继续循环
- end if;
- leave jiaogu; #退出循环
- end loop jiaogu;
- end
- //
Query OK, 0 rows affected (0.00 sec)
mysql call jgguess(11);
- //
Query OK, 0 rows affected (0.00 sec)
mysql select @a//
+-------------------------------------------------------+
| @a |
+-------------------------------------------------------+
| 11-34-17-52-26-13-40-20-10-5-16-8-4-2-1 |
+-------------------------------------------------------+
1 row in set (0.02 sec)
在这个存储过程中,你传入的参数不能超过int 型数据的范围,否则就会报错。
触发器
触发器是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。例如当我们向
某个表插入一行数据时发生一个事件或者删除某个记录时触发某个事件。
语法:
CREATE TRIGGER trigger_Name trigger_time trigger_event
ON tbl_Name FOR EACHROW trigger_stmt
trigger_time 是触发器的动作时间。它可以是 BEFORE 或 AFTER ,以指明触发器是在激活它的
语句之前或之后触发。
trigger_event 指明了激活触发器的语句的类型。trigger_event 可以是下述值之一:
INSERT:将新行插入表时激活触发器,例如,通过 INSERT、LOADDATA 和 REPLACE 语句;
UPDATE:更改某一行时激活触发器,例如,通过UPDATE语句;
DELETE:从表中删除某一行时激活触发器,例如,通过 DELETE 和 REPLACE 语句。
例如当我们向上面的user 表中增加一个用户名为“welefen ”时,我们把记录用户数的表的值增
加 1;
代码片段
Create table numuser(
Num int not null default 0
);
Delimiter //
Create trigger testnum after insert on welefen.user for each row
Begin
Update welefen.numuser set Num=Num+1;
End
//
视图
当我们想得到数据表中某些字段的信息,并想把他们保存时我们就可以用视图。
语法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_Name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
例如我们想对上面的用户表使用视图,可以这样:
Create viewwelefen.userview as select * fromwelefen.user;
查看视图的信息可以使用:
Select * fromwelfen.userview;