在存储过程中,我想根据条件拼装sql,这个时候select xx into v_xx这样就不行了,返回不了值。要使用
execute immediate v_sql into v_access_number;
create or replace procedure p_access_user
(
v_starttime in varchar2,
v_endtime in varchar2,
v_adjusttype in varchar2,
v_results in varchar2,
v_province in varchar2,
v_access_number out adjust_power_transaction_his.id%type
)
is
v_char_16 varchar2(20);
v_char_two_16 varchar2(20);
v_like varchar2(20000);
v_sql varchar2(25000):='select count(*)from adjust_power_transaction_his t where 1=1 ';
begin
--时间段
if(v_starttime is not null and v_endtime is not null) then
v_sql:=v_sql||' and t.begintime>= to_date('''||v_starttime||''',''yyyy-MM-dd hh24:mi:ss'')'||'and t.begintime<=to_date('''||v_endtime||''',''yyyy-MM-dd hh24:mi:ss'')';
end if;
--校准方式
if(v_adjusttype is not null)then
v_sql:=v_sql||' and t.adjusttype='||v_adjusttype||'';
end if;
--校准处理结果
if(v_results is not null)then
v_sql:=v_sql||' and t.result= '''||v_results||'''';
end if;
--省份
if(v_province is not null)then
select to_char(v_province,'xxx') into v_char_16 from dual;
if length(trim(v_char_16)) = 1
then
v_char_two_16 :='0'||trim(v_char_16);
else
v_char_two_16 := trim(v_char_16);
end if;
v_like := upper('01'||v_char_two_16||'%');
v_sql:=v_sql||' and t.cardno like'''|| v_like||'''';
end if;
--接入用户统计
execute immediate v_sql into v_access_number;
--dbms_output.put_line(v_sql);
end p_access_user;