目录
- 使用流程
- 经典案例
使用流程
Oracle函数是一段可重用的代码,可以接受一个或多个参数并返回一个值。您可以使用Oracle函数来执行特定的计算、转换或查询操作,并将结果返回给调用程序。下面是使用Oracle函数的一些示例:
- 创建函数
CREATE OR REPLACE FUNCTION calculate_area(radius NUMBER) RETURN NUMBER ISpi NUMBER := 3.14;area NUMBER;
BEGINarea := pi * radius * radius;RETURN area;
END;
这个函数用于计算圆的面积,接受一个参数radius(半径),并返回一个值area(面积)。
2. 调用函数
SELECT calculate_area(5) FROM dual;
使用SELECT语句调用函数,并将结果输出到屏幕上。在这个例子中,函数被调用并传递了一个参数5,函数返回该圆的面积,即78.5。
3. 嵌套函数
CREATE OR REPLACE FUNCTION calculate_volume(radius NUMBER, height NUMBER) RETURN NUMBER ISvolume NUMBER;
BEGINvolume := calculate_area(radius) * height;RETURN volume;
END;
这个函数用于计算圆柱体的体积,接受两个参数radius(半径)和height(高度),并调用了上面创建的calculate_area函数来计算底面积。
4. 使用函数计算列值
SELECT order_id, calculate_total(order_id) as total FROM orders;
在这个例子中,使用函数calculate_total来计算订单的总价,并将结果作为新列total输出到屏幕上。
以上是Oracle函数的一些基本用法。请注意,在使用前需要先创建函数,并确保在调用函数时传递正确的参数。
经典案例
CHECK_EXAM_LESSON
CREATE OR REPLACE FUNCTION "CHECK_EXAM_LESSON" (v_studentId IN NUMBER) RETURN NUMBER ASv_examcount NUMBER := 0;v_subject VARCHAR2(20); -- 添加变量声明
BEGINIF v_subject IS NULL THENSELECT NVL(COUNT(l.id), 0)INTO v_examcountFROM tb_jp_student_lesson lWHERE l.student_id = v_studentIdAND l.recnum LIKE '999%'AND (l.status = '有效' OR l.status = '待审核')AND l.sync_status <> '2'AND (l.sync_result IS NULL OR l.sync_result NOT LIKE '%延迟上传%');ELSESELECT NVL(COUNT(l.id), 0)INTO v_examcountFROM tb_jp_student_lesson lWHERE l.student_id = v_studentIdAND l.subject = v_subjectAND l.recnum LIKE '999%'AND (l.status = '有效' OR l.status = '待审核')AND l.sync_status <> '2'AND (l.sync_result IS NULL OR l.sync_result NOT LIKE '%延迟上传%');END IF;RETURN v_examcount;
END CHECK_EXAM_LESSON;
QUERYTOTALXS
CREATE OR REPLACE FUNCTION QUERYTOTALXS
(v_studentbh IN NUMBER,v_equipbh IN NUMBER,v_starttime IN VARCHAR2,v_endtime IN VARCHAR2
)
RETURN NUMBER ASResult NUMBER;
BEGINSELECT COUNT(*)INTO ResultFROM tb_jp_lession_info lWHERE l.student_bh = v_studentbhAND l.equip_id = v_equipbhAND l.upload_time >= TO_DATE(v_starttime, 'yyyy-mm-dd hh24:mi:ss')AND l.upload_time <= TO_DATE(v_endtime, 'yyyy-mm-dd hh24:mi:ss');RETURN Result;
END QUERYTOTALXS;