Ik los het op zonder IMMEDIATE UITVOEREN
. te gebruiken , Ik weet niet of deze oplossing als dynamische SQL werd beschouwd of niet, het moeilijkste was het samenvoegen van deze grote complexe query in een stringvariabele.
STEL SERVEROUTPUT IN OP GROOTTE 1000000;VERKLAREN--EERSTE DAG JAARv_SG_FYEAR VARCHAR(50);--EERSTE DAG MONTHv_SG_FMNTH VARCHAR(50);--EERSTE DAG START DAYv_SG_FDAY VARCHAR(50);--THA LAATSTE DAG (50);--LAST DAY MONTHv_SG_LMNTH VARCHAR(50);--LAST DAY START DAYv_SG_LDAY VARCHAR(50);v_JOBID number(20);v_PRM_TABLE1 varchar(200);v_PRM_TABLE2 varchar(200);--craeting van een gegevenstypetype t_rec is record(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 sysv_67 );BEGIN/*Laatste JOB_ID*/SELECT MAX(JOB_ID) IN v_JOBID krijgen van ON_SGSN_TAPOUT;geval wanneer v_JOBID NULL IS, dan v_JOBID:=1; wanneer v_JOBID NIET NULL IS, SELECTEER DAN MAX(JOB_ID)+1 IN V_JOBID VANAF 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_'|SD|TO_CHAR 'YYYYMM')||'@prmdb';/*de SQL-query in een variabele zetten*/v_sql:='select * from('|| 'select * from ('|| 'SELECT TO_CHAR(START_TIME,''YYYYMMDD '') AS "SGSN_DATE",'|| 'SUM(SUM_UP_DOWN/1024/1024) SGSN_MB'|| ' FROM [email protected]
'|| ' WHERE START_TIME TUSSEN TO_DATE('''||v_SG_FMNTH||'/'||v_SG_FDAY||'/'||v_SG_FYEAR||' '||'00:00:00'||''','|| '''mm/dd/jjjj uu24:mi:ss'||''')'||' AND TO_DATE('''||v_SG_LMNTH||'/'||v_SG_LDAY||'/'||v_SG_LYEAR||' '||'23:59:59'||''','||''' mm/dd/jjjj hh24:mi:ss'||''')'||' GROUP BY TO_CHAR(START_TIME,''YYYYMMDD'')) Een '||'linker outer join '|| '('||'select PRM_MNTH,PRM_ACT_MB,PRM_RND_MB,PRM_CHRG_USD van ('||'select PRM_MNTH,SUM(PRM_ACT_MB) PRM_ACT_MB,SUM(PRM_RND_MB) PRM_RND_MB,SUM(PRM_CHRG_USD) PRM_CHRG_USD) ,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'|| ' van '|| v_PRM_TABLE1 || ' waar starttijd tussen ''' ||v_SG_FYEAR||v_SG_FMNTH||v_SG_FDAY||'000000'' en '''||v_SG_LYEAR||v_SG_LMNTH||v_SG_LDAY||'235959'''|| ' en CDR_TYPE in (''GPRSO'') '| | ' groeperen op substr(START_TIME,1,8) '|| ' UNION ALL '|| ' selecteer 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 '|| ' van '||v_PRM_TABLE2|| ' waarbij starttijd tussen '''||v_SG_FYEAR||v_SG_FMNTH||v_SG_FDAY||'000000'' en '''|||v_SG_LYEAR v_SG_LMNTH||v_SG_LDAY||'235959'''|| ' en CDR_TYPE in (''GPRSO'')'|| ' groeperen op substr(START_TIME,1,8))'|| ' groeperen op'|| ' PRM_MNTH )'|| ') B'|| ' OP A.SGSN_DATE=B.PRM_MNTH)'; OPEN C1 VOOR v_sql; LUS FETCH C1 IN v_REC; VERLATEN WANNEER C1%NIET GEVONDEN; 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); EINDE LUS; EINDE; /