📜  SQL | PLSQL 中的过程(1)

📅  最后修改于: 2023-12-03 15:20:15.982000             🧑  作者: Mango

SQL | PLSQL 中的过程

1. 简介

在 SQL | PLSQL 中,过程是一组预定义的 SQL 语句,用于执行特定的任务,并返回所有的数据结果。过程又称为存储过程,可以被多次调用,提高了 SQL 语句的重用性和可维护性。

2. 创建过程

使用 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;
/
3. 调用过程

使用 EXECUTE 命令来执行过程。

EXECUTE procedure_name (argument_1, argument_2);

以下是调用上述过程的例子:

EXECUTE get_employee_info(100);
4. 过程参数

过程可以有零个或多个参数,分别用于输入、输出或输入/输出。

4.1 输入参数

输入参数是过程接受的值,可以用于查询或者其它操作。输入参数可以有单个或多个。

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;
/
4.2 输出参数

输出参数是过程返回的值,可以用于传递数据给调用者。输出参数只能有一个。

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;
/
4.3 输入/输出参数

输入/输出参数是既可以被读取也可以被写入的参数,为调用者和被调用程序之间提供了双向通信。可以有一个或多个。

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;
/
5. 插入数据

可以使用过程插入数据到表中。

以下是插入数据的例子:

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);
6. 更新数据

可以使用过程更新表中的数据。

以下是更新数据的例子:

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);
7. 删除数据

可以使用过程删除表中的数据。

以下是删除数据的例子:

CREATE PROCEDURE delete_employee_data (employee_id NUMBER)
IS
BEGIN
  DELETE FROM employees WHERE employee_id = employee_id;
END;
/

调用该过程:

EXECUTE delete_employee_data(100);
8. 使用游标

游标(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;
/
9. 调试过程

使用 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);