数据库ORACLE 10g:
1.创建Type
CREATE OR REPLACE TYPE P_TYPE_TEST AS OBJECT( P_ID VARCHAR2(50), P_NAME VARCHAR2(50), P_DES VARCHAR2(1000) ) CREATE OR REPLACE TYPE P_TYPE_TEST_LIST AS TABLE OF P_TYPE_TEST
2.创建存储过程
CREATE OR REPLACE PROCEDURE P_TEST ( I_PARAM IN VARCHAR2, O_STR OUT VARCHAR2, O_CURSOR OUT SYS_REFCURSOR, O_TYPE OUT P_TYPE_TEST_LIST ) AS BEGIN SELECT COUNT(*) INTO O_STR FROM STA_REQ_DETAIL; OPEN O_CURSOR FOR SELECT ROWNUM ,A.* FROM STA_REQ_DETAIL A WHERE ROWNUM<=10; O_TYPE := P_TYPE_TEST_LIST(); FOR O IN (SELECT M.INSTR_REF_NO,M.BEARER_REG_FLAG,M.INSTR_GROUP FROM STA_APP_INSTR_MAST M WHERE ROWNUM <=10) LOOP DBMS_OUTPUT.PUT_LINE(O.INSTR_REF_NO); O_TYPE.EXTEND; O_TYPE(O_TYPE.COUNT) := P_TYPE_TEST ( O.INSTR_REF_NO, O.BEARER_REG_FLAG, O.INSTR_GROUP ); END LOOP; END;
3.Java 代码调用,对字符,游标,Array的处理
package com; import java.sql.Array; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import oracle.jdbc.driver.OracleTypes; public class Test { private Connection conn; private Statement statement; public static final String ORACLE_DRIVER="oracle.jdbc.driver.OracleDriver"; public static final String ORACLE_URL="jdbc:oracle:thin:@127.0.0.1:1521:testdb"; public static final String ORACLE_USERNAME="username"; public static final String ORACLE_PASSWORD="password"; public Test(){ try{ Class.forName(ORACLE_DRIVER); conn =DriverManager.getConnection(ORACLE_URL,ORACLE_USERNAME,ORACLE_PASSWORD); conn.setAutoCommit(false); statement = conn.createStatement(); }catch (Exception e) { System.err.println("ERROR-ConnectDB:"); e.printStackTrace(); } } public void close(){ try{ if(statement!=null){ statement.close(); } if(conn!=null){ conn.close(); } }catch(SQLException e){ System.err.println("ERROR-close:"); e.printStackTrace(); } } public void callPrepare(){ CallableStatement callstmt = null; try { callstmt = conn.prepareCall("{ call P_TEST(?, ?, ?, ?) }"); callstmt.setString(1, "test"); callstmt.registerOutParameter(2, OracleTypes.VARCHAR); callstmt.registerOutParameter(3, OracleTypes.CURSOR); callstmt.registerOutParameter(4, OracleTypes.ARRAY,"P_TYPE_TEST_LIST"); callstmt.execute(); //获取字符 String c = callstmt.getString(2); System.out.println(c); //获取游标 ResultSet res = (ResultSet)callstmt.getObject(3); while(res.next()){ System.err.println(res.getString(2)+" "+res.getString(3)); } //获取数组 Array ary = callstmt.getArray(4); Object[] os = (Object[])ary.getArray(); for(int i=0;i<os.length;i++){ oracle.sql.STRUCT struct = (oracle.sql.STRUCT)os[i]; Object obj[] = struct.getAttributes(); for(Object attr : obj){ System.out.print(attr+" "); } System.out.println(); } } catch (Exception e) { System.err.println("ERROR-callPrepare:"); e.printStackTrace(); } } public static void main(String[] args) { Test test = new Test(); try{ System.err.println("**********************"); test.callPrepare(); test.close(); System.err.println("**********************"); }catch (Exception e) { e.printStackTrace(); } } }
相关推荐
在Java编程中,调用Oracle数据库的存储过程并获取返回的结果集是一项常见的任务。这个例子展示了如何处理返回Record类型和Cursor类型的存储过程。Record类型在Oracle中是一种自定义的数据结构,可以用来模拟类似...
如果存储过程返回了游标,可以通过`(OracleCallableStatement)stmt.getCursor(2)`获取结果集`ResultSet`。然后遍历`ResultSet`,使用`getString()`等方法读取每一行的数据。 7. **异常处理**: 使用`try-catch-...
这种模式在.NET应用程序中调用Oracle存储过程返回记录集时非常常见,它使得在数据库层处理数据变得更加高效且易于管理。同时,游标变量提供了更高的灵活性,能够适应不同的查询需求,而不仅仅局限于预定义的查询。
Ref Cursor是PL/SQL中的一个重要概念,它允许存储过程返回动态查询的结果。此外,PL/SQL中创建序列的方式是`CREATE SEQUENCE`,不同于T-SQL中的`identity()`。 Package的编写通常包括两部分:规范(Specification)...
本篇文档主要介绍了如何通过存储过程返回结果集,分为两种方式:过程返回记录集和函数返回记录集。 1. 过程返回记录集: 在Oracle中,可以通过OUT参数来让存储过程返回一个结果集。这里使用了REF CURSOR类型,它是...
在SQL Server中调用Oracle存储过程是数据库间交互的一个常见需求,这允许用户在不同的数据库管理系统之间共享数据和逻辑。本篇文章将详细讲解如何在SQL Server中通过Linked Server执行Oracle的存储过程。 首先,...
Oracle PL/SQL是Oracle数据库系统中的过程式编程语言,它扩展了SQL的功能,使得开发者能够创建复杂的业务逻辑和数据处理程序。在这个“整理:Oracle PL/SQL 入门+数组使用+游标+动态SQL”文档中,我们将深入探讨这四...
- 返回列表的存储过程:通常涉及游标处理,需要在Java代码中进行迭代。 5. **在存储过程中做简单动态查询** - 本地动态SQL允许在PL/SQL中构建SQL字符串,然后通过`EXECUTE IMMEDIATE`执行。这种方式适用于需要...
在Oracle中,存储过程有多种类型,包括简单过程、带参数的过程、带有结果集的过程(游标)、带有异常处理的过程等。例如,你可以创建一个带参数的存储过程来处理特定的输入数据: ```sql CREATE OR REPLACE ...
Oracle 存储过程是数据库管理中的重要组成部分,它是一组为了完成特定功能的SQL语句集,被编译后存储在数据库中,可以被多次调用。本篇将深入探讨Oracle存储过程的基础知识、语法、常见问题以及如何通过Java进行调用...
### Groovy将JDBC中Oracle存储过程游标转换为多层JSON 在本文档中,我们将探讨如何使用Groovy脚本结合JDBC技术从Oracle存储过程中获取数据,并将其转换为多层JSON格式。该方法特别适用于需要从XML输入中提取数据并...
4. **Hibernate调用Oracle存储过程**:ORM框架如Hibernate可以调用存储过程,分为无返回值、有返回值和返回列表的存储过程。无返回值的过程直接调用,有返回值的过程通过`CallableStatement`的`registerOutParameter...
以下是对Oracle存储过程语法的详细解析: 1. **创建存储过程**: 使用`CREATE OR REPLACE PROCEDURE`语句来创建或替换已存在的存储过程。例如: ```sql CREATE OR REPLACE PROCEDURE 存储过程名 IS BEGIN ...
文档最后讨论了存储过程中的参数传递问题,建议直接在存储过程中处理和返回数据,而不是简单地将参数赋值给局部变量,除非需要进行数据类型转换或其他处理。存储过程的价值在于其能封装复杂的逻辑并返回有意义的结果...
总的来说,ASP.NET中调用Oracle存储过程需要配置数据库连接,创建命令对象,设置参数,执行存储过程,并处理返回的数据。存储过程的使用能够提高程序的效率,简化代码结构,并提供了一种在数据库层面管理复杂业务...
**用Java调用Oracle存储过程** 1. **无返回值的存储过程** 调用时通常使用`CallableStatement`,设置SQL语句为`{call procedure_name(?, ?)}`,然后设置参数并执行。 2. **有返回值的存储过程(非列表)** 如果...
对于Java开发者,调用Oracle存储过程是常见的任务。无返回值的存储过程只需通过CallableStatement调用,无需设置返回参数。有返回值的存储过程可以设置OUT参数接收结果,非列表类型可以直接处理。返回列表的情况通常...
- 参数:存储过程定义时声明的变量,用于接收调用者的输入或返回结果给调用者。 3. 规范内容 3.1. 命名规范 - 存储过程名称应清晰反映其功能,采用动宾结构,如`GetEmployeeDetails`,避免使用模糊或通用的名称。 -...
### ORACLE存储过程学习知识点详解 ...以上内容涵盖了Oracle存储过程的基础知识和常用操作方法,希望对初学者有所帮助。在实际应用中,可以根据具体需求灵活运用这些技术来构建高效可靠的数据库应用程序。