举例oracle中定义函数
时间: 2023-12-03 17:03:42 浏览: 72
好的,举例Oracle中定义函数:
CREATE FUNCTION get_total_sales (p_month IN NUMBER, p_year IN NUMBER)
RETURN NUMBER
AS
total_sales NUMBER;
BEGIN
SELECT SUM(sales_amount)
INTO total_sales
FROM sales
WHERE EXTRACT(MONTH FROM sales_date) = p_month
AND EXTRACT(YEAR FROM sales_date) = p_year;
RETURN total_sales;
END;
这个函数接受两个数字参数:p_month 和 p_year,并返回总销售额。它通过查询表sales来计算总销售额,然后将结果存储在变量total_sales中,最后返回这个变量。
相关问题
oracle中 视图带with还有哪些功能?举例说明
除了可以使用WITH语句定义视图的查询语句之外,Oracle中的视图还有以下功能:
1. 虚拟列:可以通过在SELECT语句中定义虚拟列来为视图添加新的列。
例如,我们可以创建一个包含员工姓名和工资的视图,并在其中添加一个虚拟列用于计算员工工资的增长率:
```
CREATE VIEW emp_salary AS
WITH emp_data AS (
SELECT employee_name, salary, hire_date,
LAG(salary) OVER (PARTITION BY employee_name ORDER BY hire_date) AS prev_salary
FROM employees
)
SELECT employee_name, salary, prev_salary,
(salary - prev_salary) / prev_salary AS salary_growth_rate
FROM emp_data;
```
2. 行级安全:可以通过在WHERE子句中添加限制条件来限制视图的返回结果,从而实现行级安全性。
例如,我们可以创建一个只返回当前用户所属部门的员工信息的视图:
```
CREATE VIEW emp_dept AS
WITH dept_data AS (
SELECT department_id FROM departments WHERE department_name = USER
)
SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM dept_data);
```
3. 列级安全:可以通过在SELECT语句中只返回部分列来限制用户对敏感信息的访问。
例如,我们可以创建一个只返回员工姓名和雇用日期的视图:
```
CREATE VIEW emp_name_hiredate AS
SELECT employee_name, hire_date FROM employees;
```
4. 实时汇总:可以通过在SELECT语句中使用SUM、AVG等聚合函数来实时汇总数据。
例如,我们可以创建一个每天返回当天订单总额的视图:
```
CREATE VIEW daily_sales AS
SELECT TRUNC(order_date) AS order_day, SUM(order_total) AS total_sales
FROM orders
GROUP BY TRUNC(order_date);
```
举例,Oracle自定义类型中含constructor、map,static,member的
好的,我可以给你一个简单的例子:
```sql
CREATE TYPE Person AS OBJECT (
name VARCHAR2(20),
age NUMBER,
STATIC FUNCTION getCount RETURN NUMBER,
MEMBER FUNCTION print RETURN VARCHAR2
) NOT FINAL;
CREATE OR REPLACE TYPE BODY Person AS
STATIC count NUMBER := 0;
STATIC FUNCTION getCount RETURN NUMBER IS
BEGIN
RETURN count;
END;
MEMBER FUNCTION print RETURN VARCHAR2 IS
BEGIN
RETURN 'Name: ' || name || ', Age: ' || age;
END;
CONSTRUCTOR FUNCTION Person(name VARCHAR2, age NUMBER) RETURN SELF AS RESULT IS
BEGIN
SELF.name := name;
SELF.age := age;
count := count + 1;
RETURN;
END;
END;
/
```
这个例子中,定义了一个自定义类型 `Person`,含有一个带有 `VARCHAR2` 和 `NUMBER` 参数的构造函数 `Person`,以及一个成员函数 `print`。另外还有一个静态成员变量 `count` 和一个静态成员函数 `getCount`,用于统计 `Person` 类的实例数量。然后可以通过创建多个 `Person` 实例来演示该类型的使用,例如:
```sql
DECLARE
people PersonList := PersonList();
BEGIN
people.EXTEND(3);
people(1) := Person('Tom', 20);
people(2) := Person('Jerry', 18);
people(3) := Person('Alice', 22);
DBMS_OUTPUT.PUT_LINE('Number of people: ' || Person.getCount());
FOR i IN 1..people.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || i || ', ' || people(i).print());
END LOOP;
END;
```
在这个例子中,利用 `Person` 类型创建了一个 `PersonList` 容器,并向其中添加了三个 `Person` 实例。然后利用 `FOR` 循环遍历容器,输出每个实例的信息。
阅读全文