Решавам го, без да използвам EXECUTE IMMEDIATE
, не знам дали това решение се счита за динамичен SQL или не, най-трудната част беше обединяването на тази голяма сложна заявка в низова променлива.
ЗАДАВАНЕ НА SERVEROUTPUT НА РАЗМЕР 1000000;ДЕКЛАРИРАНЕ--FIRST DAY YEARv_SG_FYEAR VARCHAR(50);--FIRST DAY MONTHv_SG_FMNTH VARCHAR(50);--FIRST DAY START DAYv_SG_FDAY VARCHAR(50);--LAST DAY MONTHv_SG_LYEAR VARCHAR (50);--ПОСЛЕДЕН ДЕН MONTHv_SG_LMNTH VARCHAR(50);--ПОСЛЕДЕН ДЕН START DAYv_SG_LDAY VARCHAR(50);v_JOBID номер(20);v_PRM_TABLE1 varchar(200);v_PRM_TABLE2 varchar(200);--създаване на тип данни t_rec е запис (SGSN_DATE VARCHAR2(200), SGSN_MB VARCHAR2(200), PRM_MNTH VARCHAR2(200), PRM_ACT_MB VARCHAR2(200), PRM_RND_MB VARCHAR2(200), PRM_CHRG_USD VARCHAR2(200));v_REC t_rec;C1 sys_refcursor;v_sql7 varchar7(3) );BEGIN/*Получаване на последния JOB_ID*/SELECT MAX(JOB_ID) INTO v_JOBID от ON_SGSN_TAPOUT;случай, когато v_JOBID Е NULL, тогава v_JOBID:=1; когато v_JOBID НЕ Е NULL, ТОГАВА ИЗБЕРЕТЕ MAX(JOB_ID)+1 INTO v_JOBID FROM ON_SGSN_TAPOUT; END CASE;v_SG_FYEAR:=TO_CHAR(TRUNC(SYSDATE,'MM')-1,'YYYY');v_SG_FMNTH:=TO_CHAR(TRUNC(SYSDATE,'MM')-1,'MM');v_SG_FDAY:='01 ';v_SG_LYEAR:=TO_CHAR(TRUNC(SYSDATE,'MM')-1,'YYYY');v_SG_LMNTH:=TO_CHAR(TRUNC(SYSDATE,'MM')-1,'MM');v_SG_LDAY:=TO_CHAR(TRUNC (SYSDATE,'MM')-1,'DD');v_PRM_TABLE1:='prmdb.CDR_TAPOUT_'||v_SG_FYEAR||v_SG_FMNTH||'@prmdb';v_PRM_TABLE2:='prmdb.CDR_TAPOUT_'||TO_CHAR(SYSDATE, 'YYYYMM')||'@prmdb';/*поставяне на SQL заявката в променлива*/v_sql:='select * from('|| 'select * from ('|| 'SELECT TO_CHAR(START_TIME,''YYYYMMDD) '') AS "SGSN_DATE",'|| 'SUM(SUM_UP_DOWN/1024/1024) SGSN_MB'|| ' ОТ [email protected]
'|| ' WHERE START_TIME BETWEEN TO_DATE('''||v_SG_FMNTH||'/'||v_SG_FDAY||'/'||v_SG_FYEAR||' '||'00:00:00'||''','|| '''мм/дд/гггг чч24:ми:сс'||''')'||' И TO_DATE('''||v_SG_LMNTH||'/'||v_SG_LDAY||'/'||v_SG_LYEAR||' '||'23:59:59'||''','||''' мм/дд/гггг чч24:ми:сс'||''')'||' ГРУПИРАНЕ ПО TO_CHAR(START_TIME,''YYYYMMDD'')) A '||'ляво външно съединение '|| '('||'изберете PRM_MNTH,PRM_ACT_MB,PRM_RND_MB,PRM_CHRG_USD от ('||'изберете PRM_MNTH,SUM(PRM_ACT_MB) PRM_ACT_MB,SUM(PRM_RND_MB) PRM_RND_MB,SUM(USDPRM_CHRG_) PRM_CHRG_USD от ('|| 'изберете substr(START_TIME) ,1,8) PRM_MNTH,sum(TOTAL_BYTE)/1024/1024 PRM_ACT_MB, sum(charged_units)/1024/1024 PRM_RND_MB, sum(tap_fee_usd) PRM_CHRG_USD'|| ' from '|| v_PRM_TABLE1 || ' където start_time между ''' ||v_SG_FYEAR||v_SG_FMNTH||v_SG_FDAY||'000000'' и '''||v_SG_LYEAR||v_SG_LMNTH||v_SG_LDAY||'235959'''|| ' и CDR_TYPE в (''GPRSO'') '| | ' група по substr(START_TIME,1,8) '|| ' UNION ALL '|| ' изберете substr(START_TIME,1,8) PRM_MNTH,sum(TOTAL_BYTE)/1024/1024 PRM_ACT_MB, sum(charged_units)/1024/ 1024 PRM_RND_MB, sum(tap_fee_usd) PRM_CHRG_USD '|| ' от '||v_PRM_TABLE2|| ' където начален_час между '''||v_SG_FYEAR||v_SG_FMNTH||v_SG_FDAY||'000000'' и '''||v_SG_LYEAR|| v_SG_LMNTH||v_SG_LDAY||'235959'''|| ' и CDR_TYPE в (''GPRSO'')'|| ' група по substr(START_TIME,1,8))'|| ' група по'|| ' PRM_MNTH )'|| ') B'|| ' НА A.SGSN_DATE=B.PRM_MNTH)'; ОТВОРЕТЕ C1 ЗА v_sql; LOOP FETCH C1 INTO v_REC; EXIT WHEN C1%NOTFOUND; dbms_output.put_line(v_REC.SGSN_DATE||' '||v_REC.SGSN_MB||' '||v_REC.PRM_MNTH||' '||v_REC.PRM_ACT_MB||' '||v_REC.PRM_RND_MB||' '|||v_REC .PRM_CHRG_USD||' '||SYSDATE); КРАЙНА ПРИМКА; КРАЙ; /