为什么我们在plsql中使用execute immediate?

时间:2015-01-17 09:34:07

标签: plsql

为什么我们使用"立即执行"在plsql中?我知道我们用它来执行动态的sql语句。但我还是无法说服面试官。有人可以给我一个准确而恰当的答案吗?虽然我每天都使用它,但仍然无法解释它。我知道的一件事是,它在DML语句中使用,并通过select语句检索多行。请给出使用"立即执行"。

的确切定义

3 个答案:

答案 0 :(得分:4)

EXECUTE IMMEDIATE允许执行DML或DDL语句,该语句作为字符串保存,仅在运行时进行评估。这使得人们可以基于程序逻辑动态创建语句。 EXECUTE IMMEDIATE也是在PL / SQL块中执行DDL的唯一方法。有关这些功能的完整全面检查,请参阅Oracle Manual

虽然这是一个非常有用的设施,但应谨慎使用。除非明确需要动态sql,否则最好直接在PL / SQL代码中声明sql。这将使Oracle能够在编译时解析SQL的有效性,并在执行预编译语句时减少开销。在动态构建SQL时,您还需要非常小心以避免SQL注入攻击。

答案 1 :(得分:0)

例如,假设您有一些用户定义公司及其所做工作的应用程序。如果您想为用户动态创建它,那么您可以选择创建自己的模型(表)。由于您不知道它们将具有多少个表,以及此表将具有多少属性,因此您可以使用execute immediate。

答案 2 :(得分:0)

  1. 过程或匿名PLSQL块中的DDL语句

这里是一个示例,显示了如何使用动态DDL创建,删除和重新创建表:

BEGIN
EXECUTE IMMEDIATE 'create table abcd (efgh NUMBER)';
EXECUTE IMMEDIATE 'drop table abcd';
EXECUTE IMMEDIATE 'create table abcd (efgh VARCHAR2(10))';
END;

您可以使用此方法执行任何DDL。 尽管不建议对DDL使用立即执行,但应使用全局临时表。

  1. 在过程或匿名PLSQL块中执行DML语句

比DDL更频繁地执行DML命令。使用动态SQL,您可以像使用静态SQL一样执行插入,更新和删除操作:

BEGIN
EXECUTE IMMEDIATE 'INSERT INTO abcd (efgh) VALUES (:text_string)' 
USING 'ijkl';
EXECUTE IMMEDIATE 'INSERT INTO abcd (efgh) VALUES (:text_string)' 
USING 'mnop';
EXECUTE IMMEDIATE 'UPDATE abcd ' ||
'SET efgh = :text_string WHERE efgh = :second_string' 
USING 'qrst', 'mnop';
EXECUTE IMMEDIATE 'DELETE FROM abcd ' ||
'WHERE efgh = :text_string '
USING 'qrst';

END;
  1. 在具有绑定变量的Select查询中

与DDL和DML一样有用,但是如果您无法获取数据,数据库不是很有用。您也可以使用立即执行来选择数据。

DECLARE
v_data abcd.efgh%TYPE;

v_data_row abcd%ROWTYPE;

BEGIN

EXECUTE IMMEDIATE 'SELECT efgh FROM abcd WHERE efgh = :text_string' 
INTO v_data
USING 'ijkl';

DBMS_OUTPUT.PUT_LINE( 'Column Variable: ' || v_data );

EXECUTE IMMEDIATE 'SELECT * FROM abcd WHERE efgh = :text_string' 
INTO v_data_row
USING 'ijkl';

DBMS_OUTPUT.PUT_LINE( 'Row Variable: ' || v_data_row.efgh );

END;

INFO: Column Variable: ijkl
INFO: Row Variable: ijkl