碰到一个棘手存储过程拼接字符串的问题
create or replace package body LogOperation2 is
procedure pLog_system_sel
(
plistLog out listlog,
pPageSize in integer,
pPageCurrent in integer,
pRowCount out integer,
pPageCount out integer,
pStartTime in nvarchar2,
pEndTime in nvarchar2,
OrganUnitName in nvarchar2,
OrderNo in nvarchar2
)
as
sqlstr varchar2(1000);
pBegRow integer;
pEndRow integer;
startTime date;
endTime date;
begin
--定义开始和结束行数
pBegRow := (pPageCurrent - 1) * pPageSize + 1;
pEndRow := pPageCurrent * pPageSize;
--日期不为空,把字符串转换成日期
if(length(pStartTime) > 0) and (length(pEndTime) > 0) then
startTime := to_date(concat(pStartTime,' 00:00:01'),'yyyy-mm-dd hh24:mi:ss');
endTime := to_date(concat(pEndTime,' 23:59:59'),'yyyy-mm-dd hh24:mi:ss');
end if;
--开始确认行数
sqlstr := 'select count(1) into :pRowCount from Log_system a where 1 = 1 ';
--时间
if(length(pStartTime) > 0) and (length(pEndTime) > 0) then
sqlstr := sqlstr || ' and a.ExamineDate between '|| startTime ||' and '|| endTime;
end if;
--名称
if length(OrganUnitName) > 0 then
sqlstr := sqlstr || ' and b.UnitName like ''%' ||OrganUnitName|| '%''';
end if;
--单号
if length(OrderNo) > 0 then
sqlstr := sqlstr ||' and c.OrderNo like ''%'||OrderNo || '%''';
end if;
execute immediate sqlstr into pRowCount;
--计算页数
if pRowCount = 0 then
pPageCount := 0;
else
pPageCount := ceil(pRowCount * 1.0 / pPageSize) ;
end if;
--结果集
sqlstr := 'select * from (';
sqlstr := sqlstr || 'select rownum as rn,a.Examine_ID,a.User_ID,Status_ID,ExamineRemark,ExamineDate,';
sqlstr := sqlstr || ' OrderNo from Log_system where 1=1';
--时间
if(length(pStartTime) > 0) and (length(pEndTime) > 0) then
sqlstr := sqlstr || ' and ExamineDate between '|| startTime ||' and '|| endTime;
end if;
--单位名称
if length(OrganUnitName) > 0 then
sqlstr := sqlstr || ' and OrganUnitName like ''%' ||OrganUnitName|| '%''';
end if;
--订单号
if length(OrderNo) > 0 then
sqlstr := sqlstr ||' and OrderNo like ''%'||OrderNo || '%''';
end if;
sqlstr := sqlstr || ' )where rn between :pBegRow and :pEndRow';
pMsg := sqlstr;
open plistLog for sqlstr using pBegRow,pEndRow;
end;
end;
现在问题是,因为where后面的条件是动态拼接的,如果没有那个条件的话,就不会出现在sqlstr字符串中,那么execute immediate 后面的into和open plistLog后面的using也同时需要做出调整,否则会出现,参数不符合的错误,是不是into后面的和using也能动态拼接?
...全文
相关推荐
存储过程拼接字符串
在SQL语言中,存储过程是一种预编译的SQL语句集合,它可以包含复杂的逻辑和控制流,用于执行数据库中的重复性任务。当我们需要在存储过程中拼接字符串时,通常是为了解决动态SQL构造或者生成报告等需求。
SqlServer存储过程实现及拼接sql的注意点
为了解决这个问题,我们需要确保所有变量都以字符串形式表示,并正确地用单引号括起字符串类型的变量。
java拼接字符串时去掉最后一个多余逗号的方法
本篇文章将详细介绍如何在Java中拼接字符串时去除最后一个多余的逗号。
MyBatis 动态拼接Sql字符串的问题
在处理SQL时,动态SQL功能是MyBatis的一大亮点,它有效地解决了SQL字符串拼接的问题,避免了手动拼接带来的错误和复杂性。1.
for循环中如何正确使用字符串拼接
`StringUtils.join`: 这是Apache Commons Lang库中的一个方法,它接受多个字符串作为参数并拼接成一个字符串。


