GVKun编程网logo

如何使用MyBatis将对象的Java列表传递给Oracle存储过程?(mybatis传入list对象)

6

最近很多小伙伴都在问如何使用MyBatis将对象的Java列表传递给Oracle存储过程?和mybatis传入list对象这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展c#–如何

最近很多小伙伴都在问如何使用MyBatis将对象的Java列表传递给Oracle存储过程?mybatis传入list对象这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展c# – 如何使用Entity Framework 6将数据列表传递给存储过程、Java Oracle存储过程问题、java 调用 oracle存储过程、JavaEE——Mybatis(20)--MyBatis 实用场景 3. 存储过程等相关知识,下面开始了哦!

本文目录一览:

如何使用MyBatis将对象的Java列表传递给Oracle存储过程?(mybatis传入list对象)

如何使用MyBatis将对象的Java列表传递给Oracle存储过程?(mybatis传入list对象)

我已经搜索了一段时间,似乎找不到任何真正的答案。

我有一个Oracle存储过程,该存储过程具有许多in参数,这些参数的类型是表rowtype的表。因此,例如:

在pacakge中声明:

TYPE param1_type_t IS TABLE OF table1%ROWTYPE;TYPE param2_type_t IS TABLE OF table2%ROWTYPE;TYPE param3_type_t IS TABLE OF table3%ROWTYPE;

Oracle过程:

PROCEDURE my_proc(   parameter1    IN param1_type_t,   parameter2    IN param2_type_t,   parameter3    IN param3_type_t)

在Java方面,我有3个对应的对象列表,它们表示用Java填充的每个参数。在这种情况下可以使用MyBatis调用Oracle过程吗?

<update id="callOracleSP" statementType="CALLABLE">    {CALL my_proc( #{param1, mode=IN},                   #{param2, mode=IN},                   #{param3, mode=IN}                 )    }</update>

对象本身是具有String和Integer属性以及它们各自的getter和setter的简单VO。

我不太确定如何进行。我是否需要以某种方式将Java对象列表映射到Oracle类型?

答案1

小编典典

我无法确定您是否已经这样做,但是您需要定义Oracle对象。

CREATE OR REPLACE TYPE SCHEMA."YOUR_OBJECT" AS OBJECT(    field_one    varchar2(50),    field_two    varchar2(100));/CREATE OR REPLACE TYPE SCHEMA."YOUR_OBJECT_ARRAY" AS TABLE OF YOUR_OBJECT;/

然后,您可以编写类型处理程序以将Java对象映射到Oracle对象。

import oracle.sql.ARRAY;import oracle.sql.ArrayDescriptor;import oracle.sql.STRUCT;import oracle.sql.StructDescriptor;....public class YourTypeHandler implements TypeHandler{....    public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException    {        List<YourObject> objects = (List<YourObject>) parameter;        StructDescriptor structDescriptor = StructDescriptor.createDescriptor("YOUR_OBJECT", ps.getConnection());        STRUCT[] structs = new STRUCT[objects.size()];        for (int index = 0; index < objects.size(); index++)        {            YourObject pack = packs.get(index);            Object[] params = new Object[2];            params[0] = pack.getFieldOne();            params[1] = pack.getFieldTwo();            STRUCT struct = new STRUCT(structDescriptor, ps.getConnection(), params);            structs[index] = struct;        }        ArrayDescriptor desc = ArrayDescriptor.createDescriptor("YOUR_OBJECT_ARRAY", ps.getConnection());        ARRAY oracleArray = new ARRAY(desc, ps.getConnection(), structs);        ps.setArray(i, oracleArray);    }}

然后调用该过程,

call your_proc(#{yourObjects, javaType=Object, jdbcType=ARRAY, jdbcTypeName=YOUR_OBJECT_ARRAY, mode=IN, typeHandler=YourObjectArrayTypeHandler})

c# – 如何使用Entity Framework 6将数据列表传递给存储过程

c# – 如何使用Entity Framework 6将数据列表传递给存储过程

我正在尝试使用Entity Framework Database First将数据列表从C#传递到sql Server存储过程. SO和其他地方有很多关于这个问题的文章,但是将变量数据传递给存储过程以及从数据库返回变量数据的内容并不明显.他们也倾向于专注于调用存储过程的代码,但我无法做到这一点.

在SSMS中创建并测试了用户定义的表类型和存储过程.问题发生在C#中.更新模型(.edmx文件)时,会发出以下警告:

Warning 4 Error 6005: The function ‘uspGetBusyPersonsTVP’ has a parameter ‘list’ at parameter index 2 that has a data type ‘table type’ which is currently not supported for the target Entity Framework version. The function was excluded.

模型浏览器中的检查显示已在模型中创建存储过程,但仅使用非TVP参数.

此MSDN站点https://msdn.microsoft.com/en-us/data/hh859577.aspx表示自EF 5.0以来已支持表值参数,但本文仅讨论返回数据.

我刚刚完成更新,现在我正在使用Visual Studio 2015社区,.Net 4.6和Entity Framework 6.1.3.
有谁知道TVP是否可以传递给存储过程,或者是否有可能被支持?

解决方法

您引用的文章讨论了表值函数(即返回表的用户定义函数),而不是将表值参数传递给存储过程.你在比较苹果和大象.

EF是否会支持它我无法回答,因为我不为微软工作.无论是否可以,基于How to pass table value parameters to stored procedure from .net code的答案似乎是“是”,但是看起来你需要使用原始的ADO.NET来做到这一点.

Java Oracle存储过程问题

Java Oracle存储过程问题

PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和D

pl/sql是oracle对标准数据库语言的扩展,oracle公司已经将pl/sql整合到oracle 服务器和其他工具中了,近几年中更多的开发人员和dba开始使用pl/sql,本文将讲述pl/sql基础语法,结构和组件、以及如何设计并执行一个pl/sql程序。

PL/SQL的优点

从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL/SQL的情形。PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORACLE工具中的技术,可以把PL/SQL看作ORACLE服务器内的一个引擎,sql语句执行者处理单个的sql语句,PL/SQL引擎处理PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处理时,ORACLE服务器中的SQL语句执行器处理pl/sql程序块中的SQL语句。

PL/SQL的优点如下:

. PL/SQL是一种高性能的基于事务处理的语言,能运行在任何ORACLE环境中,支持所有数据处理命令。通过使用PL/SQL程序单元处理SQL的数据定义和数据控制元素。

立即学习“Java免费学习笔记(深入)”;

. PL/SQL支持所有SQL数据类型和所有SQL函数,同时支持所有ORACLE对象类型

. PL/SQL块可以被命名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令调用,任何客户/服务器工具都能访问PL/SQL程序,具有很好的可重用性。

. 可以使用ORACLE数据工具管理存储在服务器中的PL/SQL程序的安全性。可以授权或撤销数据库其他用户访问PL/SQL程序的能力。

. PL/SQL代码可以使用任何ASCII文本编辑器编写,所以对任何ORACLE能够运行的操作系统都是非常便利的

. 对于SQL,ORACLE必须在同一时间处理每一条SQL语句,在网络环境下这就意味作每一个独立的调用都必须被oracle服务器处理,这就占用大量的服务器时间,同时导致网络拥挤。而PL/SQL是以整个语句块发给服务器,这就降低了网络拥挤。

PL/SQL块结构

PL/SQL是一种块结构的语言,组成PL/SQL程序的单元是逻辑块,一个PL/SQL 程序包含了一个或多个逻辑块,每个块都可以划分为三个部分。与其他语言相同,变量在使用之前必须声明,PL/SQL提供了独立的专门用于处理异常的部分,下面描述了PL/SQL块的不同部分:

声明部分(Declaration section)

声明部分包含了变量和常量的数据类型和初始值。这个部分是由关键字DECLARE开始,如果不需要声明变量或常量,那么可以忽略这一部分;需要说明的是游标的声明也在这一部分。

执行部分(Executable section)

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

异常处理部分(Exception section)

这一部分是可选的,在这一部分中处理异常或错误,对异常处理的详细讨论我们在后面进行。

PL/SQL块语法

[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END


PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以使多行的,但分号表示该语句的结束。一行中可以有多条SQL语句,他们之间以分号分隔。每一个PL/SQL块由BEGIN或DECLARE开始,,以END结束。注释由--标示。

PL/SQL块的命名和匿名

PL/SQL程序块可以是一个命名的程序块也可以是一个匿名程序块。匿名程序块可以用在服务器端也可以用在客户端。

命名程序块可以出现在其他PL/SQL程序块的声明部分,这方面比较明显的是子程序,子程序可以在执行部分引用,也可以在异常处理部分引用。

PL/SQL程序块可背独立编译并存储在数据库中,任何与数据库相连接的应用程序都可以访问这些存储的PL/SQL程序块。ORACLE提供了四种类型的可存储的程序:

. 函数

. 过程

. 包

. 触发器

函数

函数是命名了的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下:

FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]


过程

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

PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]


包(package)

本文永久更新链接地址:

java 调用 oracle存储过程

java 调用 oracle存储过程

作为一个广泛使用的编程语言,java在数据库开发中具有重要作用。oracle作为当今最流行的关系型数据库管理系统之一,由于其高度的可扩展性和强大的性能而在企业应用程序中得到了广泛的使用。在使用oracle数据库时,存储过程是一种很常见的技术,本文将介绍java如何调用oracle存储过程。

一、Oracle存储过程概述

存储过程是一段被预编译的SQL语句集合,可以重复利用,一般情况下存储在数据库中。存储过程可以接收参数、产生输出、返回结果等,而且在执行效率方面有很大的优势。在Oracle数据库中,存储过程通常使用PL/SQL语言编写。

二、Java调用Oracle存储过程

在Java中调用Oracle存储过程有两种方式:使用JDBC或使用Hibernate框架。

立即学习“Java免费学习笔记(深入)”;

  1. 使用JDBC

使用JDBC调用Oracle存储过程一般需要以下步骤:

(1)打开数据库连接

通过使用Class.forName()方法和DriverManager.getConnection()方法来创建数据库连接。

(2)创建CallableStatement对象

在JDBC中,通过CallableStatement调用存储过程。可以使用Connection.prepareCall()方法创建CallableStatement对象。

(3)设置参数

通过CallableStatement对象的setXXX()方法设置存储过程的输入参数和输出参数。

(4)执行存储过程

通过CallableStatement.execute()方法来执行存储过程。

(5)释放资源

在执行完成之后要关闭资源,包括CallableStatement对象和数据库连接。

下面是一个使用JDBC调用Oracle存储过程的代码示例。

// 首先加载Oracle驱动
Class.forName("oracle.jdbc.driver.OracleDriver");

//创建数据库连接
Connection conn = DriverManager.getConnection(url, username, password);

//设置输入参数和输出参数
CallableStatement cstmt = conn.prepareCall("{call procedure_name(?,?,?)}");
cstmt.setString(1, input_param1);
cstmt.setString(2, input_param2);
cstmt.registerOutParameter(3, Types.VARCHAR);

//执行存储过程
cstmt.execute();

//获取输出参数
String output_param = cstmt.getString(3);

//释放资源
cstmt.close();
conn.close();
登录后复制
  1. 使用Hibernate框架

Hibernate框架是一个开源的对象/关系映射(ORM)框架,它提供了一种将Java对象映射到关系数据库中的方法。在使用Hibernate框架时,通常需要使用存储过程和自定义SQL语句来查询数据库。在Hibernate中,可以使用@NamedStoredProcedureQuery注解来调用存储过程。

下面是一个使用Hibernate调用Oracle存储过程的代码示例。

//定义存储过程
@NamedStoredProcedureQuery(
   name = "PROCEDURE_NAME",
   procedureName = "procedure_name",
   parameters = {
      @StoredProcedureParameter(mode = ParameterMode.IN, type = String.class, name = "input1"),
      @StoredProcedureParameter(mode = ParameterMode.IN, type = String.class, name = "input2"),
      @StoredProcedureParameter(mode = ParameterMode.OUT, type = String.class, name = "output")
   }
)

//调用存储过程
StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("PROCEDURE_NAME");
query.setParameter("input1", input1);
query.setParameter("input2", input2);
query.execute();

//获取结果
String result = (String) query.getOutputParameterValue("output");
登录后复制

三、总结

Java调用Oracle存储过程是企业级开发中非常常见的需求,可以通过使用JDBC或Hibernate框架来实现。使用JDBC时需要进行数据库连接、创建CallableStatement对象、设置参数、执行存储过程以及释放资源等步骤,相对比较麻烦。而使用Hibernate框架时,则可以使用@NamedStoredProcedureQuery注解来实现。无论是使用哪种方式,都需要注意设置参数的类型和顺序以及正确的存储过程名称。

以上就是java 调用 oracle存储过程的详细内容,更多请关注php中文网其它相关文章!

JavaEE——Mybatis(20)--MyBatis 实用场景 3. 存储过程

JavaEE——Mybatis(20)--MyBatis 实用场景 3. 存储过程

实际开发中,我们通常也会写一些存储过程,
MyBatis 也支持对存储过程的调用
・一个最简单的存储过程

delimiter $$
create procedure test()
begin
    select ''hello'';
end $$
delimiter ;

  

oracle 中创建存储过程

 

・存储过程的调用
1、 select 标签中 statementType=“CALLABLE”
2、标签体中调用语法:
{call procedure_name(#{param1_info},#{param2_info})}

<!-- public void getPageByProcedure(); 
	1、使用select标签定义调用存储过程
	2、statementType="CALLABLE":表示要调用存储过程
	3、{call procedure_name(params)}
	-->
	<select id="getPageByProcedure" statementType="CALLABLE" databaseId="oracle">
		{call hello_test(
			#{start,mode=IN,jdbcType=INTEGER},
			#{end,mode=IN,jdbcType=INTEGER},
			#{count,mode=OUT,jdbcType=INTEGER},
			#{emps,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=PageEmp}
		)}
	</select>
	<resultMap type="com.atguigu.mybatis.bean.Employee" id="PageEmp">
		<id column="EMPLOYEE_ID" property="id"/>
		<result column="LAST_NAME" property="email"/>
		<result column="EMAIL" property="email"/>
	</resultMap>

  

 

查询

/**
	 * oracle分页:
	 * 		借助rownum:行号;子查询;
	 * 存储过程包装分页逻辑
	 * @throws IOException 
	 */
	@Test
	public void testProcedure() throws IOException{
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		SqlSession openSession = sqlSessionFactory.openSession();
		try{
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			OraclePage page = new OraclePage();
			page.setStart(1);
			page.setEnd(5);
			mapper.getPageByProcedure(page);
			
			System.out.println("总记录数:"+page.getCount());
			System.out.println("查出的数据:"+page.getEmps().size());
			System.out.println("查出的数据:"+page.getEmps());
		}finally{
			openSession.close();
		}
		
	}

  

关于如何使用MyBatis将对象的Java列表传递给Oracle存储过程?mybatis传入list对象的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c# – 如何使用Entity Framework 6将数据列表传递给存储过程、Java Oracle存储过程问题、java 调用 oracle存储过程、JavaEE——Mybatis(20)--MyBatis 实用场景 3. 存储过程的相关信息,请在本站寻找。

本文标签: