当前位置:七道奇文章资讯数据防范Oracle防范
日期:2011-03-21 00:21:00  来源:本站整理

<b>基于Oracle的高性能动态SQL程序开辟</b>[Oracle防范]

赞助商链接



  本文“<b>基于Oracle的高性能动态SQL程序开辟</b>[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
  择要:对动态SQL的程序开辟举行了总结,并结合笔者实际开辟经验给出若干开辟本领.

  关键词:动态SQL,PL/SQL,高性能

  1. 静态SQLSQL与动态SQL

  Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经肯定,大大都的编译情形属于这种范例;别的一种是后期联编(late binding),即SQL语句只有在运行阶段才能成立,比方当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句举行肯定,只能在用户输入一定的查询条件后才能提交给SQL引擎举行处理.普通,静态SQL采取前一种编译方法,而动态SQL采取后一种编译方法.

  本文主要就动态SQL的开辟举行谈论,并在最后给出一些实际开辟的本领.

  2. 动态SQL程序开辟

  理解了动态SQL编译的原理,也就掌握了其基本的开辟思惟.动态SQL既然是一种"不肯定"的SQL,那其履行就有其呼应的特点.Oracle中供应了Execute immediate语句来履行动态SQL,语法以下:

Excute immediate 动态SQL语句 using 绑定参数列表 returning into 输出参数列表;

  对这一语句作以下阐明:

  1) 动态SQL是指DDL和不肯定的DML(即带参数的DML)

  2) 绑定参数列表为输入参数列表,即其范例为in范例,在运行时刻与动态SQL语句中的参数(实际上占位符,可以理解为函数里面的情势参数)举行绑定.

  3) 输出参数列表为动态SQL语句履行后返回的参数列表.

  4) 由于动态SQL是在运行时刻举行肯定的,所以相关于静态而言,其更多的会丧失一些系统性能来换取其机动性.

  为了更好的阐明其开辟的历程,下面摆列一个实例:

  设数据库的emp表,其数据为以下:

ID NAME SALARY
100 Jacky 5600
101 Rose 3000
102 John 4500

  要求:

  1.成立该表并输入呼应的数据.

  2.按照特定ID可以查询到其姓名和薪水的信息.

  3.按照大于特定的薪水的查询呼应的员工信息.

  按照前面的要求,可以辨别成立三个历程(均利用动态SQL)来实现:

  历程一:

create or replace procedure create_table as
begin
execute immediate '
create table emp(id number,
name varchar2(10)
salary number; )'; --动态SQL为DDL语句
insert into emp
values (100,'jacky',5600);
insert into emp
values (101,'rose',3000);
insert into emp
values (102,'john',4500);
end create_table;

  历程二:

create or replace procedure find_info(p_id number) as
v_name varchar2(10);
v_salary number;
begin
execute immediate '
select name,salary from emp
where id=:1'
using p_id
returning into v_name,v_salary; --动态SQL为查询语句
dbms_output.put_line(v_name ||'的收入为:'||to_char(v_salary));
exception
when others then
dbms_output.put_line('找不到呼应数据');
end find_info;

  历程三:

create or replace procedure find_emp(p_salary number) as
r_emp emp%rowtype;
type c_type is ref cursor;
c1 c_type;
begin
open c1 for '
select * from emp
where salary >:1'
using p_salary;
loop
fetch c1 into r_emp;
exit when c1%notfound;
dbms_output.put_line('薪水大于‘||to_char(p_salary)||’的员工为:‘);
dbms_output.put_line('ID为'to_char(r_emp)||' 其姓名为:'||r_emp.name);
end loop;
close c1;
end create_table;


  注意:在历程二中的动态SQL语句利用了占位符":1",其实它相当于函数的情势参数,利用":"作为前缀,然后利用using语句将p_id在运行时刻将:1给替换掉,这里p_id相当于函数里的实参.别的历程三中翻开的游标为动态游标,它也属于动态SQL的范围,其整个编译和开辟的历程与execute immediate履行的历程很近似,这里就不在赘述了.

  以上是“<b>基于Oracle的高性能动态SQL程序开辟</b>[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .