【问题标题】:Oracle PL/SQL how to reassign the result of a substitution variable to a new variable?Oracle PL/SQL 如何将替换变量的结果重新分配给新变量?
【发布时间】:2014-08-20 20:31:34
【问题描述】:

我在尝试将替换变量用于表名时遇到了一个小问题。当我使用QTR_END 日期为31-DEC-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;

【问题讨论】:

    标签: sql oracle variables plsql substitution


    【解决方案1】:

    试试这个:

    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;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多