日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2023/12/2 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 执行带参数的sql语句_当用EXECUTE IMMEDIATE执行SQL语句中的参数个数也是动态的?用什么方法实现?... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

當(dāng)用EXECUTE IMMEDIATE執(zhí)行SQL語(yǔ)句中的參數(shù)個(gè)數(shù)也是動(dòng)態(tài)的?用什么方法實(shí)現(xiàn)?

描述詳細(xì)一點(diǎn)就是:在要執(zhí)行的SQL語(yǔ)句中所用到(: parameter)這種參數(shù)的個(gè)數(shù),因具體條件不同,而不同,而在執(zhí)行語(yǔ)句EXECUTE IMMEDIATE中USING后邊如何動(dòng)態(tài)與前邊的個(gè)數(shù)相匹配?

例子如下:

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

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

*功能:??出租面積計(jì)算組件? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? *

*參數(shù):樓盤(pán)ID,樓宇I(lǐng)D,物業(yè)類(lèi)型,客戶(hù),日期從,日期到

*返回值: 出租面積? ? ? ? ? ? ? ? ? ? ? ?? ?? ?? ?? ?? ?? ?? ?*

*創(chuàng)建日期: 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語(yǔ)句

e_DateNUll? ?? ?? ?? ???EXCEPTION;? ?? ?? ?? ?? ?--錯(cuò)誤變量

TYPE t_arr IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER; --定義數(shù)組

v_Con_Arr? ?? ?? ?? ?? ?t_arr;? ?? ?? ?? ?? ?? ? --保存查詢(xún)參數(shù)

v_Month? ?? ?? ?? ?? ???INTEGER;? ?? ?? ?? ?? ???--DATEFROM與DATATO間隔的月的個(gè)數(shù)

BEGIN

--若DATEFROM與DATATO為NULL則引發(fā)錯(cuò)誤

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

RAISE e_DateNUll;

END IF;

-- 取得DATEFROM與DATATO間隔的月的個(gè)數(shù)

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';

--加樓盤(pán)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;

--加樓宇I(lǐng)D條件

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;

--加物業(yè)類(lèi)型條件

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;

--加客戶(hù)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;

--全部語(yǔ)句

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;

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

特別說(shuō)明:

原來(lái)我是照上邊那樣做的,最后發(fā)現(xiàn)不行,因?yàn)樵赟ELECT語(yǔ)句中有幾個(gè)DECODE函數(shù),會(huì)用到參數(shù),而用到參數(shù)的個(gè)數(shù),根據(jù)數(shù)據(jù)的實(shí)際情況會(huì)有所不同,故我下邊的EXECUTE IMMEDIATE語(yǔ)句中USING子句后的參數(shù)沒(méi)辦法寫(xiě)?怎樣才能根據(jù)實(shí)際的條件自動(dòng)匹配SELECT語(yǔ)句中用到的參數(shù)個(gè)數(shù)并且參數(shù)名稱(chēng)也匹配?

總結(jié)

以上是生活随笔為你收集整理的oracle 执行带参数的sql语句_当用EXECUTE IMMEDIATE执行SQL语句中的参数个数也是动态的?用什么方法实现?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。