Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


EXECUTE

📄字数 1.9K
👁️阅读量 加载中...

一、概述

EXECUTE命令是一个用于调用预定义数据库程序单元的快捷执行指令。其功能特性主要包括:

  • 调用存储过程/存储函数:支持无参或有参数的存储过程/存储函数,使用EXECUTE 存储过程名/存储函数名或者EXECUTE 存储过程名/存储函数名(参数1,参数2...)
  • 调用包内存储过程/存储函数:使用EXECUTE 包名.存储过程/存储函数调用封装在包内的存储过程/存储函数
  • 执行动态SQL:EXECUTE也可用于执行动态PL/SQL块,使用EXECUTE IMMEDIATE
  • 简化执行语句:EXECUTE允许快速执行存储过程/存储函数,而无需封装在BEGIN ... END;块中

提示

在虚谷数据库中,CALLEXECUTE命令两者等价。EXECEXECUTE命令的简写形式。

二、语法格式

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;
     /