plsql之存储过程的调用和执行

来源:互联网 发布:帕特里克莫迪亚诺 知乎 编辑:程序博客网 时间:2024/05/22 04:53
  1. 存储过程  
  2. 1 什么是存储过程?  
  3.     用于在数据库中完成特定的操作或者任务。是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用。  
  4.   
  5. 2 存储过程的参数模式  
  6.   
  7.   
  8. 存储过程的参数特性:  
  9.     IN类型的参数 OUT类型的参数    IN-OUT类型的参数  
  10. 值被  传递给子程序  返回给调用环境 传递给子程序  
  11. 返回给调用环境  
  12. 参数形式    常量  未初始化的变量 初始化的变量  
  13. 使用时 默认类型    必须明确指定  必须明确指定  
  14.   
  15.   
  16. 3 无参数存储过程的使用:  
  17. CREATE  OR  REPLACE  PROCEDURE  过程名  [(parameter,...)]  
  18. IS  
  19. 定义变量  
  20. Begin  
  21. Plsql程序  
  22. End;  
  23.   
  24. 例:创建一个存储过程,用于向数据库中插入一条记录。  
  25. 第一步:创建  
  26. CREATE  OR  REPLACE  PROCEDURE  pro_1  
  27. IS  
  28. Begin  
  29.   insert into person values (11,'aa','aav');  
  30. End;  
  31.   
  32. 第二步:在sql*plus中执行该过程  
  33. exec pro_1;  
  34.   
  35. 第三步:通过JDBC使用存储过程。  
  36.     private Connection conn = null;  
  37.     private ResultSet rs = null;  
  38.     private CallableStatement state = null;  
  39.     //调用一个无参数的存储过程  
  40.     public void testPro()  
  41.     {  
  42.         conn = Tools.getConnection();  
  43.         try {  
  44.             state = conn.prepareCall("{call pro_1}");  
  45.             state.execute();  
  46.         } catch (Exception e) {  
  47.             // TODO Auto-generated catch block  
  48.             e.printStackTrace();  
  49.         }  
  50.     }  
  51.   
  52.   
  53. 4 带有IN类型参数的存储过程的使用。  
  54. 例:创建一个存储过程,用于向数据库中插入一条记录。  
  55. 第一步:创建  
  56. CREATE  OR  REPLACE  PROCEDURE  pro_2(id number,name varchar2,email varchar2)  
  57. IS  
  58. Begin  
  59.   insert into person values (id,name,email);  
  60. End;  
  61. 第二步:在sql*plus中执行该过程  
  62. exec pro_2(12,'aaa','aaa');  
  63.   
  64. 第三步:通过JDBC使用存储过程。  
  65.     //使用一个带有 IN 类型参数的存储过程  
  66.     public void testPro_in(int id,String name,String email)  
  67.     {  
  68.         conn = Tools.getConnection();  
  69.         try {  
  70.             state = conn.prepareCall("{call pro_2(?,?,?)}");  
  71.             state.setLong(1, id);  
  72.             state.setString(2, name);  
  73.             state.setString(3, email);  
  74.             state.execute();  
  75.         } catch (Exception e) {  
  76.             // TODO Auto-generated catch block  
  77.             e.printStackTrace();  
  78.         }  
  79.     }  
  80.   
  81. 5 带有out类型参数的存储过程的使用。  
  82. 例:创建一个存储过程,用于返回数据库中的Person表的总行数。  
  83.   
  84. 第一步:创建  
  85. CREATE  OR  REPLACE  PROCEDURE  pro_3(num out number)  
  86. IS  
  87. mynum number;  
  88. Begin  
  89.   select count(*) into mynum from person;  
  90.   num := mynum;  
  91. End;  
  92. 或者  
  93. CREATE  OR  REPLACE  PROCEDURE  pro_3(num out number)  
  94. IS  
  95. Begin  
  96.   select count(*) into num from person;  
  97. End;  
  98.   
  99. 第二步:在sql*plus中执行该过程  
  100. declare   
  101. a number;  
  102. begin  
  103.   pro_3(a);  
  104.   dbms_output.put_line(a);  
  105. end;  
  106.   
  107. 第三步:通过JDBC使用存储过程。  
  108. public void testPro_out()  
  109.     {  
  110.         conn = Tools.getConnection();  
  111.         try {  
  112.             state = conn.prepareCall("{call pro_3(?)}");  
  113.             state.registerOutParameter(1, Types.NUMERIC);  
  114.             state.execute();  
  115.             int num = state.getInt(1);  
  116.             System.out.println(num);  
  117.         } catch (Exception e) {  
  118.             // TODO Auto-generated catch block  
  119.             e.printStackTrace();  
  120.         }  
  121.     }   
  122.   
  123. 6 带有in-out类型参数的存储过程的使用。  
  124. 创建:  
  125. CREATE  OR  REPLACE  PROCEDURE  pro_4(num in out number)  
  126. IS  
  127. a number := 100;  
  128. Begin  
  129.   num := a*num;  
  130. End;  
  131.   
  132. 在sql*plus中执行该过程  
  133. declare  
  134.   a number := 12;  
  135. begin  
  136.   pro_4(a);  
  137.   dbms_output.put_line(a);  
  138. end;  
  139.  

原创粉丝点击