Oracle的存储过程(procedure)
创建
1 2 3 4 5 6 7 8 9 | --存储过程定义 create or replace procedure proce01(a in varchar2, b in out varchar2) as begin -- b := a + b; -- 会将 字符转换为数值 ,注意a为in,所以不能被赋值,这与c里的函数不同 b := a || b; dbms_output.put_line( 'a:' ||a|| ' b:' ||b); end proce01; |
执行
1 2 3 4 5 6 7 8 | -- 执行 declare a varchar2(20):= '01' ; b varchar2(20):= 'bg' ; begin proce01(a ,b); dbms_output.put_line( 'a:' ||a|| ' b:' ||b); end ; |
执行结果:
a:01 b:01bg
a:01 b:01bg
删除存储过程
1 2 | -- 删除存储过程 DROP PROCEDURE proce01 |
存储过程返回多条记录
Oracle 参照游标(SYS_REFCURSOR)使用
-- 创建 procedure create or replace procedure getResult(p_cursor out sys_refcursor) as begin open p_cursor for select * from user_info; end;
-- 使用存储过程
-- 使用存储过程 declare v_cursor sys_refcursor; u user_info%rowtype; begin getResult(v_cursor); loop fetch v_cursor into u.user_id, u.user_name,u.sex; exit when v_cursor%notfound; dbms_output.put_line(u.user_id||'-'||u.user_name||'-'||u.sex); end loop; end;
Java中调用存储过程
参考:java调用oracle存储过程返回多条结果集 - BorD的选择 - 博客园
package vip.yaocn.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; /** * 存储过程测试 * * @author yacon */ public class ProcedureTest { public static void main(String[] args) throws Exception { String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String driverName = "oracle.jdbc.driver.OracleDriver"; String username = "scott"; String password = "tiger"; Connection conn = null; CallableStatement cstmt = null; ResultSet rs = null; try { Class.forName(driverName); conn = DriverManager.getConnection(url, username, password); String callSql = "{call pack_myPackage.proc_getSomeInfo(?, ?) }"; cstmt = conn.prepareCall(callSql); cstmt.setString(1, "1001"); cstmt.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet) cstmt.getObject(2); if (rs != null) { while (rs.next()) { System.out.println(rs.getString(1)); } } } catch (Exception e) { e.printStackTrace(); } finally { try { if (rs != null) { rs.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (cstmt != null) { cstmt.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (conn != null) { conn.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义