PL/SQL 引擎[PL/SQL engine]是用户定义,编译,及运行 PL/SQL 程序单元的工具。
图中 显示了应用程序向 Oracle 数据库发送了一个过程调用。PL/SQL 过程在 SGA 中运行,SGA 将过程发送给 PL/SQL 引擎,而引擎则将 SQL 发送给 SQL 语句执行器。
PL/SQL 程序单元存储于数据库中。当应用程序调用存储于数据库内的存储过程时,Oracle 将经过编译的程序单元加载到位于系统全局区[system global area,SGA]的共享池[shared pool]内。PL/SQL 语句执行器[PL/SQL statement executor]和 SQL 语句执行器[SQL statement executor]协同工作,共同处理程序单元内的所有语句。
匿名 PL/SQL 块与存储过程的比较:
存储过程在创建后作为方案对象存储在数据库中。一旦存储过程被创建并编译后,就成为一个命名的对象,可以重复执行而无需再次编译。此外,与存储过程相关的依赖性信息也将被保存在数据字典中,以确保 过程的有效性。
Oracle 编译 PL/SQL 块,并将编译结果存储在 SGA 的共享池内[shared pool],但匿名 PL/SQL 块不会以编译后的形式存储于数据库内,当实例关闭后则无法重用。利用 Oracle 的共享 SQL 技术[Shared SQL],共享池内的匿名 PL/SQL 块在被清除出共享池之前可以被重用。将数据库应用程序中的 PL/SQL 块改写为存储过程,存储到数据库或内存中,可以避免过程运行时 Oracle 进行不必要的重复编译工作,从而提升应用程序及 Oracle 的整体性能。