为什么我们使用"立即执行"在plsql中?我知道我们用它来执行动态的sql语句。但我还是无法说服面试官。有人可以给我一个准确而恰当的答案吗?虽然我每天都使用它,但仍然无法解释它。我知道的一件事是,它在DML语句中使用,并通过select语句检索多行。请给出使用"立即执行"。
的确切定义答案 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)
这里是一个示例,显示了如何使用动态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使用立即执行,但应使用全局临时表。
比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;
与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