MySQL 存储过程实例_MySQL
虽然MySQL的存储过程,一般情况下,是不会使用到的,但是在一些特殊场景中,还是有需求的。最近遇到一个sql server向mysql迁移的项目,有一些sql server的存储过程需要向mysql迁移。所以进行复习了一下。下面是一些存储过程的例子。
1. 例子1
DELIMITER // DROP PROCEDURE IF EXISTS loginandreg // CREATE PROCEDURE loginandreg( OUT userId BIGINT, IN user_Pwd VARCHAR(32), IN user_MobileCode VARCHAR(16), IN user_RegIP VARCHAR(16) ) BEGIN DECLARE cnt BIGINT DEFAULT 0; DECLARE cnt2 BIGINT DEFAULT 0; DECLARE outid BIGINT DEFAULT -1; SELECT COUNT(*) INTO cnt FROM Users u WHERE u.user_MobileCode=user_MobileCode; IF cnt > 0 THEN SELECT COUNT(*) INTO cnt2 FROM Users u WHERE u.user_MobileCode=user_MobileCode AND u.user_Pwd=user_Pwd; IF cnt2 > 0 THEN SELECT u.userId INTO outid FROM Users u WHERE u.user_MobileCode=user_MobileCode AND u.user_Pwd=user_Pwd LIMIT 1; ELSE SELECT -1 INTO outid; END IF; SELECT outid INTO userId; ELSE INSERT INTO Users(user_Pwd,user_MobileCode,user_Visibility,user_Level,user_RegTime, user_RegIP,user_Collecter,user_Collected) VALUES (user_Pwd,user_MobileCode,6,6,NOW(),user_RegIP,0,0); SET userId=LAST_INSERT_ID(); SELECT userId; END IF; END // DELIMITER ;
知识点:
1)参数分为 in, out 类型,即输入类型和输出类型;
2)select xx into varible from table where ... 句式:
SELECT COUNT(*) INTO cnt FROM Users u WHERE u.user_MobileCode=user_MobileCode;
3)if cnt > 0 then ... elseif cnt =0 then ... else ... end if;
if 语句注意带有 then 关键字和 end if 结束关键字。
4)获取 insert 语句的主键:set userId=last_insert_id(); select userId;
select last_insert_id() into userId; 也是可以的。
5)如何调用该存储过程:
CALL loginandreg(@userId,'112358','18357xxx7','127.0.0.1');
SELECT @userId;
最后的 select @userId 就是存储过程的 out 类型参数返回的结果。
2. 例子2
DELIMITER // DROP PROCEDURE IF EXISTS mingRenTangJiangLi // CREATE PROCEDURE mingRenTangJiangLi() BEGIN DECLARE total_level,role_id,ming_ren_level,ming_ren_type, fuben_times,tiaozhan_times,duobei_shijian,no_more_data INT DEFAULT 0; DECLARE my_cursor CURSOR FOR SELECT playerRoleId,`level`,type from mingrentang; DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_data = 1; OPEN my_cursor; FETCH my_cursor INTO role_id,ming_ren_level,ming_ren_type; REPEAT set total_level = ming_ren_level + 10 * (ming_ren_type-1); set fuben_times = total_level / 2; set tiaozhan_times = total_level /3; set duobei_shijian = 10 * total_level; select total_level,fuben_times,tiaozhan_times,duobei_shijian; update player_role set hufu=hufu+1000,paihangbangNumber=paihangbangNumber+tiaozhan_times, duobeiShiJian=duobeiShiJian+duobei_shijian,fubenTimes=fubenTimes+fuben_times; FETCH my_cursor INTO role_id,ming_ren_level,ming_ren_type; UNTIL no_more_data = 1 END REPEAT; CLOSE my_cursor; END // DELIMITER ;
知识点:
1)该例子演示了游标的用法:
DECLARE my_cursor CURSOR FOR SELECT playerRoleId,`level`,type from mingrentang;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_data = 1;
定义了游标语句,也说明了游标循环结束时设置的标志:SET no_more_data = 1;
OPEN my_cursor;
FETCH my_cursor INTO role_id,ming_ren_level,ming_ren_type;
打开游标,从游标中获取值。
REPEAT
......
FETCH my_cursor INTO role_id,ming_ren_level,ming_ren_type;
UNTIL no_more_data = 1
END REPEAT;
repeat 循环 直到 no_more_data = 1: UNTIL no_more_data = 1,然后结束循环 END REPEAT;
最后关闭游标 close my_cursor;
因为上面在定义游标时,指明了,没有数据时设置了 no_more_data = 1,所以这里使用 UNTIL no_more_data = 1 来退出repeat
2)判断相等是使用 = ,而不是 == ,赋值操作是使用 set var=xxx; :set fuben_times = total_level / 2;
3. Java 如何调用存储过程
1)hibernate调用存储过程:
/* * 调用无参数的存储过程,传入存储过程名字 */ public int callProcedure(final String procedureName) { int count = (Integer)this.getHibernateTemplate().execute( new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { String procedureSql = "{call "+ procedureName +"()}"; Query query = session.createSQLQuery(procedureSql); Integer num = query.executeUpdate(); return num; } }); return count; }
2)ibatis 调用mysql 存储过程:
@Override public Long loginAndRegByProcedure(String user_Pwd, String user_MobileCode, String user_RegIP){ Long userId = null; HashMap<String,Object> paramMap = new HashMap<String,Object>(); paramMap.put("userId", userId); paramMap.put("user_Pwd", user_Pwd); paramMap.put("user_MobileCode", user_MobileCode); paramMap.put("user_RegIP", user_RegIP); this.getSqlMapClientTemplate().queryForObject("Users.loginAndRegByProcedure", paramMap); return (Long)paramMap.get("userId"); }
对应的xml 文件配置:
<parameterMap id="pro_pram_Map" class="java.util.Map"> <parameter property="userId" javaType="java.lang.Long" jdbcType="BIGINT" mode="OUT"/> <parameter property="user_Pwd" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/> <parameter property="user_MobileCode" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/> <parameter property="user_RegIP" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN"/> </parameterMap> <procedure id="loginAndRegByProcedure" parameterMap="pro_pram_Map"> {call loginandreg(?, ?, ?, ?)} </procedure>
存储过程的参数的类型,是在xml文件中说明的。
3) JDBC 调用mysql 存储过程:
public Long loginAndRegByProcedure2(String user_Pwd, String user_MobileCode, String user_RegIP){ Connection conn = DbUtil.getConnection(); CallableStatement cstmt = conn.prepareCall("{call loginandreg(?, ?, ?, ?)}"); cstmt.setString(2, user_Pwd); cstmt.setString(3, user_MobileCode); cstmt.setString(4, user_RegIP); cstmt.registerOutParameter(1, java.sql.Types.BIGINT); cstmt.execute(); return cstmt.getLong(1); }
输入参数:cstmt.setString(2, user_Pwd);
输出参数:cstmt.registerOutParameter(1, java.sql.Types.BIGINT);

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









Python의 SVM(Support Vector Machine)은 분류 및 회귀 문제를 해결하는 데 사용할 수 있는 강력한 지도 학습 알고리즘입니다. SVM은 고차원 데이터와 비선형 문제를 처리할 때 탁월한 성능을 발휘하며 데이터 마이닝, 이미지 분류, 텍스트 분류, 생물정보학 및 기타 분야에서 널리 사용됩니다. 이번 글에서는 Python에서 분류를 위해 SVM을 사용하는 예를 소개하겠습니다. scikit-learn 라이브러리의 SVM 모델을 사용하겠습니다.

새로운 세대의 프런트엔드 프레임워크가 계속 등장함에 따라 VUE3는 빠르고 유연하며 사용하기 쉬운 프런트엔드 프레임워크로 사랑받고 있습니다. 다음으로 VUE3의 기본을 배우고 간단한 동영상 플레이어를 만들어 보겠습니다. 1. VUE3 설치 먼저 VUE3를 로컬에 설치해야 합니다. 명령줄 도구를 열고 다음 명령을 실행합니다. npminstallvue@next 그런 다음 새 HTML 파일을 만들고 VUE3을 도입합니다. <!doctypehtml>

Golang은 다양한 애플리케이션과 서비스를 개발하는 데 사용할 수 있는 강력하고 효율적인 프로그래밍 언어입니다. Golang에서 포인터는 데이터를 보다 유연하고 효율적으로 운영하는 데 도움이 되는 매우 중요한 개념입니다. 포인터 변환은 다양한 유형 간의 포인터 작업 프로세스를 나타냅니다. 이 기사에서는 특정 예제를 사용하여 Golang의 포인터 변환 모범 사례를 학습합니다. 1. 기본 개념 Golang에서 각 변수에는 주소가 있으며, 주소는 메모리에서 변수의 위치입니다.

VAE는 생성 모델이며 전체 이름은 VariationalAutoencoder이며 중국어로 Variational Autoencoder로 번역됩니다. 이미지, 오디오, 텍스트 등과 같은 새로운 데이터를 생성하는 데 사용할 수 있는 비지도 학습 알고리즘입니다. 일반 자동 인코더에 비해 VAE는 더 유연하고 강력하며 더 복잡하고 현실적인 데이터를 생성할 수 있습니다. Python은 가장 널리 사용되는 프로그래밍 언어 중 하나이며 딥 러닝을 위한 주요 도구 중 하나입니다. Python에는 우수한 기계 학습과 심층적인 기능이 많이 있습니다.

인터넷의 대중화로 인해 인증 코드는 로그인, 등록, 비밀번호 검색 및 기타 작업에 필요한 프로세스가 되었습니다. Gin 프레임워크에서는 인증 코드 기능 구현이 매우 간단해졌습니다. 이 기사에서는 타사 라이브러리를 사용하여 Gin 프레임워크에서 확인 코드 기능을 구현하는 방법을 소개하고 독자가 참조할 수 있는 샘플 코드를 제공합니다. 1. 종속 라이브러리 설치 인증 코드를 사용하기 전에 타사 라이브러리인 goCaptcha를 설치해야 합니다. goCaptcha를 설치하려면 goget 명령을 사용할 수 있습니다: $goget-ugithub

Oracle 인스턴스 수와 데이터베이스 성능 간의 관계 Oracle 데이터베이스는 업계에서 잘 알려진 관계형 데이터베이스 관리 시스템 중 하나이며 엔터프라이즈 수준의 데이터 저장 및 관리에 널리 사용됩니다. Oracle 데이터베이스에서 인스턴스는 매우 중요한 개념입니다. 인스턴스는 메모리 내 Oracle 데이터베이스가 실행되는 환경을 의미합니다. 각 인스턴스는 사용자 요청을 처리하고 데이터베이스 작업을 관리하는 데 사용되는 독립적인 메모리 구조와 백그라운드 프로세스를 갖습니다. 인스턴스 수는 Oracle 데이터베이스의 성능과 안정성에 중요한 영향을 미칩니다.

인터넷의 급속한 발전으로 인해 데이터는 오늘날 정보화 시대의 가장 중요한 자원 중 하나가 되었습니다. 웹 크롤러는 네트워크 데이터를 자동으로 획득하고 처리하는 기술로 점점 더 많은 관심과 활용을 불러일으키고 있습니다. 이 기사에서는 PHP를 사용하여 간단한 웹 크롤러를 개발하고 네트워크 데이터를 자동으로 가져오는 기능을 구현하는 방법을 소개합니다. 1. 웹 크롤러 개요 웹 크롤러는 네트워크 자원을 자동으로 획득하고 처리하는 기술로, 주요 작업 프로세스는 브라우저 동작을 시뮬레이션하고 지정된 URL 주소에 자동으로 액세스하여 모든 정보를 추출하는 것입니다.

Back to the Future 1999에서 플레이어는 다양한 레벨의 도전에 직면하게 되며 각 레벨은 완전히 다른 도전을 가져옵니다. 레벨 중 하나인 6-24에서는 확실히 많은 플레이어가 이 레벨에 도전하는 방법을 알고 있을 것입니다. 다음은 관련 정리 방법도 가져올 것입니다. 백투더퓨처 19996-24 클리어 방법 1. 한 문장으로 레벨 30을 불태운 뒤, 보스가 기절할 때까지 기다렸다가 세게 때린다. 2. 한 라운드에 굽기 위해 메인 C와 142d를 우선적으로 사용합니다. 3. 두 번째 라운드에서는 보조와 유모의 작은 스킬을 사용하여 화상을 입히고 메인 C 카드를 사용하여 큰 움직임을 만듭니다. 4. 보스는 3라운드에 기절한 후 궁극기 이동 및 데미지 스킬로 직접 제압됩니다.
