|
本帖最后由 samt007 于 2017-3-10 11:30 编辑
不过,版主,我跟踪SQL的时候,倒是发现了另外一个问题:
execute immediate L_PLSQL 这个步骤本身就会消耗资源去解析L_PLSQL。并且这个硬解析是无法公用的。因为有一些参数的值直接拼到动态SQL里面了。
这样子,执行一个动态SQL脚本:
PLSQL(游标产生)的时候会硬解析一次,游标的SQL执行返回数据的时候又会解析一次。
关键是PLSQL游标产生这个步骤是无法公用的,所以~还是有点麻烦,不知道有没有破解办法。主要还是USING后面带的参数必须是固定的,麻烦的。。。唉。------暂时的一个解决办法就是:
因为考虑到90%情况下都是10个绑定变量以内的。所以,先判断判断变量个数,如果小于10个的,则自动补到10个,就是为了满足Using的输入绑定变量个数固定的限制。
这样子,Using后面的绑定变量就可以固定了。
当然,固然超过10个的,则还是按照以前的逻辑处理。
下面的例子就是测试9个绑定变量的情况,程序自动生成的产生游标的动态PLSQL。最后一个输入绑定变量L_10只是一个空值的占位符。- DECLARE
- L_CUR sys_refcursor;
- L_1 VARCHAR2(29);
- L_2 VARCHAR2(28);
- L_3 VARCHAR2(13);
- L_4 NUMBER;
- L_5 NUMBER;
- L_6 NUMBER;
- L_7 NUMBER;
- L_8 NUMBER;
- L_9 NUMBER;
- L_10 VARCHAR2(30);
- BEGIN
- L_1 := :1;
- L_2 := :2;
- L_3 := :3;
- L_4 := :4;
- L_5 := :5;
- L_6 := :6;
- L_7 := :7;
- L_8 := :8;
- L_9 := :9;
- L_10 := :10;
- OPEN L_CUR FOR q'[SELECT MAKE_DATE "生产日期"
- ,WIP_ENTITY_NAME "任务单"
- ,RT_NAME "地区"
- ,LEVEL_TAG "层标"
- ,XYG_MODEL "产品型号"
- ,CHALFTONE "通用网板"
- ,OPERATION_DESCRIPTION "生产工序描述"
- ,JOB_QUANTITY "下单数"
- ,SUGGEST_QUANTITY "订单数"
- ,ORDER_QUANTITY "总合同数"
- ,RESERVE_PIECE "内仓数量"
- ,MOVE_TYPE "移动方向"
- ,CUR_TRX_QUANTITY "完工"
- ,CUR_TRX_SQM "完工面积"
- ,CUR_DLV_QUANTITY "移交"
- ,CUR_RETIRE_QUANTITY "报废"
- ,FACTORY_DESC "厂区描述"
- ,WORKSHOP_DESC "生产线描述"
- ,GROUP_CODE "班组代码"
- ,GROUP_DESC "班组描述"
- ,MAIN_OPERATOR "主操手"
- ,EQUIPMENT "设备代码"
- ,EQUIPMENT_DESC "生产设备"
- ,IN_INSTEAD "内片优化"
- ,EX_INSTEAD "外片优化"
- ,DESCRIPTION "备注"
- ,SPEC "规格"
- ,HEIGHT "厚度"
- ,GLASSSORT "玻璃分类"
- ,N_LEVEL "层数"
- ,OEMNO "OEM编号"
- ,CONTRACT_NUMBER "合同号"
- ,PACK_NO "包装单号"
- ,COATED "镀膜"
- ,CMOULD "通用模具"
- ,CMATERIAL "通用素板"
- ,CREATION_DATE "创建日期"
- ,MOVE_ATTRIB_DESC "生产属性"
- ,MOVE_RETURN_TYPE_DESC "反向原因"
- ,PACKING_ATTRIB_DESC "包装属性"
- ,HOLE "单位孔数"
- FROM XYG_WIP_MOVE_TRANSACTION_V
- WHERE 1=1
- AND (MAKE_DATE BETWEEN to_date( :1 , 'YYYY/MM/DD HH24:MI:SS')
- AND to_date( :2 , 'YYYY/MM/DD HH24:MI:SS'))
- and (FACTORY= :3 )
- and (ORGANIZATION_ID= :4 )
- and (ORGANIZATION_ID= :5 )
- and (ORGANIZATION_ID= :6 )
- and (ORGANIZATION_ID= :7 )
- and (ORGANIZATION_ID= :8 )
- and (ORGANIZATION_ID= :9 )
- order by LINE_ID]' USING L_1,L_2,L_3,L_4,L_5,L_6,L_7,L_8,L_9 ;
- :X_CUR :=L_CUR;
- END;
复制代码
|
|