ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle procedure存储过程输入参数之动态sql传入(括号及,逗号的特殊处理

oracle procedure存储过程输入参数之动态sql传入(括号及,逗号的特殊处理

原创 Linux操作系统 作者:wisdomone1 时间:2013-02-01 17:01:36 0 删除 编辑
--某同事说报表sql相关的存储过程的输入参数如传入一个大字符串报错,真是如些吗 
---创建业务表(订单表)所引用的订单类型数据
SQL> create table zidian(order_type varchar2(10));
                                                 
Table created                                    
                                                 
SQL> insert into zidian values('100000');        
                                                 
1 row inserted                                   
                                                 
SQL> insert into zidian values('100001');        
                                                 
1 row inserted                                   
                                                 
SQL> insert into zidian values('100002');        
                                                 
1 row inserted                                   
                                                 
SQL> insert into zidian values('100003');        
                                                 
1 row inserted                                   
                                                 
SQL> insert into zidian values('100004');        
                                                 
1 row inserted                                   
                                                 
SQL> commit;                                     
                                                 
Commit complete      
--创建业务表并插入数据
SQL> create table t_order(order_id int,order_type varchar2(10));                           
                                                               
Table created  

SQL> insert into t_order values(1,'100000');                                               
                                           
1 row inserted                             
                                           
SQL> insert into t_order values(2,'100001');
                                           
1 row inserted                             
                                           
SQL> insert into t_order values(3,'100002');
                                           
1 row inserted                             
                                           
SQL> commit;                               
                                           
Commit complete 
 
SQL> select * from zidian;                                                                                     
                                                                                    
ORDER_TYPE                                                                          
----------                                                                          
100000                                                                              
100001                                                                              
100002                                                                              
100003                                                                              
100004                                                                              
                                                                                    
SQL> select * from t_order;                                                         
                                                                                    
                               ORDER_ID ORDER_TYPE                                  
--------------------------------------- ----------                                  
                                      1 100000                                      
                                      2 100001                                      
                                      3 100002                                      
                                                                                    
SQL> ---实现filter掉order_type为100000的订单数据                                    
SQL> select * from t_order where order_type in ('100001','100002','100003','100004');
                                                                                    
                               ORDER_ID ORDER_TYPE                                  
--------------------------------------- ----------                                  
                                      2 100001                                      
                                      3 100002   
                                     
---如果用存储过程又如何实现上述功能呢
SQL> create or replace procedure proc_filter(in_filter varchar2)                                                                         
  2  as                                                                                                                                              
  3  v_sql varchar2(4000);                                                          
  4  v_cnt pls_integer;                                                             
  5  begin                                                                          
  6    v_sql:='select count(*) from t_order where order_type in'||in_filter;        
  7    dbms_output.put_line(v_sql);                                                 
  8    execute immediate v_sql into v_cnt;                                          
  9    dbms_output.put_line(v_cnt);                                                 
 10  end;                                                                           
 11  /                                                                              
                                                                                    
Procedure created                                                                   
                                                                                                                           
SQL> exec proc_filter('(''100001'',''100002'',''100003'',''100004'')');             
                                                                                    
select count(*) from t_order where order_type in('100001','100002','100003','100004')
2                                                                                   
                                                                                    
PL/SQL procedure successfully completed                                             
 
小结;1,还是转义字符的使用
       

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-753763/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
提供针对oracle初学者及进阶的数据库培训,欢迎大家咨询: 微信: wisdomone 微信公众号: lovedb 工作经历: 中国普天 北京科蓝 北京云和恩墨 北京神州新桥

注册时间:2008-04-04

  • 博文量
    2189
  • 访问量
    12690159