PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE 方法的区别

在PL/SQL中在执行SQL语句时可以直接写SQL或者可以把一个SQL语句拼成一个字符串,如下:

select * from dual;

v_sql:='select * from dual'; EXECUTE IMMEDIATE v_sql;

 

一般来说直接写SQL的性能是高于拼字符串的,因为如果执行拼字符串的需要内部自动调动oracle机制,先解析字符串映射成SQL语句然后再执行。

 

但是拼SQL的方式有好处。即SQL语句是一个字符串可以动态拼接,根据不同的条件来改变SQL语句,这是直接写SQL所不能达到的。

拼SQL还有个好处就是 v_sql:='select * from tables t where t.c_date=:1 and t.name=:2';  EXECUTE IMMEDIATE v_sql USING '20130304','xiaoming';

可以动态的对参数传递值,这是最大的优势。

 

在PL/SQL中定义一个变量  v_date varchar2,如果直接写SQL可以 直接写变量  v_date

如果是拼SQL则是 v_sql:='select * from tables t where t.c_date='''||v_date||'''';  这样在执行的时候打印出来的SQL就是 select * from tables t where t.c_date=’20130304‘'

如果是v_sql:='select * from tables t where t.c_date='||v_date||'';  这样在执行的时候打印出来的SQL就是 select * from tables t where t.c_date=20130304;  这里c_date如果是varchar2类型,则这里oracle要隐式的进行数字到字符串的转换  ,影响性能

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 --PL/SQL基础1 declare begin dbms_output.('不输出不换行'); dbms_output.put_line('输出并换行'); end; --PL/SQL基础2 declare dig number(20,2); begin select avg(price) into dig from products; dbms_output.put_line('电子产品的平均价格是'||dig); end; --PL/SQL基础3 根据产品编号获得产品对象 --pname products.name%type; pname变量的类型与products.name列的类型一样 declare pid constant products.id%type:=1; --定义常量,初值1 pname products.name%type; pdate products.adddate%type; begin --pid:=1; select name,adddate into pname,pdate from products where id=pid; dbms_output.put_line('产品名称是:'||pname||',日期'||pdate); end; --PL/SQL基础4 根据产品编号获得产品对象 --obj products%rowtype; obj与products表的单行类型一样,可以通过点运算取值obj.price declare obj products%rowtype; begin select * into obj from products where id=&编号; dbms_output.put_line('产品名称是:'||obj.name||',价格:'||obj.price); end; --PL/SQL基础5 条件if declare vid products.id%type; vprice products.price%type; begin vid:=&编号; select price into vprice from products where id=vid; if vprice100 and vprice<=1000 then dbms_output.put_line('价格在100—1000之间'); else dbms_output.put_line('价格在1000以上'); end if; end; --PL/SQL基础5 多条件case begin case '&等级' when 'A' then dbms_output.put_line('优秀'); when 'B' then dbms_output.put_line('合格'); when 'C' then dbms_output.put_line('不合格'); end case; end; select id, name, typeid, price, adddate from products create table students( Id int primary key, sex int ) insert into students select 1,1 from dual union select 2,0 from dual union select 3,1 from dual union select 4,0 from dual union select 5,1 from dual insert into students(Id) values(6) select * from students; select translate(translate('1心1意 3心2意','1','一'),'3','三') from dual; select id,nvl(translate(translate(sex,1,'女'),0,'男'),'未知') from students; select id,case as 性别 from( sele

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值