oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析.
一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行), 而且引起的问题不能通过增加内存条和cpu的数量来解决。
一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行), 而且引起的问题不能通过增加内存条和cpu的数量来解决。
之所以这样是因为门闩是为了顺序访问以及修改一些内存区域而设置的,这些内存区域是不能被同时修改。当一个sql语句提交后,oracle会首先检查一下共享缓冲池(shared pool)里有没有与之完全相同的语句,如果有的话只须执行软分析即可,否则就得进行硬分析。
而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。
普通sql语句:
pl/sql很多时候都会自动绑定变量而无需编程人员操心,即很多你写得sql语句都会自动利用绑定变量,如下例所示:
但是在pl/sql中动态sql并不是这样。
在vb,java以及其他应用程序中都得显式地利用绑定变量。
对于绑定变量的支持不仅仅限于oracle,其他RDBMS向SQLSERVER也支持这一特性。
但是并不是任何情况下都需要使用绑定变量, 下面是两种例外情况:
1.对于隔相当一段时间才执行一次的sql语句,这是利用绑定变量的好处会被不能有效利用优化器而抵消
2.数据仓库的情况下。
而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。
普通sql语句:
pl/sqlSELECT fname, lname, pcode FROM cust WHERE id = 674;
SELECT fname, lname, pcode FROM cust WHERE id = 234;
SELECT fname, lname, pcode FROM cust WHERE id = 332;
含绑定变量的sql 语句:
SELECT fname, lname, pcode FROM cust WHERE id = :cust_no;Sql*plus 中使用绑定变量:
sql> variable x number;
sql> exec :x := 123;
sql> SELECT fname, lname, pcode FROM cust WHERE id =:x;
pl/sql很多时候都会自动绑定变量而无需编程人员操心,即很多你写得sql语句都会自动利用绑定变量,如下例所示:
也许此时你会想要利用绑定变量来替代p_empno,但是这是完全没有必要的,因为在pl/sql中,引用变量即是引用绑定变量。
create or replace procedure dsal(p_empno in number)
as
begin
update emp
set sal=sal*2
where empno = p_empno;
commit;
end;
/
但是在pl/sql中动态sql并不是这样。
在vb,java以及其他应用程序中都得显式地利用绑定变量。
对于绑定变量的支持不仅仅限于oracle,其他RDBMS向SQLSERVER也支持这一特性。
但是并不是任何情况下都需要使用绑定变量, 下面是两种例外情况:
1.对于隔相当一段时间才执行一次的sql语句,这是利用绑定变量的好处会被不能有效利用优化器而抵消
2.数据仓库的情况下。
相关推荐
然而,值得注意的是,虽然绑定变量通常带来性能提升,但在某些特定情况下,如绑定变量幻象(Bind Variable Peeking)可能导致不理想的执行计划。这种情况发生在Oracle根据第一次提供的变量值选择执行计划,但后续的...
相反,如果使用绑定变量,Oracle会尝试在共享池(Shared Pool)中查找相同的基本SQL结构,如果找到,就进行软分析(Soft Parse),从而避免重复的工作。 不使用绑定变量的另一个负面影响是共享池中的SQL语句数量...
如果不能使用强制绑定变量的oracle 参数 cursor_sharing=force ,也不能用触发器修改某个用户的 cursor_sharing=force 会话参数,那么这个转换程序可以帮到你(不能解决使用JAVA等编程语言,因为java使用?...
此外,Oracle提供了如**绑定变量窥探**(bind variable peeking)和**cursor_sharing**参数来调整绑定变量的行为,以适应不同的应用场景。PL/SQL作为一种强类型的语言,使用绑定变量更为自然,而其他如Java、VB等...
为了进一步提高效率,我们可以使用绑定变量(Bind variable)。绑定变量可以减少重复解析,避免因字符串拼接导致的闩锁竞争,并且降低内存和CPU资源的消耗。此外,通过调整`session_cached_cursors`参数,可以控制...
4. **全面的功能**:OCILIB 包含了大量的函数,涵盖了从连接数据库、执行 SQL 语句到处理游标、绑定变量、事务控制等所有核心数据库操作。 5. **错误处理**:OCILIB 提供了统一的错误处理机制,便于开发者捕获和...
- **绑定变量**:避免SQL注入,使用绑定变量(`:bind_variable`)执行动态SQL。 遵守这些规范,将有助于编写出高质量、易于维护的PL/SQL代码,提高代码的可读性和团队间的沟通效率。在实际开发中,还应考虑性能优化...
- 绑定变量(Bind Variable)使用 `VAR` 或 `VARIABLE` 声明,并以冒号 `:` 作为前缀。 - 示例: ```sql VAR a NUMBER BEGIN :a := 22; END; PRINT a; -- 输出结果 ``` - **命名块**: - 命名块是指具有...
4. **使用绑定变量**:绑定变量能防止SQL语句的硬解析,提高复用率,减少解析开销。避免在SQL语句中直接使用动态值,而是用占位符(如::bind_variable)。 5. **聚合函数与GROUP BY**:合理使用GROUP BY和HAVING,...
使用`DBMS_SQL.OPEN_CURSOR`打开一个游标,然后通过`DBMS_SQL.PARSE`解析SQL语句,并用`DBMS_SQL.BIND_VARIABLE`绑定变量,最后调用`DBMS_SQL.EXECUTE`执行删除操作。 #### 示例2:执行DDL语句 ```sql CREATE OR ...
例如,在编写PL/SQL代码时,可以使用`:bind_variable`来代替硬编码的值。 #### 7. 重组表 随着时间的推移,表可能会变得碎片化,这会影响查询性能。通过定期重组表,可以减少碎片并提高查询效率。Oracle提供了`DBMS...
在处理SQL语句时,如果使用了绑定变量(Bind Variable),Oracle将在Sharedpool中查找相同的语句模板,这大大提高了缓存命中率,减少了解析次数,有利于性能提升。相反,不使用绑定变量会导致SQL语句的动态部分无法...
3. **BIND_VARIABLE**:绑定变量到SQL语句,使得在执行时可以传递不同的参数值。 4. **DEFINE_COLUMN**:定义游标中某一列的变量,用于存储查询结果。 5. **EXECUTE**:执行已解析并绑定的SQL语句,但不获取数据。 6...
这里的`bind_list`用于绑定到SQL语句中的占位符。 ### 2. 异常处理 PL/SQL支持异常处理机制,允许开发者捕获并响应运行时错误。有三种类型的异常:预定义异常、用户自定义异常和系统异常。预定义异常如`NO_DATA_...
3. **BIND_VARIABLE**: 将变量绑定到SQL语句中的占位符,这样可以在执行语句时传递实际值。 4. **DEFINE_COLUMN**: 对于SELECT语句,此函数定义了字段变量,这些变量将存储从游标中获取的结果集的列值。 5. **...
它接受一个游标ID、SQL语句和一个可选的绑定变量列表,返回一个游标状态,表示SQL语句是否成功解析。 2. BIND:此过程用于将PL/SQL变量绑定到SQL语句中的位置参数。位置参数由冒号加数字(例如::1, :2)表示。你...
3. 如果SQL语句包含参数,则使用DBMS_SQL.BIND_VARIABLE过程绑定参数。 4. 判断SQL语句的类型,如果为非查询类型,则使用DBMS_SQL.EXECUTE过程执行。若为PL/SQL块,并且需要返回结果,则使用DBMS_SQL.VARIABLE_VALUE...
动态SQL主要分为两种形式:绑定变量(Bind Variables)和EXECUTE IMMEDIATE。绑定变量主要用于减少解析开销,提高性能,而EXECUTE IMMEDIATE则用于执行那些在编译时未知的SQL语句。 EXECUTE IMMEDIATE语法结构如下...
- 对于DML和DDL语句,`BIND_VARIABLE`和`COMMIT/ROLLBACK`可能需要额外处理,以确保事务管理的正确性。 3. **DBMS_SQL的主要过程**: - `OPEN_CURSOR`:打开一个新的动态游标,并返回一个整型游标ID。 - `CLOSE_...
在Oracle中,DBMS_SQL包提供了处理动态SQL的功能,如解析、绑定变量和执行。以下是一个简单的示例: ```sql DECLARE cursor_var INTEGER; column_value VARCHAR2(50); BEGIN cursor_var := DBMS_SQL.OPEN_CURSOR;...