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

当用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语句中用到的参数个数并且参数名称也匹配?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xsl调用java方法传参_Java中的XSL转换:一种简单的方法

xsl调用java方法传参XSL转换 &#xff08;XSLT&#xff09;是将一个XML文档转换为另一个XML文档的强大机制。 但是&#xff0c;在Java中&#xff0c;XML操作相当冗长和复杂。 即使是简单的XSL转换&#xff0c;也必须编写几十行代码—如果需要适当的异常处理和日志记录&#xff…

C 运算符和语句总结

运算符&#xff1a; C 表达式中的左值和右值&#xff1a;当一个对象被用作左值时&#xff0c;用的是对象的身份&#xff08;内存中的位置&#xff09;。当作为右值时&#xff0c;用的是对象的值&#xff08;内容&#xff09;。或者说&#xff0c;lvalue:具有存贮性质的对象&…

# 遍历结构体_C#学习笔记05--枚举/结构体

一.枚举当变量的取值范围是固定的几个, 例如性别--男,女; 英雄类型 -- 法师, 刺客.战士, 射手等等. 这时就可以使用枚举类型, 会更加简洁方便.1.1.定义:访问修饰符 enum 枚举类型名 {成员1,成员2,成员3,... }public enum Days{Mon 1,Tue,Wed,Thu,Fri,Sat,Sun}enum: 是枚举的…

单例嵌套 ios_嵌套类型的前5个用例

单例嵌套 ios前几天&#xff0c;关于reddit进行了有趣的讨论&#xff0c;即静态内部类。 什么时候太多&#xff1f; 首先&#xff0c;让我们回顾一下Java的基本历史知识。 Java语言提供了四个级别的嵌套类 &#xff0c;通过“ Java语言”&#xff0c;我的意思是这些构造仅是“…

C语言中枚举enum的用法

本文举例说明C语言中enum枚举关键字的用法。用来同时定义多个常量利用enum定义月份的例子如下。#include enum week {Mon1,Tue,Wed,Thu,Fri,Sat,Sun}; int main() {printf("%d",Tue); return 0; }这样定义Mon的值为1之后&#xff0c;Tue的值就被默认定义为2&#…

苹果更新未知错误17_iOS 13 新功能,静音未知来电

果粉俱乐部让科技更好的服务生活点击上方「蓝字」加入我们iOS 13 正式版系统已经推出了快三周时间&#xff0c;苹果在新系统当中带来了诸多功能改进&#xff0c;包括大家盼望已久的深色模式&#xff0c;新的音量调节设置&#xff0c;自定义流量下载限制等等。除此之外&#xff…

C/C 语言中extern的用法

声明外部变量现代编译器一般采用按文件编译的方式&#xff0c;因此在编译时&#xff0c;各个文件中定义的全局变量是互相透明的&#xff0c;也就是说&#xff0c;在编译时&#xff0c;全局变量的可见域限制在文件内部。下面举一个简单的例子。创建一个工程&#xff0c;里面含有…

设置公共请求参数_封装一个useFetch实现页面销毁取消请求

前端业务经常会出现这样一类问题&#xff0c;当用户网速过慢或是其他特殊情况下&#xff0c;该页面的请求还未完成&#xff0c;用户就已经点击其他页面跳出去了。理想状态下请求也是应该终止掉的&#xff0c;所以我们应该想办法将请求和页面卸载关联在一起。1 使用AbortControl…

rx 异步执行耗时_使用rx-java的异步抽象

rx 异步执行耗时对我而言&#xff0c;使用Rx-java的一大好处是&#xff0c;无论底层调用是同步还是异步&#xff0c;因此代码看起来都完全相同&#xff0c;因此该条目的标题也是如此。 考虑一个非常简单的客户代码用例&#xff0c;它执行三个缓慢运行的调用并将结果合并到一个…

C语言中return的各种用法

按初学的理解&#xff0c;return的任务就是返回对应的参数&#xff0c;在外层函数中对这个参数做进一步处理。实际上return的用法不只这些。为调用的函数返回参数值此类应用最为普遍&#xff0c;通常是在一个具有返回值的函数中&#xff0c;返回一个参数值&#xff0c;这个返回…

代码内查找函数引用_叮~~二级操作题 excel常考函数大梳理

1.AND函数格式&#xff1a;AND(logical1,logical2…)功能&#xff1a;and函数是一个逻辑函数&#xff0c;表示同时满足多个条件。通常配合if函数做条件判断&#xff0c;得值为true或者是false。2.OR函数格式&#xff1a;OR(logical1,logical2…)功能&#xff1a;or函数是一个逻…

hazelcast入门教程_Hazelcast入门指南第6部分

hazelcast入门教程这是有关Hazelcast的一系列文章中的第六篇。 如果一个人没有看过过去的五年&#xff0c;请到表中的内容后 &#xff0c;我创建赶上。 本地客户 在上一篇文章之后&#xff0c;我决定要去本地化。 是的&#xff0c;我将演示Hazelcast自己的Java客户端。 Java不…

总结C语言中的数组知识点

数组&#xff1a;只能存放一种数据类型&#xff0c;比如int类型的数组、float类型的数组&#xff0c;里面存放的数据称为“元素”。数组的定义&#xff1a;首先声明数组的类型&#xff0c;然后声明数组元素的个数&#xff0c;也就是定义需要多少存储空间。数组格式与初始化格式…

python学什么版本2020年_2020年了居然还有人在学Python?学python有什么用?

都2020年了居然还有人在学python&#xff1f;学python有什么用&#xff1f;真是气抖冷啊&#xff01;想学习python的小伙伴&#xff0c;可以加裙595227871 领取免费的学习资料为什么选择python&#xff1f;1.行业人才的需求 在过去五年里&#xff0c;呈现出爆发性增长的趋势。今…

主要矛盾和次要矛盾_次要GC,主要GC与完整GC

主要矛盾和次要矛盾在使用Plumbr中的GC暂停检测功能时&#xff0c;我被迫通过大量有关该主题的文章&#xff0c;书籍和演示工作。 在整个旅程中&#xff0c;我多次对次要&#xff0c;主要和完全GC事件的使用&#xff08;误用&#xff09;感到困惑。 这导致了这篇博客文章&#…

action mutation 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

module与moduleCollection你一定要会啊&#xff01;Vuex源码学习(五)加工后的module在组件中使用vuex的dispatch和commit的时候&#xff0c;我们只要把action、mutation注册好&#xff0c;通过dispatch、commit调用一下方法名就可以做到。使用方式vue组件内//in vue componentt…

grunt 插件_从Grunt测试Grunt插件

grunt 插件编写针对grunt插件的测试结果比预期的要简单。 我需要运行多个任务配置&#xff0c;并想通过在主目录中键入grunt test来调用它们。 在第一个任务失败后&#xff0c;咕声通常会退出。 这使得不可能在主项目gruntfile中存储多个失败方案。 从那里运行它们将需要--for…

​嵌入式开发为什么选择C语言?

从语言特点来说C语言有出色的可移植性&#xff0c;能在多种不同体系结构的软/硬平台上运行。简洁紧凑&#xff0c;使用灵活的语法机制&#xff0c;并能直接访问硬件能够直接访问硬件的语言有&#xff1a;汇编和C语言汇编属于低级语言&#xff0c;难以完成一些复杂的功能&#x…

mysql 临时表 heap_mysql优化: 内存表和临时表

由于直接使用临时表来创建中间表&#xff0c;其速度不如人意&#xff0c;因而就有了把临时表建成内存表的想法。但内存表和临时表的区别且并不熟悉&#xff0c;需要查找资料了。一开始以为临时表是创建后存在&#xff0c;当连接断开时临时表就会被删除&#xff0c;即临时表是存…

序列化与反序列化的单例模式_序列化代理模式

序列化与反序列化的单例模式在上一篇文章中 &#xff0c;我谈到了一般的序列化。 这是更加集中的内容&#xff0c;并提供了一个细节&#xff1a; 序列化代理模式 。 这是处理序列化中许多问题的一种好方法&#xff0c;通常是最好的方法。 如果开发人员只想了解这一主题&#xf…