Oracle调用带有out参数的存储过程

博客介绍在Oracle中调用存储过程的方法及数据提交策略。为提高开发自测效果,可通过SQL调用存储过程后不提交,先执行查询或其他存储过程,最后再提交或回滚数据。还给出了无out参数和有out参数存储过程的调用案例及说明。

当我们在oracle中写完一个存储过程,我们通常需要使用测试调用存储过程,调用测试之后,然后提交执行结果,就可以去数据库中执行sql,查看我们的存储过程执行的数据是否符合预期效果。

实际测试中,我们可能不希望直接提交数据,原因有如下两点:

  1. 很多时候我们写的存储过程或多或少有些问题,数据也不正确,不希望直接提交
  2. 一旦提交了,可能这条测试数据就被使用了,我们需要重新创造测试数据

因此,如何通过sql调用存储过程,然后不提交,接着执行我们的查询、或者执行其他存储过程,直到最后再提交或者回滚数据,可以提高我们开发完自测的效果,方便省事。

案例演示

案例一:调用不带有out参数的的存储过程(比较简单)
存储过程定义如下:

PROCEDURE P_TEST(V_PARAM_1 IN VARCHAR2, V_PARAM_2 IN VARCHAR2) IS

存储过程调用如下:

BEGIN
    P_TEST(‘1’,‘2’);
END;

案例二:调用带有out参数的存储过程
存储过程定义如下

PROCEDURE P_TEST(V_PARAM_1 IN VARCHAR2, V_PARAM_2 IN VARCHAR2,V_RESULT OUT VARCHAR2) IS

存储过程调用如下:

BEGIN
    DECLARE
        V_RESULT VARCHAR2(32); --定义一个和返回结果相同的参数类型
    BEGIN
        P_TEST(‘1’, ‘1’, V_RESULT); --调用存储过程
        DBMS_OUTPUT.PUT_LINE(V_RESULT); --把返回结果打印到输出区域
    END;
END;

案例说明

如下图,可以先执行中间红色框框里的存储过程,然后可以看到上边的框框里,执行完成后是数据是没有提交的,可以下最下面的红色框里添加自己的查询代码,这个时候查询到的数据,包含了存储过程执行的结果,等自己测试完毕了,可以选择回滚数据,这样即使自己的存储过程写的有问题,也不会污染数据,修改后可以重复测试。
在这里插入图片描述

Oracle调用有输出参数存储过程,不同的开发语言有不同的实现方式。以常见的几种语言为例: #### VB.NET 在VB.NET中调用Oracle输出参数存储过程,可参考以下示例代码: ```vbnet Imports System.Data.OleDb Module Module1 Sub Main() Dim conn As New OleDbConnection("YourConnectionString") Dim cmd As New OleDbCommand("YourStoredProcedureName", conn) cmd.CommandType = CommandType.StoredProcedure ' 输入参数 Dim inpara As New OleDbParameter("inputParamName", OleDbType.VarChar) inpara.Value = "inputValue" cmd.Parameters.Add(inpara) ' 输出参数 Dim outpara As New OleDbParameter("aaa", OleDbType.VarChar, 10) outpara.Direction = ParameterDirection.Output cmd.Parameters.Add(outpara) Try conn.Open() cmd.ExecuteNonQuery() Dim outputValue As String = outpara.Value.ToString() Console.WriteLine("Output value: " & outputValue) Catch ex As Exception Console.WriteLine("Error: " & ex.Message) Finally conn.Close() End Try End Sub End Module ``` 此代码中,首先创建了一个`OleDbConnection`对象来连接Oracle数据库,接着创建`OleDbCommand`对象并指定要调用存储过程。然后分别添加输入参数和输出参数,设置输出参数的方向为`ParameterDirection.Output`。执行存储过程后,可从输出参数中获取返回值。 #### Python(使用cx_Oracle库) ```python import cx_Oracle # 连接数据库 conn = cx_Oracle.connect('username/password@host:port/service_name') cursor = conn.cursor() # 定义存储过程名 procedure_name = 'YourStoredProcedureName' # 定义输入参数 input_param = 'inputValue' # 定义输出参数 output_param = cursor.var(cx_Oracle.STRING) # 调用存储过程 cursor.callproc(procedure_name, [input_param, output_param]) # 获取输出参数的值 output_value = output_param.getvalue() print(f"Output value: {output_value}") # 关闭游标和连接 cursor.close() conn.close() ``` 在Python中,使用`cx_Oracle`库连接Oracle数据库。创建游标后,定义输入参数和输出参数调用`callproc`方法执行存储过程,最后从输出参数中获取返回值。 #### Java(使用JDBC) ```java import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class OracleStoredProcedureCall { public static void main(String[] args) { String url = "jdbc:oracle:thin:@host:port:service_name"; String user = "username"; String password = "password"; try (Connection conn = DriverManager.getConnection(url, user, password)) { // 定义存储过程调用语句 String call = "{call YourStoredProcedureName(?, ?)}"; CallableStatement cstmt = conn.prepareCall(call); // 设置输入参数 cstmt.setString(1, "inputValue"); // 注册输出参数 cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); // 执行存储过程 cstmt.execute(); // 获取输出参数的值 String outputValue = cstmt.getString(2); System.out.println("Output value: " + outputValue); cstmt.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 在Java中,使用JDBC连接Oracle数据库。创建`CallableStatement`对象,设置输入参数,注册输出参数,执行存储过程后获取输出参数的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值