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語句中用到的參數個數并且參數名稱也匹配?
總結
以上是生活随笔為你收集整理的oracle 执行带参数的sql语句_当用EXECUTE IMMEDIATE执行SQL语句中的参数个数也是动态的?用什么方法实现?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓4.3系统怎么升级到5.0(安卓4.
- 下一篇: # 遍历结构体_C#学习笔记05--枚举