一、immediate
executeimmediate(以下簡稱ei)是Oracle PL/SQL的一個關鍵字,它的作用是在一次單獨的操作中動態執行SQL語句,通常用於執行動態生成的SQL語句或者執行用戶輸入的SQL語句。當需要在運行時動態地生成SQL語句並執行時,就需要使用executeimmediate。
ei是一個執行語句,因此它的效果與直接在SQLPLUS或PL/SQL工具中運行相應的SQL語句相同。它可以執行任何有效的SQL語句,包括SELECT,INSERT,UPDATE,DELETE和DDL語句。
ei的語法如下:
EXECUTE IMMEDIATE 'SQL 命令字符串';
其中SQL命令字符串是一個動態生成的SQL語句字符串。ei首先解析SQL語句字符串,然後執行SQL語句。如果SQL語句字符串包含綁定變量,則需要在ei語句之前定義它們。
二、executive
ei中還有一個可選參數,EXECUTIVE,在PL/SQL塊中使用。通常,如果要使用EXECUTIVE參數,則該塊應該以BEGIN EXECUTIVE開頭。
EXECUTIVE參數可以使用一個或多個參數。這些參數可以是任何類型的變量或表達式。EXECUTIVE參數指定的值可以被SQL語句中的綁定變量所引用。
ei的語法如下:
EXECUTE IMMEDIATE 'SQL 命令字符串' [USING EXECUTIVE parameters];
其中SQL命令字符串是一個動態生成的SQL語句字符串。USING EXECUTIVE parameters是一個或多個EXECUTIVE參數。
三、oracle execute immediate
ei不僅在Oracle PL/SQL中使用,它也可以在其他語言和工具中使用。Oracle提供了一些特定於Oracle的ei擴展,這些擴展允許PL/SQL和Oracle外部代碼之間的更靈活通信。這些擴展包括使用RETURNING子句來返回結果或使用BINDING子句來綁定變量。
RETURNING子句可以在ei語句中緊隨SELECT語句之後來傳遞結果。BINDING子句允許在ei語句中指定綁定變量的名稱,而不是按順序綁定。
ei的語法如下:
EXECUTE IMMEDIATE SQL命令字符串
[NOT BOUND] [REUSABLE:]
[INTO 變量名[, 變量名…]]
[{USING | BIND}(綁定參數明, 綁定參數值[, 綁定參數明, 綁定參數值…])]
[RETURNING 子句];
四、execute
ei與execute的區別在於,execute是一個SQLPLUS的命令,它可以在SQLPLUS環境中執行SQL腳本。在使用execute時,我們可以將SQL命令保存到一個腳本文件中,並在需要執行時調用該腳本。execute命令也可以在PL/SQL塊中使用,以避免一些SQLPLUS腳本中的限制。
使用execute的語法如下:
EXECUTE script_name [parameter_list];
其中script_name是要執行的腳本文件的名稱。parameter_list是包含綁定變量的列表。
五、execute immediate詳解實例
下面是一個使用ei的簡單示例,它將刪除一個動態計算的員工姓名。在該示例中,我們使用EXECUTIVE參數來指定表的名稱和一個動態計算的員工ID:
DECLARE
v_name VARCHAR2(200);
v_table_name VARCHAR2(200) := 'employees'; -- 使用EXECUTIVE參數指定的表名
v_employee_id NUMBER := 100; -- 使用EXECUTIVE參數指定的員工ID
BEGIN
EXECUTE IMMEDIATE 'SELECT first_name || last_name
FROM ' || v_table_name || '
WHERE employee_id = :employee_id'
INTO v_name
USING EXECUTIVE v_employee_id;
dbms_output.put_line('員工 ' || v_name || ' 的姓名已刪除');
END;
在上面的示例中,ei查詢employee表並通過EXECUTIVE參數傳遞表名稱和員工ID,以查詢員工ID對應的員工姓名。查詢出的員工姓名存儲在變量v_name中,並且將其打印輸出。而變量中存儲的SQL字符串是動態生成的,其結果取決於參數v_table_name和v_employee_id。
下面是一個將唯一姓名插入表中的例子,該姓名是從一個動態計算而得的字符串:
DECLARE
v_firstname VARCHAR2(50) := 'John';
v_lastname VARCHAR2(50) := 'Doe';
v_name VARCHAR2(100) := v_firstname || ' ' || v_lastname;
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO employees (employee_id, first_name, last_name)
VALUES (1, :first_name, :last_name)'
USING v_firstname, v_lastname;
dbms_output.put_line('插入了1行數據');
END;
在上面的示例中,ei向employee表中插入一個唯一的員工姓名。該名字是通過使用EXECUTE IMMEDIATE查詢和組合首名和姓氏而動態生成的字符串。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/280763.html
微信掃一掃
支付寶掃一掃