oracle 中动态SQL的使用

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

对这一语句作如下说明:

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

  2)绑定参数列表为输入参数列表,即其类型为in类型,在运行时刻与动态SQL语句中的参数(实际上占位符,可以理解为函数里面的形式参数)进行绑定。

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

  4)由于动态SQL是在运行时刻进行确定的,所以相对于静态而言,其更多的会损失一些系统性能来换取其灵活性。

小技巧:这里所说的returning into 并不是对所有语句都有效果。他只针对 insert,update,delete语句。如果是select 语句。则其语法如下:
     Excute immediate 动态SQL语句 into 输出参数列表 using 绑定参数列表;

实际项目中使用示例:

create or replace function get_number_zws( tableName varchar2, filed varchar2, condition varchar2,orderby varchar2)
return number is
       returnvalue number; --返回值
       countrow number;      --总记录行数
       rowindex number;      --中位数所在位置
       strsql1 varchar2(4000); --统计sql
       strsql2 varchar2(4000); --查询sql
/*
功能:返回类型为数字型的序列的中位数
参数:
      tableName 数据表
      filed: 产生中位数的字段
      condition 查询条件字符串
      orderby 排序字符串
作者:李国军
联系方式:82729536
时间:2012-11-26
*/
begin
     strsql1 := 'select count(1) from '||tableName||' where 1=1 and '||condition;
     dbms_output.put_line(strsql1);
     execute immediate strsql1
     into countrow;
     if mod(countrow,2) = 0 then
        begin
             rowindex := countrow/2;
             strsql2 := 'select avg('||filed||') from ( select '||filed||',rownum sn from '||tableName||' where 1=1 and '||condition||' order by '||orderby||') where sn between '|| rowindex ||' and '|| rowindex+1;
             execute immediate strsql2
             into returnvalue;
        end;
     else
         begin
              rowindex := floor(countrow/2)+1;
              strsql2 := 'select '||filed||' from ( select '||filed||',rownum sn from '||tableName||' where 1=1 and '||condition||' order by '||orderby||') where sn ='|| rowindex;
              execute immediate strsql2
             into returnvalue;
             --dbms_output.put_line(strsql2);
         end;
     end if;
     return returnvalue;
end;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值