SQL 语句从编译和运行的角度可以分为两种,静态 SQL和 动态 SQL,这两种 SQL 在使用方式、运行机制和性能表现等方面各有特点 :
静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。
动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。
静态sql:语句类型在编程时候必须是确定好的。比如
select * from employee where empno='abc'select * from employee where empno='12'都必须是确定的,唯一可以变化的是abc的值。
动态sql:语句类型可以在运行期间指定,比如clp就是最典型的动态sql程序,你可以输入任何命令。
静态sql的存取路径是在运行前就确定好的,而动态sql的存取路径是在运行时动态生成的。因此生成的存取计划相对更优,但考虑到生成存取路径的开销,有可能应用程序的运行时间相对会比静态sql长些。
没区别,只是有些静态sql执行必须的东西,我们通过一些逻辑处理才能出来,这个时候,静态sql就没法执行,我们就需要动态拼接语句,然后执行
--给个最简单的
如:select 1 from table id in (1,2,3) 这个语句,现在不考虑程序中的处理什么的,仅仅针对动态sql说事
如果,参数是一个字段,而字段中的值是 “1,2,3”
这个时候,你如果直接传参数给sql语句,那么你得到的是下面的语句
select 1 from table id in ('1,2,3') sql会将这个当成一个值
那么这个时候,我们就需要将值“1,2,3”拆分后,动态的去拼接sql