oracle 存储过程和函数

  1. --子程序   
  2. /*   
  3.   子程序是被命名的PL/SQL块,可以带参数,多次被调用,模块化   
  4.   过程&&函数   
  5.   过程:执行特定操作   
  6.   函数:返回特定数据   
  7.      
  8.   定义:   
  9.   CREATE [OR REPLACEPROCEDURE procedure_name(argument [mode] datatype...)   
  10.   IS|AS  
  11.   --这里可以声明一些变量,相当于declare块,不过没有declare关键字   
  12.   BEGIN  
  13.      statement...   
  14.   END;   
  15.   -------******-------   
  16.       procedure_name 过程名   
  17.       argument 参数名   
  18.       mode 参数类型, IN 输入参数 || OUT 输出参数 ||IN OUT . 默认是输入参数   
  19.       datatype 参数类型 ,不需要指定长度   
  20.        
  21. */   
  22. --不带参数   
  23. CREATE OR REPLACE PROCEDURE p_time   
  24. IS  
  25. BEGIN  
  26.    dbms_output.put_line(sysdate);   
  27. END;   
  28. --调用   
  29. call p_time();   
  30.   
  31.   
  32. --默认IN型参数   
  33. CREATE OR REPLACE PROCEDURE emp_1(num int)   
  34. AS  
  35.    v_name emp.ename%type;   
  36.    v_deptno emp.deptno%type;   
  37. BEGIN  
  38.    IF num<10000 THEN--根据传入的参数,是否执行查询   
  39.       select ename,deptno into v_name,v_deptno from emp where emp.empno=num;   
  40.       dbms_output.put_line(v_name||'--'||v_deptno);   
  41.    ELSE    
  42.       dbms_output.put_line('too big');   
  43.    END IF;   
  44. END;   
  45. --调用   
  46. BEGIN  
  47.    emp_1(77880);   
  48. END;   
  49.   
  50.   
  51. --明确定义参数模式   
  52. /*   
  53.    IN      read-only :pass values into 相当于一个常量   
  54.    OUT     write-only :pass values back 相当于一个变量   
  55.    IN OUT  read/write   
  56. */   
  57. CREATE OR REPLACE PROCEDURE emp_count_1(v_deptid IN int,v_count OUT int)--一个IN,一个OUT   
  58. IS  
  59. BEGIN  
  60.   select count(emp.empno) into v_count from emp where emp.deptno=v_deptid;   
  61.   dbms_output.put_line(v_count);   
  62. END;   
  63. --调用   
  64. DECLARE    
  65.    v_count int;   
  66. BEGIN  
  67.    --传递OUT类型的参数是传递一个类型相符的变量,因为out的类型的是要作为输出的,所以需要具体的变量来存放   
  68.    emp_count_1(10,v_count);   
  69.    --传递参数默认按定义顺序,但也可以如下按照参数名称   
  70.    emp_count_1(v_count=>v_count,v_deptid => 10);   
  71.    --当然也可以两种方式混合使用   
  72.    emp_count_1(10,v_count => v_count);   
  73. END;   
  74.   
  75. --感觉out的参数很麻烦的,还不如在过程内直接定义一个变量   
  76. CREATE OR REPLACE PROCEDURE emp_count_2(v_deptid IN INT)   
  77. IS  
  78.    v_count int;   
  79. BEGIN  
  80.    select count(emp.empno) into v_count from emp where emp.deptno=v_deptid;   
  81.    dbms_output.put_line(v_count);   
  82. END;   
  83. --调用   
  84. BEGIN  
  85.    emp_count_2(10);   
  86. END;   
  87.   
  88. --过程调用过程   
  89. CREATE OR REPLACE PROCEDURE p_main   
  90. IS  
  91. BEGIN--调用上面定义的两个过程   
  92.    p_time();   
  93.    emp_count_2(10);   
  94. END;     
  95. --调用   
  96. BEGIN  
  97.    p_main();   
  98. END;   
  99.   
  100.   
  101.   
  102. --函数   
  103. /*   
  104.  有返回值,其它的和过程差不多   
  105.     
  106.  CREATE [OR REPLACEFUNCTION function_name(argument [mode] datatype...)   
  107.  RETURN datatype --返回类型必须   
  108.  IS|AS  
  109.  [variable datatype...]   
  110.  BEGIN  
  111.      statement...   
  112.      Pl/SQL块中必须要有一条return语句   
  113.  END;   
  114. */   
  115.   
  116. --   
  117. CREATE OR REPLACE FUNCTION get_name(u_id IN intRETURN varchar2   
  118. AS  
  119.    v_name emp.ename%type;   
  120. BEGIN  
  121.    select ename into v_name from emp where emp.empno=u_id;   
  122.    RETURN v_name;   
  123. END;   
  124. --调用   
  125. DECLARE  
  126.    v_name emp.ename%type;   
  127.    v_job emp.job%type;   
  128. BEGIN  
  129.    v_name :=get_name(7788);--直接给变量赋值   
  130.    select job into v_job from emp where ename=get_name(7788) and rownum<2;--在查询语句中调用   
  131.    dbms_output.put_line(v_name);   
  132. END;   
  133.   
  134.   
  135. --返回record   
  136. CREATE OR REPLACE FUNCTION get_record(pno in number) RETURN emp%rowtype   
  137. IS  
  138.    v_record emp%rowtype;   
  139. BEGIN  
  140.   select *  into v_record from emp where empno=pno;   
  141.   return v_record;   
  142. END;   
  143.   
  144. --   
  145. DECLARE    
  146.    v_record emp%rowtype;   
  147. BEGIN  
  148.    v_record := get_record(7788);   
  149.    dbms_output.put_line(v_record.ename||'--'||v_record.job);   
  150. END;   
  151.   
  152. --如果一个函数没有参数,那么调用他的时候可以不用加()   
  153.   
  154.   
  155. --exp    
  156. CREATE OR REPLACE FUNCTION get_num(v_id in intRETURN INT  
  157. IS  
  158.  CURSOR v_cs is select count(empno) tt,max(empno) mx from emp where emp.deptno=v_id group by deptno;   
  159.  v_num v_cs%rowtype;   
  160. BEGIN  
  161.  OPEN v_cs;   
  162.  FETCH v_cs into v_num;   
  163.  dbms_output.put_line(v_num.tt||'--'||v_num.mx);   
  164.  close v_cs;   
  165.  RETURN v_num.tt;   
  166. END;   
  167. --   
  168. select get_num(10) from dual;   
  169.   
  170. --综合例子   
  171. --统计emp表中每个部门的人员   
  172. DECLARE  
  173.   --声明一个嵌套表用来存放要查询的部门编号   
  174.   TYPE v_array IS VARRAY(5) OF INT;   
  175.   v_arr v_array;   
  176.   --声明一个嵌套表用来存放每一个部门的员工名字   
  177.   TYPE v_list_type IS TABLE OF VARCHAR2(30);   
  178.   v_list v_list_type := v_list_type();   
  179.   --声明一个函数 根据部门查询统计该部门的员工总数和员工名字   
  180.   FUNCTION get_num(v_dpno IN INTRETURN v_list_type   
  181.   IS  
  182.     v_num INT;   
  183.     v_i int :=1;   
  184.     v_name varchar2(30);   
  185.     v_names v_list_type := v_list_type();   
  186.     TYPE v_cs_type IS REF CURSOR;   
  187.     v_cs v_cs_type;   
  188.        
  189.   BEGIN  
  190.     --统计员工总数   
  191.     select count(empno) into v_num from emp where emp.deptno= v_dpno;   
  192.     dbms_output.put_line('编号是:'||v_dpno||'的部门的员工数是:'||v_num);   
  193.     --查询该部门员工名字   
  194.     OPEN v_cs FOR select ename from emp where emp.deptno =v_dpno;   
  195.     LOOP   
  196.        FETCH v_cs into v_name;   
  197.        EXIT WHEN v_cs%NOTFOUND;   
  198.        v_names.EXTEND;   
  199.        v_names(v_i) :=v_name;   
  200.        v_i :=v_i+1;   
  201.     END LOOP;   
  202.     RETURN v_names;--返回查询的员工的结果集   
  203.   END;   
  204.      
  205. BEGIN  
  206.   v_arr :=v_array(10,20,30);   
  207.   FOR i in 1..v_arr.count LOOP   
  208.     v_list := get_num(v_arr(i));   
  209.     FOR j in 1..v_list.COUNT LOOP   
  210.        dbms_output.put_line(v_list(j));   
  211.     END LOOP;   
  212.   END LOOP;   
  213. END;   
  214. /*   
  215. --输出结果   
  216. 编号是:10的部门的员工数是:3   
  217. CLARK   
  218. KING   
  219. MILLER   
  220. 编号是:20的部门的员工数是:5   
  221. SMITH   
  222. JONES   
  223. SCOTT   
  224. ADAMS   
  225. FORD   
  226. 编号是:30的部门的员工数是:6   
  227. ALLEN   
  228. WARD   
  229. MARTIN   
  230. BLAKE   
  231. TURNER   
  232. JAMES   
  233. */   
  234.   
  235.   
  236.   
  237.   
  238.   
  239. --查看当前用户的过程和函数   
  240. select object_name,created,status from user_objects    
  241.      where object_type in('PROCEDURE','FUNCTION');   
  242.   
  243. --查看过程源代码   
  244. /*   
  245.  创建过程后,ORACLE将过程名,源代码及执行代码放到数据字典中。   
  246.  调用时,程序按照其执行代码直接执行,而不需要从新解析代码。   
  247.  所以使用子程序性能要优于执行SQL语句。数据字典表 USER_SOURCE   
  248. */   
  249.   
  250. select text from user_source where name ='EMP_1'--字符串要大写   
  251. --删除过程   
  252. --DROP PROCEDURE procedure_name; --procedure_name过程名字  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle存储过程函数是用PL/SQL语言编写的数据库对象,用于实现复杂的业务逻辑和数据处理。存储过程函数可以在数据库中进行定义和调用,提供了很大的灵活性和可重用性。 存储过程是一组SQL语句和控制结构的集合,可以接受输入参数并返回结果。它们可以用于执行常见的数据库操作,如插入、更新、删除数据,以及执行复杂的业务逻辑。存储过程可以在数据库中进行定义,并通过名称来调用执行。 函数是一个具有输入参数和返回值的可执行代码块。它们可以用于计算和返回单个值,例如数学运算、字符串处理或日期操作。函数可以在SQL查询中使用,并且可以像内置函数一样进行调用。 下面是一个示例存储过程的代码: ```sql CREATE OR REPLACE PROCEDURE get_employee_details (p_employee_id IN NUMBER, p_details OUT SYS_REFCURSOR) AS BEGIN OPEN p_details FOR SELECT * FROM employees WHERE employee_id = p_employee_id; END; ``` 上面的存储过程接受一个员工ID作为输入参数,并通过游标将该员工的详细信息返回给调用者。 下面是一个示例函数的代码: ```sql CREATE OR REPLACE FUNCTION calculate_salary_bonus (p_employee_id IN NUMBER, p_bonus_percentage IN NUMBER) RETURN NUMBER AS v_salary NUMBER; BEGIN SELECT salary INTO v_salary FROM employees WHERE employee_id = p_employee_id; RETURN v_salary * p_bonus_percentage / 100; END; ``` 上面的函数接受一个员工ID和奖金百分比作为输入参数,并返回计算后的奖金金额。 存储过程函数可以通过CREATE PROCEDURE和CREATE FUNCTION语句在Oracle数据库中进行定义。一旦定义好,它们可以通过名称进行调用,可以在其他存储过程函数或SQL查询中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值