-
2021-02-28 14:12:54
这里是java调用存储过程。package com.lijianbo.procedure;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;
/**
* @author
* 存储过程MySQL
*/
public class ProcedureMySql {
public static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/test";
public static final String USERNAME = "root";
public static final String PASSWORD = "root";
public static void main(String[] args) throws Exception {
// test1();
// test2();
testIdAdd();
}
public static void test1() throws Exception
{
Class.forName(DRIVER_CLASS);
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
String sql = "{CALL test1(?)}"; //调用存储过程
CallableStatement cstm = connection.prepareCall(sql); //实例化对象cstm
cstm.setString(1, "李"); //存储过程输入参数
cstm.execute(); // 执行存储过程
cstm.close();
connection.close();
}
/**
* 查询总的价格
* getTotalByUser2
* call getTotalByUser2(1, true, @total); -- 加税
*select @total;
* @throws Exception
*/
public static void test2() throws Exception {
Class.forName(DRIVER_CLASS);
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
String sql = "{CALL getTotalByUser2(?,?,?)}"; //调用存储过程
CallableStatement cstm = connection.prepareCall(sql); //实例化对象cstm
cstm.setInt(1, 1); //设置第一个传入参数
cstm.setBoolean(2, true); //设置第二个传入参数
cstm.registerOutParameter(3, Types.DECIMAL); // 设置返回值类型 即返回值
cstm.execute(); // 执行存储过程
System.out.println(cstm.getString(3));
cstm.close();
connection.close();
}
/**
*id自增
* getTotalByUser2
* call getTotalByUser2(1, true, @total); -- 加税
*select @total;
* @throws Exception
*/
public static void testIdAdd() throws Exception {
Class.forName(DRIVER_CLASS);
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
String sql = "{CALL test1(?)}"; //调用存储过程
CallableStatement cstm = connection.prepareCall(sql); //实例化对象cstm
cstm.setString(1, "测试"); //设置第一个传入参数
cstm.execute(); // 执行存储过程
cstm.close();
connection.close();
}
}
存储过程既可以在java中调用,也可以在触发器中调用,欲知简单实现。可以参考我的上一篇文章“触发器的简单实现”。
Java在sql中调用存储过程:
参数封装://存储过程参数封装
BatchImportParam batchImportParam = new BatchImportParam();
batchImportParam.setDescn(descn);
batchImportParam.setExportName(exportName);
batchImportParam.setExportNo(exportNo);
batchImportParam.setImportName(importName);
batchImportParam.setOrderNo(orderNo);
batchImportParam.setImportNo(importNo);
batchImportParam.setCreateby(getCurrentUserId(request));
batchImportParam.setCardProductId(cardProductId);
batchImportParam.setCardFaceId(cardFaceId);
batchImportParam.setCardTotalCount(null);
/*
* 调用存储过程,执行业务
*/
//batchImportParam为调用存储
//过程的封装的参数类,这里也可以采用一个map,向map中传参数。
batchImportCardManager.batchImportCardAndUser(batchImportParam);
//返回的参数,我们可以直接在参数集合中去
//直接获取
cardTotalCount = batchImportParam.getCardTotalCount();
System.err.println("==================存储过程成功导入总记录数为:"+cardTotalCount);
在BatchImportCardDAOImpl中我们采用select关键字查询。@Override
public Integer batchImportCardAndUser(BatchImportParam batchImportParam) {
return getSqlSession().selectOne(getSqlMapNamespace() + ".batch_import_cardanduser",batchImportParam);
}
在xml中调用存储过程。
{call batch_import_cardanduser(?,?,?,?,?,?,?,?,?,?)}
]]>
总结:其实这种在xml中调用也相当于上面的直接在方法中直接调用,都是需要传入参数,返回参数,只是表现形式不一样而已。
我这里只是一个示例,你可以参考里面的注释,具体存储过程的名字要根据你自己写的来修改。
时间:2016年12月20日16:59:13
-------------快速的向一张表中插入10万条数据,怎么做,用sql实现------------
最开始我想写一句插入的sql,直接循环插入多条数据,结果语法不正确。(sql只能执行一次,不能循环执行,调用一次执行一次)INSERT INTO test1(id,name) VALUES(1+(SELECT MAX(t.id) FROM test1 t),CONCAT('admin',(SELECT MAX(t1.id)+1 FROM test1 t1)))
WHERE ((SELECT MAX(id) from test1)
如下:-- 存储过程
delimiter ||
create procedure myproc()
begin
declare num int ;
set num = 1 ;
while num
insert into test1(id, `name`)
values
(num, concat("name", num)) ;
set num = num + 1 ;
end
while ;
end||
-- 执行这个函数
call myproc()
-- 删除这个存储过程
drop procedure myproc
-- 清空表
DELETE from test1
-- 查询数据
SELECT * from test1
总结:存储过程更易写逻辑,难度更低。我们有时候写多条关联查询的时候,sql难度比较大,其实可以写存储过程来实现,只是后期维护难度大点。
更多相关内容 -
abap调用hana存储过程.pdf
2019-08-20 14:08:32ABAP调用hana存储过程 -
Oracle 程序包里 直接调用 存储过程
2017-11-07 13:11:33创建一个包 test1 create package test1 is ...创建包的主体 test1,里面有个存储过程 t1,还有一个调用 t1 create or REPLACE package body test1 is PROCEDURE t1 is begin DBMS_OUTPUT.创建一个包 test1
create or replace package test1 is PROCEDURE t1; function t2 return number; end test1;
创建包的主体 test1,里面有个存储过程 t1,还有一个调用 t1
create or REPLACE package body test1 is PROCEDURE t1 is begin DBMS_OUTPUT.PUT_LINE(sysdate); end; function t2 return number is begin return 1; end; begin TEST1.T1; end test1;
执行方法
DECLARE begin TEST1.T1; end;
首次执行,会输出两次
当我们再次执行时,只输出了一次。
当每个连接的新用户,执行存储过程里任意一个存储过程 或者 函数,包里的调用都会执行。
-
C#调用oracle方法(包括调用存储过程)
2011-11-01 17:28:11详细的记录了C#如何调用oracle以及带有存储过程输出变量的方法,适合初学者。 -
如何在oracle SQL语句中调用存储过程
2021-05-01 03:25:21与函数不同,存储过程不返回值,SQL语句不能直接使用存储过程,只能通过EXECUT命令或在PL / SQL程序块内部调用存储过程. 定义存储过程的语法如下: 过程名称[(参数[,参数,...])] IS [本地声明] 开始 执行语句 ...声明部分包含变量和常量的数据类型和初始值. 这部分从关键字DECLARE开始. 如果不需要声明变量或常量,则可以忽略此部分. 应该注意的是,游标的声明也在此部分中.
可执行部分
执行部分是PL / SQL块中的指令部分. 从关键字BEGIN开始,所有可执行语句都放置在此部分中,其他PL / SQL块也可以放置在此部分中.
异常处理部分(Exception部分)
这部分是可选的. 在这一部分中,将处理异常或错误. 稍后我们将详细讨论异常处理.
PL / SQL块语法
[DECLARE]
-声明语句
开始
---可执行语句
[例外]
---异常语句
END
PL / SQL块中的每个语句必须以分号结尾. SQL语句可以是多行,但分号表示语句的结尾. 一行中可以有多个SQL语句,以分号分隔. 每个PL / SQL块均以BEGIN或DECLARE开头,以END结尾. 该评论用-标记.
PL / SQL块的名称和匿名性
PL / SQL程序块可以是命名程序块或匿名程序块. 可以在服务器或客户端上使用匿名块.
命名的程序块可以出现在其他PL / SQL程序块的声明部分中. 在这方面被调用过程被调用过程,很明显可以在执行部分或异常处理部分中引用子程序.
PL / SQL程序块可以独立编译并存储在中,并且连接到的任何应用程序都可以访问这些存储的PL / SQL程序块. ORACLE提供了四种类型的可存储程序:
. 功能
. 处理
. 包装
. 触发
功能
功能被命名为存储在中的PL / SQL块. 该函数接受零个或多个输入参数,并具有一个返回值. 创建函数时,将定义返回值的数据类型. 定义函数的语法如下:
函数名称[{parameter [,parameter,...])] RETURN数据类型IS
[本地声明]
开始
执行语句
[例外
异常处理程序]
END [名称]
过程
存储过程是一个PL / SQL程序块,它接受零个或多个参数作为输入(INPUT)或输出(OUTPUT),或作为输入和输出(INOUT). 与函数不同,存储过程不返回值,SQL语句不能直接使用存储过程,只能通过EXECUT命令或在PL / SQL程序块内部调用存储过程. 定义存储过程的语法如下:
过程名称[(参数[,参数,...])] IS
[本地声明]
开始
执行语句
[例外
异常处理程序]
END [名称]
包裹(包裹)
包实际上是分组在一起的相关对象的集合. 当调用包中的任何函数或存储过程时,包将被加载到内存中. 加速.
程序包由两部分组成: 规范和程序包主体(body),该规范描述了变量,常量,游标和子例程. 程序包主体完全定义了子例程和游标.
触发
触发器与表或事件相关联. 发生触发事件时,将触发表上定义的触发器.
变量和常量
将变量存储在内存中以获取值,该值可由PL / SQL块引用. 您可以将变量视为可以存储事物的容器. 容器的内容可以更改.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-207299-1.html
-
SpringBoot调用存储过程
2020-09-01 20:39:23程序中需要直接调用存储过程的场景 第一种:返回带参数的存储过程 第二种:返回结果集 第三种:第一种+第二种(不讨论) 数据库环境准备 数据库:MySQL 创建表及数据 CREATE TABLE `order` ( `uuid` varchar(32...程序中需要直接调用存储过程的场景
- 第一种:调用带输入输出参数的存储过程
- 第二种:调用存储过程返回结果集
- 第三种:第一种+第二种(不讨论)
数据库环境准备
- 数据库:MySQL
- 创建表及初始化数据表
CREATE TABLE `order` ( `uuid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `number` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, PRIMARY KEY (`uuid`) USING BTREE ) ; INSERT INTO `order` VALUES ('d14f8eec-ec1a-11ea-98de-00ffc575', '20200901000001', '单据1', NULL); INSERT INTO `order` VALUES ('d14f8eec-ec1a-11ea-98de-1234567', '20200901000003', '单据3', NULL); INSERT INTO `order` VALUES ('d14f8eec-ec1a-11ea-98de-sdfafdd', '20200901000002', '单据2', NULL);
- 创建存储过程
CREATE PROCEDURE Get_Order_By_Uuid( IN piUuid varchar(32), OUT poNumber varchar(32), OUT poName varchar(255), OUT poErrMsg varchar(255) ) BEGIN DECLARE notfound INT DEFAULT 0; #定义一个辅助变量用于判断 DECLARE cur1 CURSOR FOR SELECT number,name FROM iponkan_dbcp.order where uuid = piUuid; DECLARE CONTINUE HANDLER FOR NOT FOUND SET notfound = 1; OPEN cur1; FETCH cur1 INTO poNumber,poName; if notfound = 1 then set poErrMsg = 'uuid='+ piUuid +'的单据信息不存在'; end if; CLOSE cur1; END; CREATE PROCEDURE Get_ALL_Order() BEGIN SELECT number,name FROM iponkan_dbcp.order; END;
SpringBoot程序调用
情景一:调用带有输入输出参数的存储过程
/** * 调用存储过程返回参数-执行器 * * @author dongtangqiang */ @Component public class ProcedureReturnParametersExecutor { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private TransactionTemplate template; public boolean save() { String insertSql = "INSERT INTO `order`(`uuid`, `number`, `name`, `type`) VALUES ('d14f8eec-ec1a-11ea-98de-1234567', '20200901000003', '单据3', NULL)"; return jdbcTemplate.update(insertSql) > 0; } public Order getByUuid(String uuid) { ProcedureReturnParametersTransactionCallback callback = new ProcedureReturnParametersTransactionCallback( uuid); return template.execute(callback); } class ProcedureReturnParametersTransactionCallback implements TransactionCallback<Order> { private String uuid; public ProcedureReturnParametersTransactionCallback(String uuid) { super(); this.uuid = uuid; } @Override public Order doInTransaction(TransactionStatus transactionStatus) { return jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { String procedure = "{call Get_Order_By_Uuid(?,?,?,?)}"; CallableStatement cs = con.prepareCall(procedure); cs.setString(1, uuid); cs.registerOutParameter(2, java.sql.Types.VARCHAR); cs.registerOutParameter(3, java.sql.Types.VARCHAR); cs.registerOutParameter(4, java.sql.Types.VARCHAR); return cs; } }, new CallableStatementCallback<Order>() { @Override public Order doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { cs.execute(); String number = cs.getString(2); String name = cs.getString(3); String msg = cs.getString(4); if (msg != null) { throw new RuntimeException(msg); } Order order = new Order(); order.setNumber(number); order.setName(name); return order; } }); } } }
情景二:调用返回结果集合的存储过程
/** * 调用存储过程返回结果集-执行器 * * @author dongtangqiang */ @Component public class ProcedureReturnListExecutor { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private TransactionTemplate template; public List<Order> getAll() { ProcedureReturnListTransactionCallback callback = new ProcedureReturnListTransactionCallback(); return template.execute(callback); } class ProcedureReturnListTransactionCallback implements TransactionCallback<List<Order>> { @Override public List<Order> doInTransaction(TransactionStatus transactionStatus) { return jdbcTemplate.execute(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection con) throws SQLException { String procedure = "{call Get_ALL_Order()}"; CallableStatement cs = con.prepareCall(procedure); return cs; } }, new CallableStatementCallback<List<Order>>() { @Override public List<Order> doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException { ResultSet rs = cs.executeQuery(); List<Order> list = new ArrayList<>(); while (rs.next()) { String number = rs.getString(1); String name = rs.getString(2); Order order = new Order(); order.setNumber(number); order.setName(name); list.add(order); } return list; } }); } } }
测试
- 结果:达到预期
/** * @author dongtangqiang */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest public class TestProcedure { @Autowired private ProcedureReturnParametersExecutor procedure1; @Autowired private ProcedureReturnListExecutor procedure2; @Test public void test() { procedure1.save(); } @Test public void testGetByUuid() { Order order = procedure1.getByUuid("d14f8eec-ec1a-11ea-98de-1234567"); assertNotNull(order); assertEquals(order.getNumber(), "20200901000003"); } @Test public void testGetAll() { List<Order> orderList = procedure2.getAll(); assertEquals(3, orderList.size()); } }
完整代码
-
mysql如何调用存储过程
2021-02-02 15:11:48mysql调用存储过程的方法:可以利用CALL语句来调用存储过程,语法为【CALL sp_name([parameter])】。调用存储过程可以使程序执行效率更高,增强程序的可重用性和维护性。MySQL调用存储过程必须要使用call语句调用,... -
Spring Data JPA 直接调用存储过程的方法
2016-09-12 15:59:20@NamedNativeQueries( { @NamedNativeQuery( name = "FixedFeeOrderValidCalculate", query = "insert into kh.tb_cust_tdyw" + -
sqlserver里存储过程怎么调用存储过程
2021-01-19 21:41:07展开全部1、打开SQL server management studio,连接到数据库,展开想要创建的数据库,找到【可编程性】->【存储过程62616964757a...【存储过程】,就可以开始创建存储过程了。3、当点击了第二步的【存储... -
mysql 触发器中调用存储过程
2021-02-02 07:02:00想要在MYSQL的触发器中调用存储过程,但是IDE提示:0A000 Not allowed to return a result set from a trigger触发器代码如下:DELIMITER $$CREATE TRIGGER tri_ContactCompany_Insert AFTER INSERTON ... -
oracle中存储过程调用存储过程(带有返回结果集)
2021-05-01 03:11:43在oracle中,存储过程是可以调用存储过程的。其中,被调用的存储过程可以带返回游标的结果集,或者是一个定义的变量,两者都可以,在实现过程中几乎没什么差别。在调用的存储过程,要注意写好对应的游标或者定义的... -
Mybatis调用存储过程/存储函数
2022-04-13 21:38:14则调用存储过程的一般格式如下: {call p_statisticvalue( #{a,mode = IN,jdbcType=java.lang.Integer}, #{b,mode=OUT,jdbcType=java.lang.Integer}) } 在如上格式中,IN表示输入参数,OUT表示输出参数,... -
存储过程的使用,.Net调用存储过程的方法
2018-10-31 17:47:19存储过程是一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次调用编译后,再次调用不需要编译。用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数) 来执行它 , 存储过程是数据库中的一个... -
ABAP使用AMDP调用HANA存储过程
2018-12-14 12:29:53更多内容关注公众号:SAP Technical 欢迎关注微信公众号:SAP Technical 数据建模在SAP HANA视图中完成,需要读取视图的输出并将其保留在HANA表中。...此存储过程从HANA视图读取数据,并将数据进入“XYZ”模式下... -
Mysql存储过程知识点总结+Mybatisplus调用存储过程案例实现
2021-05-07 15:06:35创建存储过程:四、存储过程的参数五、MybatisPlus调用存储过程controllerDepartmentServiceImplMapperMapper.xml 一、存储过程 MySQL 5.0版本开始支持存储过程 ** 存储过程(Stored Procedure)**是一种在数据库中... -
如何在MySQL中使用select语句调用存储过程?
2021-01-26 22:37:10在MySQL中,无法在FROM子句中使用select from过程。您可以使用CALL命令,然后可以执行SELECT语句。让我们首先创建一个表:mysql>createtableDemoTable2->(->CustomerIdintNOTNULLAUTO_INCREMENTPRIMARYKEY,... -
SQLServer存储过程调用WebService
2018-01-12 11:21:18SQL Server数据库中直接调用Web Service,不需要通过前台调用 -
springboot+mybatis调用存储过程
2021-01-06 11:49:37可以减少网络传输,存储过程直接在数据库服务器运行。 缺点 数据库迁移需要改动,移植性不行。(大型企业一般不会考虑使用) 一 navicate如何建立存储过程 参考 declare:声明变量 into xxx: 给xxx赋值 存储... -
KETTLE调用Oracle存储过程
2019-10-13 16:46:16使用KETTLE调用存储过程 1.创建调用存储过程的转换 1.1创建转换 点击右上角【文件】->【新建】->【转换】 1.2添加步骤 1.2.1 在新创建的转换中添加【表输入】,【调用DB存储过程】步骤 在右侧【核心... -
通过shell脚本调用存储过程
2018-10-26 19:17:41被调用的SQL脚本 test.sql create or replace function fun_test() returns integer as $BODY$ begin xxx(具体实现代码) return 0; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT ... -
shell调用存储过程
2018-10-19 15:52:313.shell脚本调用存储过程,crontab定时执行shell脚本 我使用的是第三种方法,这一篇主要数一下我踩过的坑!!! shell脚本,调用存储过程: mysql -h *** -u *** -D *** -p*** -e *** -h... -
MySQL 使用navicat客户端 调用存储过程的两种方式
2022-03-16 20:41:47使用navicat 客户端直接创建存储过程和调用第二种方式 以下表示创建表结构,插入数据,并使用存储过程创建往数据表中添加记录 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar... -
[FineReport]调用存储过程
2016-12-19 13:49:32有两种调用存储过程方法:一是在数据库数据集处调用,二是直接用存储过程数据集进行调用。在数据库数据集处调用,即在数据库查询中,添加语句有两种方式 (1) call 存储过程名 {call username.package.procedure... -
.net core EF Core 调用存储过程
2019-05-07 00:04:00.net core EF Core 调用存储过程 ...我们知道,EF Core 是不支持直接调用存储过程的,那它又提供了什么样的方式去执行存储过程呢?有如下方法: 1、FromSql,官方文档 DbSet<TEntity>.FromSql() 2、执行SQl命... -
存储过程基础(四)通过c#调用存储过程实现查询操作
2018-09-02 21:54:27本文主要介绍如何通过c#调用自定义存储过程,实现根据ID查询USER表中的记录,并将其结果返回,存放到DataTable中。 为了加深对存储过程的理解,通过两种方式实现上文要求。第一种方式是传统的将sql语句提交到... -
thinkphp调用存储过程
2016-09-07 18:17:19thinkphp貌似不能直接调用存储过程,要用原生的方法。 代码如下:$userInfo_proc = "call proc_get_userinfo_details(".$data['userid'].",''); ";//传了个参数 $res = mysql_query($userInfo_proc);//执行存储过程...