该存储过程如何改成绑定变量的方式?
环境:linux6.6+oracle11.2.0.4
某存储过程代码如下:
create or replace procedure sp_test IS
TYPE myCur IS REF CURSOR;
TmpCur myCur;
tcur myCur;
vTasknodeID varchar2(64);
vTaskDefineID varchar2(64);
vReceiverDefineID varchar2(64);
vReceiverTime DATE;
vProccessID varchar2(64);
nLimitTime NUMBER;
vSql varchar2(1024);
--得到取得获取时间的ID
CURSOR getReceiverDefineID(vCurNodeID varchar2) IS
SELECT nd.fldreceivetimedefineid FROM test_define nd WHERE nd.fldid = vcurNodeID;
BEGIN
OPEN TmpCur FOR 'SELECT n.fldid FROM test n WHERE n.fldisdone <> ''' || 1 || ''' OR n.fldisdone IS NULL ';
FETCH Tmpcur INTO vTasknodeID;
WHILE TmpCur%FOUND LOOP
--根据当前的环节ID来处理
vsql := 'SELECT n.flddefineid,n.fldreceivetime,n.fldprocessid FROM test n WHERE n.fldid = ''' || vTasknodeID || '''';
OPEN tcur FOR vsql;
FETCH tcur INTO vTaskDefineID,vReceiverTime,vProccessID;
CLOSE tcur;
--看这个环节是否需要从其他环节得到接收时间;
OPEN getReceiverDefineID(vTasknodeID);
FETCH getReceiverDefineID INTO vReceiverDefineID;
CLOSE getReceiverDefineID;
IF vReceiverDefineID IS NOT NULL THEN
--则从定义的环节得到时间;
SELECT n.fldreceivetime INTO vReceiverTime FROM test n
WHERE n.fldprocessid = vProccessID AND n.flddefineid = vReceiverDefineID;
END IF;
--计算历时
SELECT ROUND((SYSDATE - to_date(vReceiverTime,'yyyy-mm-dd hh24:mi:ss')) * 24,2) INTO nLimitTime FROM dual;
--将历时写入到数据库中
IF vReceiverDefineID IS NOT NULL THEN
--说明这些环节都计算为同一个环节;
UPDATE test n SET n.fldlimittime = nLimitTime WHERE n.fldprocessid = vProccessID AND n.flddefineid IN (
SELECT nd.fldid FROM test_define nd WHERE nd.fldreceivetimedefineid = vReceiverDefineID );
ELSE
--就更改当前的环节的历时信息即可
UPDATE test n SET n.fldlimittime = nLimitTime WHERE n.fldid = vTasknodeID;
END IF;
FETCH Tmpcur INTO vTasknodeID;
END LOOP;
CLOSE TmpCur;
COMMIT;
end sp_test;
存储过程运行频繁,红色代码导致大量的硬解析,如何改写成绑定变量的方式?谢谢!