EXECUTE
📄字数 1.9K
👁️阅读量 加载中...
一、概述
EXECUTE
命令是一个用于调用预定义数据库程序单元的快捷执行指令。其功能特性主要包括:
- 调用存储过程/存储函数:支持无参或有参数的存储过程/存储函数,使用
EXECUTE 存储过程名/存储函数名
或者EXECUTE 存储过程名/存储函数名(参数1,参数2...)
- 调用包内存储过程/存储函数:使用
EXECUTE 包名.存储过程/存储函数
调用封装在包内的存储过程/存储函数 - 执行动态SQL:
EXECUTE
也可用于执行动态PL/SQL块,使用EXECUTE IMMEDIATE
- 简化执行语句:
EXECUTE
允许快速执行存储过程/存储函数,而无需封装在BEGIN ... END;
块中
提示
在虚谷数据库中,CALL
与EXECUTE
命令两者等价。EXEC
是EXECUTE
命令的简写形式。
二、语法格式
EXECUTE语句相关语法如下所示:
参数说明:
func_name
:表示要执行的存储过程/存储函数名字func_params
:表示存储过程/存储函数的实参列表。具有多个参数时,使用英文逗号,
分隔
三、注意事项
EXECUTE
不能直接用于存储函数返回值赋值,可通过OUT型参数间接返回结果EXECUTE
调用存储过程/存储函数时,参数类型和顺序需与被调用存储过程/存储函数严格匹配,缺失或错误将导致运行时失败
四、示例
- 调用无参存储过程/存储函数
sql
-- 创建无参存储过程
SQL> CREATE OR REPLACE PROCEDURE say_hello IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, world!');
END;
/
-- EXECUTE执行
SQL> EXECUTE say_hello;
Hello, world!
-- EXEC(简写方式)执行
SQL> EXEC say_hello;
Hello, world!
-- 创建无参存储函数
SQL> CREATE OR REPLACE FUNCTION say_hello_2 RETURN INT IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello, world!');
RETURN 0;
END;
/
SQL> EXECUTE say_hello_2;
Hello, world!
SQL> EXEC say_hello_2;
Hello, world!
- 调用有参存储过程/存储函数
sql
-- 创表
SQL> CREATE TABLE audit_log (
id int,
action VARCHAR2(100),
created_at DATE DEFAULT SYSDATE
);
-- 创建有参存储过程
SQL> CREATE OR REPLACE PROCEDURE log_action(p_id int, p_action VARCHAR2) IS
BEGIN
INSERT INTO audit_log(id, action) VALUES (p_id, p_action);
END;
/
-- 执行存储过程
SQL> EXECUTE log_action(1, 'user_login');
-- 创建有参存储函数
SQL> CREATE OR REPLACE FUNCTION log_action_2(p_id int, p_action VARCHAR2) RETURN INT IS
BEGIN
INSERT INTO audit_log(id, action) VALUES (p_id, p_action);
RETURN 0;
END;
/
SQL> EXECUTE log_action_2(1, 'user_login');
- 包内存储过程调用/存储函数
sql
-- 创建包和包体
SQL> CREATE OR REPLACE PACKAGE math_pkg AS
PROCEDURE add_num(a NUMBER, b NUMBER);
FUNCTION add_num_2(a NUMBER, b NUMBER) RETURN INT;
END;
/
SQL> CREATE OR REPLACE PACKAGE BODY math_pkg AS
PROCEDURE add_num(a NUMBER, b NUMBER) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Result: ' || (a + b));
END;
FUNCTION add_num_2(a NUMBER, b NUMBER) RETURN INT IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Result: ' || (a + b));
RETURN 0;
END;
END;
/
-- 执行包内存储过程
SQL> EXECUTE math_pkg.add_num(10, 20);
Result: 30
-- 执行包内存储函数
SQL> EXECUTE math_pkg.add_num_2(10, 20);
Result: 30
- 使用
EXECUTE IMMEDIATE
动态SQL执行
sql
-- 动态建表
SQL> BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE temp_table (id NUMBER, name VARCHAR2(50))';
END;
/
-- 动态插入数据
SQL> BEGIN
EXECUTE IMMEDIATE 'INSERT INTO temp_table VALUES (1, ''test'')';
END;
/