精华内容
下载资源
问答
  • 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存储过程
  • 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以及带有存储过程输出变量的方法,适合初学者。
  • 如何在oracle SQL语句中调用存储过程

    千次阅读 2021-05-01 03:25:21
    与函数不同,存储过程不返回值,SQL语句不能直接使用存储过程,只能通过EXECUT命令或在PL / SQL程序块内部调用存储过程. 定义存储过程的语法如下: 过程名称[(参数[,参数,...])] IS [本地声明] 开始 执行语句 ...

    7e1847e2b96ba0b5b667bf46e312f8ea.png

    声明部分包含变量和常量的数据类型和初始值. 这部分从关键字DECLARE开始. 如果不需要声明变量或常量,则可以忽略此部分. 应该注意的是,游标的声明也在此部分中.

    可执行部分

    执行部分是PL / SQL块中的指令部分. 从关键字BEGIN开始,所有可执行语句都放置在此部分中,其他PL / SQL块也可以放置在此部分中.

    异常处理部分(Exception部分)

    这部分是可选的. 在这一部分中,将处理异常或错误. 稍后我们将详细讨论异常处理.

    PL / SQL块语法

    [DECLARE]

    -声明语句

    开始

    71508fe3a4a27dd909a68cf682253736.png

    ---可执行语句

    [例外]

    ---异常语句

    END

    PL / SQL块中的每个语句必须以分号结尾. SQL语句可以是多行,但分号表示语句的结尾. 一行中可以有多个SQL语句,以分号分隔. 每个PL / SQL块均以BEGIN或DECLARE开头,以END结尾. 该评论用-标记.

    PL / SQL块的名称和匿名性

    PL / SQL程序块可以是命名程序块或匿名程序块. 可以在服务器或客户端上使用匿名块.

    命名的程序块可以出现在其他PL / SQL程序块的声明部分中. 在这方面被调用过程被调用过程,很明显可以在执行部分或异常处理部分中引用子程序.

    PL / SQL程序块可以独立编译并存储在中,并且连接到的任何应用程序都可以访问这些存储的PL / SQL程序块. ORACLE提供了四种类型的可存储程序:

    1-711-png_6_0_0_135_313_454_800_892.979_1262.879-404-0-1268-404.jpg

    . 功能

    . 处理

    . 包装

    . 触发

    功能

    功能被命名为存储在中的PL / SQL块. 该函数接受零个或多个输入参数,并具有一个返回值. 创建函数时,将定义返回值的数据类型. 定义函数的语法如下:

    函数名称[{parameter [,parameter,...])] RETURN数据类型IS

    [本地声明]

    开始

    07110fed3c7c72866622434ccfa5688e.png

    执行语句

    [例外

    异常处理程序]

    END [名称]

    过程

    存储过程是一个PL / SQL程序块,它接受零个或多个参数作为输入(INPUT)或输出(OUTPUT),或作为输入和输出(INOUT). 与函数不同,存储过程不返回值,SQL语句不能直接使用存储过程,只能通过EXECUT命令或在PL / SQL程序块内部调用存储过程. 定义存储过程的语法如下:

    过程名称[(参数[,参数,...])] IS

    [本地声明]

    开始

    0eb1e5cbc4446c29c6e00c06b92514dd.png

    执行语句

    [例外

    异常处理程序]

    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());
      }
    
    }
    
    

    完整代码

    Github::iponkan-dbcp

    展开全文
  • mysql调用存储过程的方法:可以利用CALL语句来调用存储过程,语法为【CALL sp_name([parameter])】。调用存储过程可以使程序执行效率更高,增强程序的可重用性和维护性。MySQL调用存储过程必须要使用call语句调用,...
  • @NamedNativeQueries( { @NamedNativeQuery( name = "FixedFeeOrderValidCalculate", query = "insert into kh.tb_cust_tdyw" +
  • 展开全部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中,存储过程是可以调用存储过程的。其中,被调用的存储过程可以带返回游标的结果集,或者是一个定义的变量,两者都可以,在实现过程中几乎没什么差别。在调用的存储过程,要注意写好对应的游标或者定义的...
  • 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表示输出参数,...
  • 存储过程是一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次调用编译后,再次调用不需要编译。用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数) 来执行它 , 存储过程是数据库中的一个...
  • ABAP使用AMDP调用HANA存储过程

    千次阅读 2018-12-14 12:29:53
    更多内容关注公众号:SAP Technical 欢迎关注微信公众号:SAP Technical 数据建模在SAP HANA视图中完成,需要读取视图的输出并将其保留在HANA表中。...此存储过程从HANA视图读取数据,并将数据进入“XYZ”模式下...
  • 创建存储过程:四、存储过程的参数五、MybatisPlus调用存储过程controllerDepartmentServiceImplMapperMapper.xml 一、存储过程 MySQL 5.0版本开始支持存储过程 ** 存储过程(Stored Procedure)**是一种在数据库中...
  • 在MySQL中,无法在FROM子句中使用select from过程。您可以使用CALL命令,然后可以执行SELECT语句。让我们首先创建一个表:mysql>createtableDemoTable2->(->CustomerIdintNOTNULLAUTO_INCREMENTPRIMARYKEY,...
  • SQL 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:31
     3.shell脚本调用存储过程,crontab定时执行shell脚本  我使用的是第三种方法,这一篇主要数一下我踩过的坑!!!  shell脚本,调用存储过程:  mysql -h *** -u *** -D *** -p*** -e ***  -h...
  • 使用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#调用自定义存储过程,实现根据ID查询USER表中的记录,并将其结果返回,存放到DataTable中。  为了加深对存储过程的理解,通过两种方式实现上文要求。第一种方式是传统的将sql语句提交到...
  • thinkphp调用存储过程

    千次阅读 2016-09-07 18:17:19
    thinkphp貌似不能直接调用存储过程,要用原生的方法。 代码如下:$userInfo_proc = "call proc_get_userinfo_details(".$data['userid'].",''); ";//传了个参数 $res = mysql_query($userInfo_proc);//执行存储过程...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 907,216
精华内容 362,886
关键字:

如何直接调用存储过程