在Oracle PL / sql块中,为什么允许动态sql
begin execute immediate 'drop table table_name'; end;
但静电不是吗?
begin drop table table_name; end;
我希望答案比“因为这就是语言的运作方式”更具洞察力.
答案是PL / sql不支持动态多态.它只支持静态多态,因为
所有PL / sql都生成“DIANA” – > Ada的描述性中间归因表示法,一种树形结构的中间语言. DIANA由编译器内部使用.
在编译时,PL / sql源代码被转换为系统代码并生成相应的DIANA.现在想想是否有像create table语句这样的DDL语句,它在编译时不存在,它将在运行程序后创建.你的PL / sql引擎如何生成DIANA然后????
DIANA在PL / sql中扮演重要角色来检查/验证子程序.这是必需的,因为我们知道子程序可以使用数据库对象,如表,视图,同义词或其他存储过程.下次运行程序时,对象可能已更改/删除/ droped.例如:有人可能已经下了桌子,存储的过程或功能单一可能已经改变了.
这就是为什么通常使用PL / sql来操纵数据库结构中的数据,而不是操纵这些结构.
但是有一些方法可以使用动态sql和DBMS_sql包进行操作,但是应该谨慎使用这些方法逻辑.例如,如果要创建表,则应首先检查此表是否已存在,使用数据字典视图.