|
原帖由 封烨 于 2009-7-14 16:46 发表 ![]()
首先感谢楼主的分享~
我有个问题,类似12楼的情况,在存储过程中,要查询的语句是动态的。我尝试使用绑定变量,但绑定变量只是相当于把值赋值给变量,而不会去执行“查询”,我把SQL贴出来:
insert_str := '
INSERT INTO bam_cbbs_base_kpi_sum_l2_l(busi_id
, user_type
, chrg_prov_id
, oper_time
, base_kpi_id
, value
, dimension_level
, is_valid
, created
, modified
)
';
select_str := '
SELECT :busi_id
, user_type
, rov_name
, SUBSTR(curr_deal, 1, 6)
, :kpi_id
, :sum_str
, 5
, 1
, sysdate
, sysdate
FROM :tab
AND SUBSTR(curr_deal, 1, 6) = to_char(:time)
GROUP BY substr(curr_deal,1,6),user_type, rov_name
';
execute immediate insert_str || select_str using busi_id,prov_id,kpi_id(i),sum_str,curr_deal;
这个语句执行后,会把对应的表达式赋值给绑定变量,但却没任何记录返回,因为他只简单的赋值了,却没执行select操作。但是如果这个绑定变量的内容是数据库某条记录的一个值,却可以。如select * from tab1 where a = :a;这个a是个值,如'123','abc'什么的,都可以。
我为了解决上述的问题,我想了一个笨办法。
我先通过tmp_str := 'select rov_name from dual';
execute immediate tmp_str into new_prov_str using prov_name(i);
的办法获得这个new_str,然后上面的查询语句改成了绑定变量+拼接字符串的形式。如:
select_str := '
SELECT :busi_id
, user_type
, '||new_prov_str||'
, SUBSTR(curr_deal, 1, 6)
, :kpi_id
, '||new_sum_str||'
, 5
, 1
, sysdate
, sysdate
'||new_where_str||'
AND SUBSTR(curr_deal, 1, 6) = to_char(:time)
GROUP BY substr(curr_deal,1,6),user_type,'||new_prov_str||'
';
但是这个办法其实是“错误的”,并没有用到绑定变量的特性。而是有点蒙混过关的感觉,呵呵。
不知道大家有没明白我说的?
扼要的说:绑定变量,如果其内容是个表达式的话,应该如何使用绑定变量?
其实,我不建议你这么做;
原因是你用在Store-Procedure中;只要写在Store-procedure,Oracle 系统现在都自动帮你把你写的Sql,转义成你要用的绑定变量;尤其Oralce9i以后的版本;当然Oracle 8I以前的版本是无法做到的;
我强烈建议你用静态绑定;你的动态绑定会花费更多的资源,且效率有可能并是你想的那么好;
另外,你想知道是否Oracle在使用绑定变量,其实我在文章已经说的很清楚了; |
|