📅  最后修改于: 2023-12-03 15:20:15.982000             🧑  作者: Mango
在 SQL | PLSQL 中,过程是一组预定义的 SQL 语句,用于执行特定的任务,并返回所有的数据结果。过程又称为存储过程,可以被多次调用,提高了 SQL 语句的重用性和可维护性。
使用 CREATE PROCEDURE
命令来创建过程,使用 DROP PROCEDURE
来删除过程。
CREATE PROCEDURE procedure_name (argument_1 data_type_1, argument_2 data_type_2)
IS
-- 变量定义
BEGIN
-- SQL 语句
END;
/
命令解释:
procedure_name
:过程名。argument_1
:输入参数名。data_type_1
:输入参数数据类型。argument_2
:输出参数名。data_type_2
:输出参数数据类型。以下是创建一个简单过程的例子:
CREATE PROCEDURE get_employee_info (employee_id NUMBER)
IS
emp_name VARCHAR2(50);
BEGIN
SELECT employee_name INTO emp_name FROM employees WHERE employee_id = employee_id;
DBMS_OUTPUT.PUT_LINE('The employee name is: ' || emp_name);
END;
/
使用 EXECUTE
命令来执行过程。
EXECUTE procedure_name (argument_1, argument_2);
以下是调用上述过程的例子:
EXECUTE get_employee_info(100);
过程可以有零个或多个参数,分别用于输入、输出或输入/输出。
输入参数是过程接受的值,可以用于查询或者其它操作。输入参数可以有单个或多个。
argument_name [IN] data_type;
以下是一个带有输入参数的例子:
CREATE PROCEDURE get_employee_info(IN employee_id NUMBER)
IS
BEGIN
SELECT employee_name FROM employees WHERE employee_id = employee_id;
END;
/
输出参数是过程返回的值,可以用于传递数据给调用者。输出参数只能有一个。
argument_name OUT data_type;
以下是一个带有输出参数的例子:
CREATE PROCEDURE get_employee_name(employee_id NUMBER, employee_name OUT VARCHAR2)
IS
BEGIN
SELECT employee_name INTO employee_name FROM employees WHERE employee_id = employee_id;
END;
/
输入/输出参数是既可以被读取也可以被写入的参数,为调用者和被调用程序之间提供了双向通信。可以有一个或多个。
argument_name IN OUT data_type;
以下是一个带有输入/输出参数的例子:
CREATE PROCEDURE add_employee(IN OUT employee_data employee_type)
IS
BEGIN
INSERT INTO employees VALUES employee_data;
employee_data.employee_id := employees_seq.NEXTVAL;
END;
/
可以使用过程插入数据到表中。
以下是插入数据的例子:
CREATE PROCEDURE insert_employee_data (employee_name VARCHAR2, salary NUMBER)
IS
BEGIN
INSERT INTO employees (employee_name, salary) VALUES (employee_name, salary);
END;
/
调用该过程:
EXECUTE insert_employee_data('Tom', 3000);
可以使用过程更新表中的数据。
以下是更新数据的例子:
CREATE PROCEDURE update_employee_data (employee_id NUMBER, salary NUMBER)
IS
BEGIN
UPDATE employees SET salary = salary WHERE employee_id = employee_id;
END;
/
调用该过程:
EXECUTE update_employee_data(100, 5000);
可以使用过程删除表中的数据。
以下是删除数据的例子:
CREATE PROCEDURE delete_employee_data (employee_id NUMBER)
IS
BEGIN
DELETE FROM employees WHERE employee_id = employee_id;
END;
/
调用该过程:
EXECUTE delete_employee_data(100);
游标(Cursor)是指向结果集的指针,可以通过它遍历结果集。
CREATE PROCEDURE procedure_name(argument_1 data_type_1, argument_2 data_type_2)
IS
-- 变量定义
CURSOR cursor_name IS SELECT column_1, column_2 FROM table_name;
variable_1 data_type_1;
variable_2 data_type_1;
BEGIN
-- 获取游标
OPEN cursor_name;
-- 遍历游标
LOOP
FETCH cursor_name INTO variable_1, variable_2;
EXIT WHEN cursor_name%NOTFOUND;
-- SQL 语句
END LOOP;
-- 关闭游标
CLOSE cursor_name;
END;
/
使用 DBMS_OUTPUT.PUT_LINE
进行调试。该函数将会把一些输出放入一个缓存区中,稍后可以在应用程序中打印出来。
以下是一个调试过程的例子:
CREATE PROCEDURE insert_employee_data (employee_name VARCHAR2, salary NUMBER)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Inserting employee data...');
INSERT INTO employees (employee_name, salary) VALUES (employee_name, salary);
DBMS_OUTPUT.PUT_LINE('Employee data added successfully!');
END;
/
调用该过程:
EXECUTE insert_employee_data('Tom', 3000);