繁体   English   中英

Oracle PL / SQL如何将替换变量的结果重新分配给新变量?

[英]Oracle PL/SQL how to reassign the result of a substitution variable to a new variable?

我在尝试使用替代变量作为表名时遇到了一个小问题。 当我使用QTR_END日期为31-DEC-2009日运行以下代码时,出现错误,因为它不是创建QUARTER = 4ACCYEAR = 2009 ,而是尝试创建名称为的表:

"ZZ_PLANNING_DATA_TO_NUMBER(TO_CHAR(TO_DATE('&&QTR_END','DD-MM-YYYY'), 'Q'))QTO_NUMBER(EXTRACT (YEAR FROM TO_DATE('&&QTR_END','DD-MM-YYYY')))"

当然,我正在尝试创建表"ZZ_PLANNING_DATA_4Q2009"

我不知道如何强迫替换变量替换其执行值,而不仅仅是替换代码。

ACCEPT QTR_END DATE PROMPT 'Enter the last day of the period you wish to run (i.e.: 30-JUN-2014).';

DEFINE QUARTER = TO_NUMBER(TO_CHAR(TO_DATE('&&QTR_END','DD-MM-YYYY'), 'Q'));
DEFINE ACCYEAR = TO_NUMBER(EXTRACT (YEAR FROM TO_DATE('&&QTR_END','DD-MM-YYYY')));

DEFINE BACKUP_TABLE_NAME = "ZZ_PLANNING_DATA_&&QUARTER.Q&&ACCYEAR";
CREATE TABLE &&BACKUP_TABLE_NAME COMPRESS NOLOGGING
AS SELECT * FROM ZZ_PLANNING_DATA;

尝试这个:

ACCEPT QTR_END DATE PROMPT 'Enter the last day of the period you wish to run (i.e.: 30-JUN-2014).';

col quarter form a30 new_value quarter
col accyear form a30 new_value accyear

select TO_CHAR(TO_DATE('&&QTR_END','DD-MM-YYYY'), 'Q') quarter,
       TO_CHAR(EXTRACT (YEAR FROM TO_DATE('&&QTR_END','DD-MM-YYYY'))) accyear
from dual;

DEFINE BACKUP_TABLE_NAME = ZZ_PLANNING_DATA_&&QUARTER.Q&&ACCYEAR

prompt quarter: &quarter 
prompt accyear: &accyear
prompt backup_table_name: &backup_table_name

CREATE TABLE &&BACKUP_TABLE_NAME COMPRESS NOLOGGING
AS SELECT * FROM ZZ_PLANNING_DATA;

或者,我认为在PLSQL中更容易做到这一点:

ACCEPT QTR_END DATE PROMPT 'Enter the last day of the period you wish to run (i.e.: 30-JUN-2014).';

declare
  quarter VARCHAR2(6) := TO_CHAR(TO_DATE('&&QTR_END','DD-MM-YYYY'), 'Q');
  accyear VARCHAR2(6) := EXTRACT (YEAR FROM TO_DATE('&&QTR_END','DD-MM-YYYY'));
  backup_name varchar2(30) := 'ZZ_PLANNING_DATA_' || QUARTER || 'Q' || ACCYEAR;
begin
  execute immediate 'create table ' || backup_name || ' as select * from zz_planning_data';
end;
/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM