文章目录
oracle:存储过程
一、存储过程的创建和调用(无参)
sql
--创建存储过程
CREATE OR REPLACE PROCEDURE test_procedure
IS
BEGIN
-- 在这里编写你的PL/SQL代码
DBMS_OUTPUT.PUT_LINE('Hello, World!');
END test_procedure;
sql
--调用存储过程
BEGIN
test_procedure;
END;
二、存储过程的创建和调用(有参)
sql
--包含参数的存储过程
CREATE OR REPLACE PROCEDURE test_param_procedure(
p_emp_id IN NUMBER,
p_emp_name IN VARCHAR2,
p_emp_salary OUT NUMBER
) IS
BEGIN
-- 为OUT参数赋值
p_emp_salary := 5000;
DBMS_OUTPUT.PUT_LINE(p_emp_id||p_emp_name||p_emp_salary);
END test_param_procedure;
sql
--调用带参数的存储过程
DECLARE
v_salary NUMBER;
BEGIN
test_param_procedure(101, 'John Doe', v_salary);
DBMS_OUTPUT.PUT_LINE('Employee Salary: ' || v_salary);
END;
三、存储过程异常捕获
将SQL内部故意修改错,方便测试异常:p_emp_salary := 5000/0;
sql
--包含参数的存储过程
CREATE OR REPLACE PROCEDURE test_param_procedure(
p_emp_id IN NUMBER,
p_emp_name IN VARCHAR2,
p_emp_salary OUT NUMBER
) IS
BEGIN
-- 为OUT参数赋值
p_emp_salary := 5000/0;
DBMS_OUTPUT.PUT_LINE(p_emp_id||p_emp_name||p_emp_salary);
END test_param_procedure;
1.正常捕获时调用
sql
--使用PL/SQL块调用存储过程并处理异常
DECLARE
-- 1. 正确声明一个本地变量来接收 OUT 参数
v_salary NUMBER;
BEGIN
-- 2. 调用存储过程,将本地变量传递给 OUT 参数
test_param_procedure(102, 'Jane Smith', v_salary);
-- 3. 后续可以使用 v_salary 这个变量
DBMS_OUTPUT.PUT_LINE('成功调用!输出的薪水为:' || v_salary);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error_code: ' || SQLCODE);--返回当前错误的数字代码
DBMS_OUTPUT.PUT_LINE('Error_msg: ' || SQLERRM);--返回与当前错误关联的完整错误消息文本
DBMS_OUTPUT.PUT_LINE('Error_all_msg: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);--返回详细的错误堆栈跟踪,精确定位到错误发生的行号。
END;

2.无捕获时调用
sql
DECLARE
v_salary NUMBER;
BEGIN
test_param_procedure(101, 'John Doe', v_salary);
DBMS_OUTPUT.PUT_LINE('Employee Salary: ' || v_salary);
END;

四、查看存储过程源代码
sql
--查看存储过程源代码:存储过程名称大小写敏感,oracle默认大写
SELECT DBMS_METADATA.GET_DDL('PROCEDURE', 'TEST_PARAM_PROCEDURE') FROM DUAL;