一、Oracle自定义函数
1、语法
2、示例
- create or replace function cvt_latlon_single(valstr in varchar2)
- return varchar2
- as
- degree varchar2(35 CHAR);
- minute varchar2(35 CHAR);
- seconds varchar2(35 CHAR);
- result varchar2(35 CHAR);
- begin
- degree := substr(valstr,instr(valstr,'°') - 1);
- minute := substr(valstr,'°') + 1,'′') - 1 - instr(valstr,'°'));
- seconds := substr(valstr,'′') + 1,'″') - 1 - instr(valstr,'′'));
- result := degree + trunc(minute * (1/60),10) + trunc(seconds * (1/3600),10) ;
- return result;
- end cvt_latlon_single;
二、Oracle存储过程
1、语法
- 1.基本结构
- CREATE OR REPLACE PROCEDURE 存储过程名字
- (
- 参数1 IN NUMBER,参数2 IN NUMBER
- ) IS
- 变量1 INTEGER :=0;
- 变量2 DATE;
- BEGIN
- END 存储过程名字
- 2.SELECT INTO STATEMENT
- 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
- 记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
- 例子:
- BEGIN
- SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
- EXCEPTION
- WHEN NO_DATA_FOUND THEN
- xxxx;
- END;
- ...
- 3.IF 判断
- IF V_TEST=1 THEN
- BEGIN
- do something
- END;
- END IF;
- 4.while 循环
- WHILE V_TEST=1 LOOP
- BEGIN
- XXXX
- END;
- END LOOP;
- 5.变量赋值
- V_TEST := 123;
- 6.用for in 使用cursor
- ...
- IS
- CURSOR cur IS SELECT * FROM xxx;
- BEGIN
- FOR cur_result in cur LOOP
- BEGIN
- V_SUM :=cur_result.列名1+cur_result.列名2
- END;
- END LOOP;
- END;
- 7.带参数的cursor
- CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
- OPEN C_USER(变量值);
- LOOP
- FETCH C_USER INTO V_NAME;
- EXIT FETCH C_USER%NOTFOUND;
- do something
- END LOOP;
- CLOSE C_USER;
- 8.用pl/sql developer debug
- 连接数据库后建立一个Test WINDOW
- 在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
2、示例
- /*不带任何参数存储过程(输出系统日期)*/
- create or replace procedure output_date is
- begin
- dbms_output.put_line(sysdate);
- end output_date;
- /*带参数in和out的存储过程*/
- create or replace procedure get_username(v_id in number,v_username out varchar2)
- as
- begin
- select username into v_username from tab_user where id = v_id; --变量赋值
- exception
- when no_data_found then
- raise_application_error(-20001,'ID不存在!');
- end get_username;
三、自定义函数与存储过程
1、函数和存储过程的优点
- 1、共同使用的代码可以只需要被编写一次,而被需要该代码的任何应用程序调用(.net,c++,java,也可以使DLL库)。
- 2、这种几种编写、几种维护更新、大家共享的方法,简化了应用程序的开发维护,提高了效率和性能。
- 3、这种模块化的方法使得一个复杂的问题、大的程序逐步简化成几个简单的、小的程序部分,进行分别编写,因此程序的结构更加清晰,简单,也容易实现。
- 4、可以在各个开发者之间提供处理数据、控制流程、提示信息等方面的一致性。
- 5、节省内存空间。它们以一种压缩的形式被存储在外存中,当被调用时才被放入内存进行处理。而且多个用户在调用同一个存储过程或函数时,只需要加载一次即可。
- 6、提高数据的安全性和完整性。通过把一些对数据的操作方到存储过程或函数中,就可以通过是否授予用户有执行该语句的权限,来限制某些用户对数据库进行这些操作。
2、函数和存储过程的区别
3、适用场合
参考地址:https://www.cnblogs.com/zhengcheng/p/4220924.html