当用EXECUTE IMMEDIATE执行SQL语句中的参数个数也是动态的?用什么方法实现?

描述详细一点就是:在要执行的SQL语句中所用到(: parameter)这种参数的个数,因具体条件不同,而不同,而在执行语句EXECUTE IMMEDIATE中USING后边如何动态与前边的个数相匹配?

例子如下:

CREATE OR REPLACE PROCEDURE p_RentAreaCalcu

(pFloorId IN VARCHAR2, pBldgId in  VARCHAR2,pRoomStyle IN VARCHAR2,

pAccountId IN VARCHAR2,pDateFrom IN DATE,pDateTo IN DATE,

pArea OUT NUMBER)

AS

/************************************************************

*功能:  出租面积计算组件                                     *

*参数:楼盘ID,楼宇ID,物业类型,客户,日期从,日期到

*返回值: 出租面积                                            *

*创建日期: 2002-11-19

*修改日期: 2002-11-19

*作者: xy                                                                                                *

*************************************************************/

v_SQL_Select            VARCHAR(1000);

v_SQL_From              VARCHAR(1000);

v_SQL_Where             VARCHAR(1000);

v_SQL                   VARCHAR(3000);

v_Condition             INTEGER;                 --跟踪SQL语句

e_DateNUll              EXCEPTION;               --错误变量

TYPE t_arr IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER; --定义数组

v_Con_Arr               t_arr;                   --保存查询参数

v_Month                 INTEGER;                 --DATEFROM与DATATO间隔的月的个数

BEGIN

--若DATEFROM与DATATO为NULL则引发错误

IF (pDateFrom IS NULL) OR (pDateTo IS NULL) THEN

RAISE e_DateNUll;

END IF;

-- 取得DATEFROM与DATATO间隔的月的个数

SELECT TRUNC(MONTHS_BETWEEN(pDateTo,pDateFrom),0)-1

INTO v_Month

FROM DUAL;

--加日期条件

v_Condition : = 0;

v_SQL_Select : =' SELECT '||

' SUM(TO_NUMBER(DECODE(SIGN(MONTHS_BETWEEN(: pDatefrom,a.begindate)),-1,'||'(TO_CHAR(LAST_DAY(a.begindate),''dd'')- TO_CHAR(a.begindate,''dd''))/TO_CHAR(LAST_DAY(a.begindate),''dd''),'||'(TO_CHAR(LAST_DAY(: pDatefrom),''dd'')- TO_CHAR(: pDatefrom,''dd''))/TO_CHAR(LAST_DAY(: pDatefrom),''dd'')))*b.leasearea +'|| 'b.leasearea*v_Month +'||

'TO_NUMBER(DECODE(SIGN(MONTHS_BETWEEN(: pDateto,a.finishdate)),-1,'||

'TO_CHAR(: pDateto,''dd'')/TO_CHAR(LAST_DAY(: pDateto,''dd''),'||

'DECODE(a.finishdate,'||

'NULL,'||

'TO_CHAR(: pDateto,''dd'')/TO_CHAR(LAST_DAY(: pDateto,''dd''),'||

'TO_CHAR(a.finishdate,''dd'')/TO_CHAR(LAST_DAY(a.finishdate,''dd''))))*b.leasearea)';

v_SQL_From : = ' FROM Lbs_conroom a,'||

' lbs_contract b';

v_SQL_Where : = ' WHERE UPPER(b.constatus) = ''PUB017002'''||

' AND b.excflag = ''1'''||

' AND a.begindate <= : pDateto'||

' AND (a.finishdate >= : pDatefrom or a.finishdate IS NULL';

--加楼盘ID条件

IF  pFloorId IS NOT NULL THEN

v_Condition : = v_Condition + 1;

v_Sql_Where : = v_Sql_Where || ' AND b.mainfloor = : pFloorId';

v_Con_Arr(v_Condition) : = pFloorId;

END IF;

--加楼宇ID条件

IF  pBldgId IS NOT NULL THEN

v_Condition : = v_Condition + 1;

v_Sql_From : = v_Sql_From ||',fm_bldginf c';

v_Sql_Where : = v_Sql_Where || ' AND b.mainfloor = c.floorid AND  c.BldgId = : pBldgId';

v_Con_Arr(v_Condition) : = pBldgId;

END IF;

--加物业类型条件

IF pRoomStyle IS NOT NULL THEN

v_Condition : = v_Condition + 1;

v_Sql_Where : = v_Sql_Where|| ' AND b.roomstyle = : pRoomStyle';

v_Con_Arr(v_Condition) : = pRoomStyle;

END IF;

--加客户ID条件

IF pAccountId IS NOT NULL THEN

v_Condition : = v_Condition + 1;

v_Sql_Where : = v_Sql_Where ||' AND b.accountid = : pAccountId';

v_Con_Arr(v_Condition) : = pAccountId;

END IF;

--全部语句

v_SQL : = v_Sql_Select||v_Sql_Select||v_Sql_Where;

--得到出租面积

IF v_Condition = 0 THEN

EXECUTE IMMEDIATE v_SQL INTO pArea USING pDateFrom,pDateTo;

ELSIF v_Condition =1 THEN

EXECUTE IMMEDIATE v_SQL INTO pArea USING pDateFrom,pDateTo,v_Con_Arr(1);

ELSIF v_Condition =2 THEN

EXECUTE IMMEDIATE v_SQL INTO pArea USING pDateFrom,pDateTo,v_Con_Arr(1),v_Con_Arr(2);

ELSIF v_Condition =3 THEN

EXECUTE IMMEDIATE v_SQL INTO pArea USING pDateFrom,pDateTo,v_Con_Arr(1),v_Con_Arr(2),v_Con_Arr(3);

ELSIF v_Condition =4 THEN

EXECUTE IMMEDIATE v_SQL INTO pArea USING pDateFrom,pDateTo,v_Con_Arr(1),v_Con_Arr(2),v_Con_Arr(3),v_Con_Arr(4);

END IF;

--failure

EXCEPTION

WHEN e_Datenull THEN

ROLLBACK;

pArea : =NULL;

WHEN OTHERS  THEN

ROLLBACK;

pArea : =NULL;

END p_RentAreaCalcu;

****************

特别说明:

原来我是照上边那样做的,最后发现不行,因为在SELECT语句中有几个DECODE函数,会用到参数,而用到参数的个数,根据数据的实际情况会有所不同,故我下边的EXECUTE IMMEDIATE语句中USING子句后的参数没办法写?怎样才能根据实际的条件自动匹配SELECT语句中用到的参数个数并且参数名称也匹配?

oracle 执行带参数的sql语句_当用EXECUTE IMMEDIATE执行SQL语句中的参数个数也是动态的?用什么方法实现?...相关推荐

  1. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  2. 两个sql交集_如何使用性能分析工具定位SQL执行慢的原因?

    在前面的文章中就讲过了查询优化器,知道在查询优化器中会经历逻辑查询优化和物理查询优化.需要注意的是,查询优化器只能在已经确定的情况下(SQL 语句.索引设计.缓冲池大小.查询优化器参数等)决定最优的查 ...

  3. 数据库逻辑删除的sql语句_通过数据库的眼睛查询sql的逻辑流程

    数据库逻辑删除的sql语句 Structured Query Language (SQL) is famously known as the romance language of data. Eve ...

  4. tp5循环查询语句_如何用Excel快速生成SQL语句,用过的人都说好

    Excel的公式自动生成想必大家都知道了,就是写好一个公式后直接往下拖,就可以将后面数据的公式自动生成. 今天我们就用这个功能来快速生成SQL语句. 导入Excel数据 Excel的数据有多种方式,这 ...

  5. sql删除语句_推荐强大开源的数据库SQL语句审核平台,再也不用担心删除跑路了!...

    删除数据库跑路,本来是一个调侃的话语,但是前段时间在互联网圈子真的发生过,震动整个圈子,为了避免此类悲剧再次发生,现推荐一个强大的开源SQL语句管理平台,具体的功能如下: 用户模块 1.Dashboa ...

  6. mysql存储过程判断多个条件语句_存储过程里多条件判断(SQL组合查询)

    我存储过程里想实现多个传入参数的判断,里面有7个传入参数条件. CREATE PROCEDURE sp_tbWasteSource_Search ( @sd   datetime,           ...

  7. mysql更改密码的sql语句_修改mysql登录密码与sql语句介绍

    修改mysql登录密码: 在使用数据库服务器过程中可能会因为种种原因忘记了登录密码,或者需要使用别人的数据库服务器,别人却忘记了登录密码等等. 忘记密码有两种方式可以解决,一是通过sql语句修改登录密 ...

  8. python的if循环语句_第二个是Python的循环语句,基础,使用,if,条件,判断,while,for

    条件判断语句 Python里的条件判断语句有if.if--else和if--elif--elif--else if条件判断语法格式 if 条件判断: 条件成立,执行此处代码 例:输入年龄,判断是否成年 ...

  9. python函数的参数可以接收哪些类型的数据_python强势来袭-0015-函数中的参数-送礼开始...

    接上一讲,这节我们专门介绍python函数的参数处理 本节主要内容 函数的形式参数和实际参数 函数的参数定义规则 函数参数的默认值 函数的可变参数 函数的关键字参数 函数的命名关键字参数 1.3. 函 ...

最新文章

  1. 在线作图|微生物多样性分析——物种累计曲线
  2. javascript正则表达式介绍
  3. 深入理解ASCII,Unicode和UTF-8编码
  4. 判断多个点在多边形内的在线算法
  5. HTTPSession对象知识总结
  6. 关于meta的各种用处以及移动端的常见问题
  7. 工程师文化播客: 从工程转向管理,访谈Github公司的Phil Haack
  8. springboot 拦截器_Spring Boot入门系列(十)如何使用拦截器,一学就会!
  9. C# 之 Int16 Int32 Int64 的区别
  10. 如何破解几乎所有的求职面试
  11. 合并两个有序数组python_合并两个有序数组.py
  12. 为什么这几年餐饮创业突然火起来了?
  13. grafana将自己的数据库(hbase)设置为数据源
  14. pyQT5 designer5.15.0的汉化问题,如何解决
  15. 维宏控制卡win7 驱动_维宏雕刻机控制卡驱动
  16. OGRE: Ogre第一个程序
  17. IJCAI2022推荐系统论文集锦
  18. oracle utl_http.request,通过ORACLE的UTL_HTTP工具包发送包含POST参数的请求
  19. 如何更新您的Nintendo Switch
  20. 一种新兴计数方式-视觉计数

热门文章

  1. JDK 10:从Java访问Java应用程序的进程ID
  2. java 工厂方法模式_Java中的工厂方法模式
  3. 不要讨厌HATEOAS Part Deux:HATEOAS的春天
  4. 使用Project Lombok减少Java应用程序中的样板代码
  5. 区分基于Ant目标的Gradle任务
  6. Heroku和Java –从新手到初学者,第2部分
  7. Java –手工Classloader隔离
  8. Maven Fluido Skin和Javadoc类图
  9. 使用ReportNG更好看的TestNG HTML测试报告– Maven指南
  10. 3650m5设置u盘启动_系统重装必备神器,U盘如何制作启动盘?