千家信息网

Oracle动态SQL和静态SQL比较

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,Oracle动态SQL和静态SQL比较1.静态SQLSQL与动态SQLOracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,
千家信息网最后更新 2026年11月02日Oracle动态SQL和静态SQL比较

Oracle动态SQL和静态SQL比较

1.静态SQLSQL与动态SQL
  Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的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是在运行时刻进行确定的,所以相对于静态而言,其更多的会损失一些系统性能来换取其灵活性。

为了更好的说明其开发的过程,下面列举一个实例:
  设数据库的他表,其数据为如下:

ID

NAME

SAL

10

scott

3000

20

tom

5000

30

jerry

4500

要求:
  1.创建该表并输入相应的数据。
  2.根据特定ID可以查询到其姓名和薪水的信息。
  3.根据大于特定的薪水的查询相应的员工信息。
  根据前面的要求,可以分别创建三个过程(均使用动态SQL)来实现:

过程一:(创建表并插入数据)

18:16:27 SCOTT@ prod>create or replace procedure p1 as18:16:36   2  flag number; 18:16:36   3  begin18:16:36   4  select count(*) into flag from all_tables where table_name='T1';18:16:36   5  if (flag=0) then 18:16:36   6  execute immediate 'create table t1(id number,name varchar2(10),sal number)';18:16:36   7  else18:16:36   8  insert into t1 values (10,'scott',3000);18:16:36   9  insert into t1 values (20,'tom',5000);18:16:37  10  insert into t1 values (30,'jerry',4500);18:16:37  11  end if;18:16:37  12  end p1;18:16:38  13  /Procedure created.Elapsed: 00:00:00.2018:16:40 SCOTT@ prod>exec p1;PL/SQL procedure successfully completed.Elapsed: 00:00:00.1818:16:47 SCOTT@ prod>select * from t1;        ID NAME              SAL---------- ---------- ----------        10 scott            3000        20 tom              5000        30 jerry            4500Elapsed: 00:00:00.0118:16:52 SCOTT@ prod>


过程二:(按id查询用户信息)

18:40:24 SCOTT@ prod>create or replace procedure p2 (p_id number) as18:40:26   2   v_name varchar2(10);18:40:26   3   v_sal number;18:40:26   4   begin18:40:26   5   execute immediate 'select name,sal  from t1  where id=:1' into v_name,v_sal using p_id;18:40:26   6   dbms_output.put_line(v_name ||' Salary is: '||to_char(v_sal));18:40:26   7    exception18:40:26   8   when others then18:40:26   9   dbms_output.put_line('No Data Found');18:40:26  10   end p2;18:40:26  11   /Procedure created.Elapsed: 00:00:00.0718:40:27 SCOTT@ prod>exec p2(10);scott Salary is: 3000PL/SQL procedure successfully completed.Elapsed: 00:00:00.0118:40:32 SCOTT@ prod>exec p2(20);tom Salary is: 5000PL/SQL procedure successfully completed.Elapsed: 00:00:00.0218:40:40 SCOTT@ prod>exec p2(30);jerry Salary is: 4500PL/SQL procedure successfully completed.Elapsed: 00:00:00.0218:40:45 SCOTT@ prod>


过程三:(查询薪水大于某个值的员工)

18:48:59 SCOTT@ prod>create or replace procedure p3(p_sal number) as18:50:55   2  r_t1 t1%rowtype;18:50:55   3  type c_type is ref cursor;18:50:56   4  c1 c_type;18:50:56   5  begin18:50:56   6  open c1 for '18:50:56   7  select * from t118:50:56   8  where sal >:1'18:50:56   9  using p_sal;18:50:56  10  loop18:50:56  11  fetch c1 into r_t1;18:50:56  12  exit when c1%notfound;18:50:56  13  dbms_output.put_line('Salary higher '||to_char(p_sal)||' Name is:');18:50:56  14  dbms_output.put_line('ID is ' ||to_char(r_t1.id)||' Name is: '||r_t1.name);18:50:56  15  end loop;18:50:56  16  close c1;18:50:56  17  end p3;18:50:57  18  /Procedure created.Elapsed: 00:00:00.1218:50:58 SCOTT@ prod>exec p3(2000);Salary higher 2000 Name is:ID is 10 Name is: scottSalary higher 2000 Name is:ID is 20 Name is: tomSalary higher 2000 Name is:ID is 30 Name is: jerryPL/SQL procedure successfully completed.Elapsed: 00:00:00.0218:51:15 SCOTT@ prod>


注意:在过程二中的动态SQL语句使用了占位符":1",其实它相当于函数的形式参数,使用":"作为前缀,然后使用using语句将p_id在运行时刻将:1给替换掉,这里p_id相当于函数里的实参。另外过程三中打开的游标为动态游标,它也属于动态SQL的范畴,其整个编译和开发的过程与execute immediate执行的过程很类似。







动态 参数 语句 过程 编译 查询 静态 数据 程序 开发 输入 运行 信息 函数 时刻 用户 类型 薪水 员工 引擎 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 深圳九邦互联网科技有限公司 A股互联网金融科技公司 互联网 科技创业 唐信互联网科技 智慧科技互联网 长亮科技 互联网金融 四川狮子座互联网科技 海南科技产业互联网平台 搜狐科技互联网 允成互联网科技有限公司融资 区块链结合互联网科技 皮皮虾互联网科技有限公司 九思连强互联网电子科技有限公司 信承诺互联网科技有限公司 广州梦谷互联网科技有限公司领导 福建互联网展示科技馆设计 广东猫王互联网科技有限公司电话 每日互联网科技新闻 广州全民伙伴互联网科技有限公司 金融科技与互联网金融 有马互联网科技 善班互联网科技有限公司 太原新华互联网科技学校怎么样 昊天互联网科技有限公司 互联网保险科技创业 上海科技产业互联网平台 有人说阿里系是互联网科技企业 安徽零酒互联网科技有限公司 安徽九吞吴互联网科技有限公司
0