Oracle
 sql >> база данни >  >> RDS >> Oracle

Не можете да използвате името на PL/SQL таблица като променлива в PL/SQL процедура?

Решавам го, без да използвам 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); КРАЙНА ПРИМКА; КРАЙ; / 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. колони в Oracle Pivot

  2. как да замените буквата с ударение в колона varchar2 в oracle

  3. Oracle SQL:сортиране на ред с разделен низ

  4. Преобразувайте десетичната година в дата

  5. Как да получа фиктивна стойност за XML празен таг в таблица с помощта на Oracle?