函数用于返回特定数据。执行时得找一个变量接收函数的返回值
1 、一个最简单的自定义函数Fun_test1的定义
2、Fun_test1自定义函数的调用的存储过程Pro_Fun_test1_1示例
3、Fun_test1自定义函数的调用的存储过程Pro_Fun_test1_2示
Oracle 自定义函数是数据库开发中的重要工具,允许开发者创建具有特定功能的代码块,以便在查询或业务逻辑中重用。这些函数可以根据需求返回特定的数据类型,并可以通过 IN、OUT 或 IN OUT 参数接收和传递数据。
1. **创建自定义函数**:
创建自定义函数的基本语法如下:
```sql
CREATE OR REPLACE FUNCTION function_name (
argu1 [IN|OUT|IN OUT] datatype1,
argu2 [IN|OUT|IN OUT] datatype2,
...
) RETURN datatype IS
BEGIN
-- 函数体
END;
```
例如,创建一个名为 `get_user` 的函数,它不接受参数并返回当前用户的用户名:
```sql
CREATE OR REPLACE FUNCTION get_user RETURN VARCHAR2 IS
Result VARCHAR2(50);
BEGIN
SELECT username INTO Result FROM user_users;
RETURN(Result);
END get_user;
```
2. **调用自定义函数**:
调用函数时,需要一个变量来接收返回值。例如:
```sql
DECLARE
v1 VARCHAR2(100);
BEGIN
v1 := get_user();
DBMS_OUTPUT.PUT_LINE(v1);
END;
```
3. **带参数的函数**:
- **IN 参数**:函数接收但不修改的输入参数,如 `get_sal` 函数:
```sql
CREATE OR REPLACE FUNCTION get_sal(empname IN VARCHAR2) RETURN NUMBER IS
Result NUMBER;
BEGIN
SELECT sal INTO Result FROM emp WHERE ename = empname;
RETURN(Result);
END get_sal;
```
- **OUT 参数**:函数将结果写入的输出参数,如 `get_info` 函数:
```sql
CREATE OR REPLACE FUNCTION get_info(e_name VARCHAR2, job OUT VARCHAR2) RETURN NUMBER IS
Result NUMBER;
BEGIN
SELECT sal, job INTO Result, job FROM emp WHERE ename = e_name;
RETURN(Result);
END get_info;
```
- **IN OUT 参数**:函数既接收也修改的参数,如 `result` 函数:
```sql
CREATE OR REPLACE FUNCTION result(num1 NUMBER, num2 IN OUT NUMBER) RETURN NUMBER IS
v_result NUMBER(6);
v_remainder NUMBER;
BEGIN
v_result := num1 / num2;
v_remainder := MOD(num1, num2);
num2 := v_remainder;
RETURN(v_result);
EXCEPTION
WHEN zero_divide THEN
RAISE_APPLICATION_ERROR(-20000, '不能除 0');
END result;
```
4. **函数实例**:
- `Fun_test1` 是一个简单的自定义函数,根据输入参数 `p_1` 返回 1、0 或 -1:
```sql
CREATE OR REPLACE FUNCTION Fun_test1(p_1 NUMBER)
RETURN NUMBER
IS
BEGIN
IF p_1 > 0 THEN
RETURN 1;
ELSIF p_1 = 0 THEN
RETURN 0;
ELSE
RETURN -1;
END IF;
END Fun_test1;
```
- 可以创建一个存储过程 `Pro_Fun_test1_1` 来调用这个函数:
```sql
CREATE OR REPLACE PROCEDURE Pro_Fun_test1_1(p_num IN NUMBER, p_result OUT NUMBER) AS
BEGIN
p_result := Fun_test1(p_num);
END Pro_Fun_test1_1;
```
5. **存储过程调用**:
调用存储过程 `Pro_Fun_test1_1` 时,可以使用 `EXECUTE` 语句,并为 OUT 参数提供变量:
```sql
DECLARE
result_value NUMBER;
BEGIN
Pro_Fun_test1_1(5, result_value);
DBMS_OUTPUT.PUT_LINE('Result: ' || result_value);
END;
```
在实际应用中,自定义函数可以极大地提高代码的复用性和可维护性。通过结合 IN、OUT 和 IN OUT 参数,开发者可以创建灵活且适应性强的函数,以满足各种业务需求。此外,函数还可以与触发器、存储过程、包等其他数据库对象一起使用,构建复杂的数据库解决方案。