先通过一定方法得到下一个月大日期,并将其放入了数组
da(1)=2010-06-01
da(2)=2010-06-02
da(3)=2010-06-03
da(4)=2010-06-04
da(5)=2010-06-05
.......
现在想创建一张表,字段名就是这个日期值
但'CREATE TABLE TFCDHZB_TB (SJD VARCHAR2(50),da(1) varchar2(100),
   da(2) varchar2(100),da(3) varchar2(100),da(4) varchar2(100),da(5) varchar2(100),
   da(6) varchar2(100),da(7) varchar2(100),da(8) varchar2(100),da(9) varchar2(100),
   da(10) varchar2(100),da(11) varchar2(100),da(12) varchar2(100),da(13) varchar2(100),
   da(14) varchar2(100),da(15) varchar2(100),da(16) varchar2(100),da(17) varchar2(100),
   da(18) varchar2(100),da(19) varchar2(100),da(20) varchar2(100),da(21) varchar2(100),
   da(22) varchar2(100),da(23) varchar2(100),da(24) varchar2(100),da(25) varchar2(100),
   da(26) varchar2(100),da(27) varchar2(100),da(28) varchar2(100),da(29) varchar2(100),
   da(30) varchar2(100))'
时被告知da(1)...是无效的类型,da()已经是varchar2类型
主要想生成动态表,遇到这样的问题该如何解决
谢谢

解决方案 »

  1.   


    s_sql := 'CREATE TABLE TFCDHZB_TB (SJD VARCHAR2(50),'
        || da(1) || ' varchar2(100),'
        || da(2) || ' varchar2(100),'
        ...
        || da(30)||' varchar2(100))';
    execute immediate s_sql;
      

  2.   

    另外, 不知Oracle字段名是否支持横杠-
      

  3.   

    SQL> DECLARE
      2  p_day NUMBER;
      3  p_sql VARCHAR2(4000);
      4  BEGIN
      5  SELECT TO_CHAR(LAST_DAY(SYSDATE),'DD') INTO p_day FROM DUAL;
      6  p_sql := 'CREATE TABLE TFCDHZB_TB(SJD VARCHAR2(50),';
      7  FOR I IN 1..p_day LOOP
      8  --动态拼接sql 字段不可为da(1)这种形式 否则oracle不识别
      9  p_sql :=p_sql || 'DA' || I || ' ' || 'VARCHAR2(100),';
     10  END LOOP;
     11  p_sql := SUBSTR(p_sql,1,LENGTH(p_sql)-1);
     12  p_sql := p_sql || ')';
     13  EXECUTE IMMEDIATE p_sql;
     14  dbms_output.put_line('TFCDHZB_TB IS CREATED');
     15  END;
     16  /
     
    TFCDHZB_TB IS CREATED
     
    PL/SQL procedure successfully completed
     
    SQL> desc TFCDHZB_TB
    Name Type          Nullable Default Comments 
    ---- ------------- -------- ------- -------- 
    SJD  VARCHAR2(50)  Y                         
    DA1  VARCHAR2(100) Y                         
    DA2  VARCHAR2(100) Y                         
    DA3  VARCHAR2(100) Y                         
    DA4  VARCHAR2(100) Y                         
    DA5  VARCHAR2(100) Y                         
    DA6  VARCHAR2(100) Y                         
    DA7  VARCHAR2(100) Y                         
    DA8  VARCHAR2(100) Y                         
    DA9  VARCHAR2(100) Y                         
    DA10 VARCHAR2(100) Y                         
    DA11 VARCHAR2(100) Y                         
    DA12 VARCHAR2(100) Y                         
    DA13 VARCHAR2(100) Y                         
    DA14 VARCHAR2(100) Y                         
    DA15 VARCHAR2(100) Y                         
    DA16 VARCHAR2(100) Y                         
    DA17 VARCHAR2(100) Y                         
    DA18 VARCHAR2(100) Y                         
    DA19 VARCHAR2(100) Y                         
    DA20 VARCHAR2(100) Y                         
    DA21 VARCHAR2(100) Y                         
    DA22 VARCHAR2(100) Y                         
    DA23 VARCHAR2(100) Y                         
    DA24 VARCHAR2(100) Y                         
    DA25 VARCHAR2(100) Y                         
    DA26 VARCHAR2(100) Y                         
    DA27 VARCHAR2(100) Y                         
    DA28 VARCHAR2(100) Y                         
    DA29 VARCHAR2(100) Y                         
    DA30 VARCHAR2(100) Y                         
    DA31 VARCHAR2(100) Y       
      

  4.   

    可以支持的,字段名请用双引号括住,但在使用时不需要
    s_sql := 'CREATE TABLE TFCDHZB_TB (SJD VARCHAR2(50), "'  || da(1) || '" varchar2(100),"'  || da(2) || '" varchar2(100),"'  ... || da(30)||'" varchar2(100))'; 
    execute immediate s_sql;