Oracle SQL语句的执行过程详解 (oracle 截取字符串)

技术教程 2025-05-06 22:14:22 浏览
截取字符串

在Oracle SQL语句的执行过程中,Oracle数据库的内部分析原理,即 ,当某个用户***次提交关于Oracle SQL表达式的时候,Oracle就会将这SQL语句进行Hard parse,这过程有点像程序编译,检查语法、表名、字段名等相关信息(如下图),这过程会花比较长的时间,因为它要分析语句的语法与语义。

然后获得***化后的执行计划(sql plan),并在内存中分配一定的空间保存该语句与对应的执行计划等信息。

当用户第二次请求或多次请求时,Oracle会自动找到先前的语句与执行计划,而不会进行Hard parse,而是直接进行Soft parse(把语句对应的执行计划调出,然后执行),从而减少数据库的分析时间。

注意的是:Oracle中只能完全相同的语句,包大小写、空格、换行都要求一样时,才会重复使用以前的分析结果与执行计划。分析过程如下图:

对于大量的、频繁访问的Oracle SQL语句,如果不采用Bind 变量的方式,哪Oracle会花费大量的Shared latch与CPU在做Hard parse处理,所以,要尽量提高语句的重用率,减少语句的分析时间,通过了解OracleSQL语句的分析过程可以明白Oracle的内部处理逻辑,并在设计与实现上避免。

在用JDBC或其它持久化数据(如Hibernate,JDO等)操作时,尽量用占位符(?)

【编辑推荐】


PL/SQL里 execute immediate的用法 谁给解释下

在ORACLE的PL/SQL里:EXECUTE IMMEDIATE 代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 -- 使用技巧1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交如果通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分.如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号.4. 在Oracle手册中,未详细覆盖这些功能。 下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能 IMMEDIATE -- 用法例子1. 在PL/SQL运行DDL语句beginexecute immediate set role all;end;2. 给动态语句传值(USING 子句)declarel_depnam varchar2(20) := testing;l_loc varchar2(10) := Dubai;beginexecute immediate INSERT into dept values (:1, :2, :3)using 50, l_depnam, l_loc;commit;end;3. 从动态语句检索值(INTO子句)declarel_cnt varchar2(20);beginexecute immediate select count(1) from empinto l_cnt;dbms__line(l_cnt);end;4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.黓认为IN类型,其它类型必须显式指定declarel_routinvarchar2(100) := _rowcnt;l_tblnamvarchar2(20) := emp;l_cnt number;l_statusvarchar2(200);beginexecute immediate begin || l_routin || (:2, :3, :4); end;using in l_tblnam, out l_cnt, in out l_status; if l_status != OK then dbms__line(error);end if;end;5. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量declaretype empdtlrec is record (empno number(4), ename varchar2(20), deptno number(2));empdtl empdtlrec;beginexecute immediate select empno, ename, deptno || from emp where empno = 7934into empdtl;end;6. 传递并检索值子句用在USING子句前declarel_dept pls_integer := 20;l_namvarchar2(20);l_locvarchar2(20);beginexecute immediate select dname, loc from dept where deptno = :1into l_nam, l_locusing l_dept ;end;7. 多行查询选项.对此选项用insert语句填充临时表,用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾_salpls_integer := 2000;beginexecute immediate insert into temp(empno, ename) || select empno, ename from emp || where sal > :1using l_sal;commit;end;对于处理动态语句,EXECUTE IMMEDIATE 比以前可能用到的更容易并且更高效.当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕获所有可能的异常.

SQL语句的执行过程详解

sql存储过程解释

CREATE PROCEDURE 创建存储过程AddOrder /* ( @parameter1 int = 5, ---参数1,int类型,默认值是5 @parameter2 datatype OUTPUT ---参数2,datatype类型,用于返回结果 ) */( ---上面两个参数被注释掉了,也就是没有用了。 @UserID int, ---参数 UserID,int类型 @CartIDString nvarchar(50), ---参数CartIDString,string类型 @OrderDate datetime, ---参数 OrderDate datetime类型 @OrderID int output) ---参数 OrderID,int类型,用于接收输出值 AS ---开始存储过程主体 begin tran OrderAdd ---开始事务处理 insert into Orders ------- ( | UserID, | OrderDate) | values | (@UserID, | @OrderDate) ------------- 到这里是插如一条数据到Orders表 select @OrderID=@@Identity ------给OrderID赋值 insert into OrderContent -----开始插入数据到OrderContent表 (OrderID, BookID, BookQuantity, UnitCost) -------设定要插入的4个字段 select @OrderID, , bookquantity, ------设定要选择的4个字段 from shopcart ------结合shopcart和books进行条件查询 inner join books on = where cartidstring=@cartidstring ----插入语句到此结束 exec emptyshoppingcart @cartidstring ---此处应该是执行了另外一个存储过程 commit tran orderadd ---- 事务处理结束。 注:此存储过程并不复杂,有难度的地方在第一条插入语句嵌套了使用了inner join的选择语句。

Linux 怎么调用存储过程

oracle

1.首先连接数据库2.发出一下命令:DB2 -td@ -vf 2 2文件中是创建存储过程的SQL语句; -td 选项让命令行处理程序使用@作为语句终止字符; -v 选项让命令处理程序将命令文本回显到标准输出; -f 让命令行处理程序...

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐