哈哈,我真笨了 V_MONTH 没有给出初始值啊,笨了

解决方案 »

  1.   

    同志们又有个问题想问问,就是这个alter table是不是不能写成函数,我想在pl/sql里写成函数,但是运行的时候就报错,有那位同志能帮忙解释一下?报错代码:ORA-14552: cannot perform a DDL, commit or rollback inside a query or DMLCREATE OR REPLACE FUNCTION F_CREATE_PARTITIONBY (V_MONTH IN VARCHAR2,V_TABNAME IN VARCHAR2) RETURN NUMBER AS
        RESULT          NUMBER :=-1;
        V_PARTITIONNAME VARCHAR(20);
        N1              NUMBER;
        V_MONTH1        VARCHAR2(6);
        
        
    BEGIN      --构造分区名称
          V_PARTITIONNAME := 'PART_'||V_MONTH;
          V_MONTH1 := TO_CHAR(ADD_MONTHS(TO_DATE(V_MONTH,'YYYYMM'),1),'YYYYMM');
          
         --判断分区是否存在
          SELECT COUNT(PARTITION_NAME) INTO N1  FROM USER_TAB_PARTITIONS WHERE  TABLE_NAME = V_TABNAME AND PARTITION_NAME = V_PARTITIONNAME;      IF N1>0 THEN
            --存在则删除数据
             
            EXECUTE IMMEDIATE 'ALTER TABLE '||V_TABNAME||' TRUNCATE PARTITION '||V_PARTITIONNAME||'';
            
          ELSE
            --创建分区
            EXECUTE IMMEDIATE 'ALTER TABLE '||V_TABNAME||' ADD PARTITION '||V_PARTITIONNAME||' VALUES LESS THAN ( '||V_MONTH1||' )
                           (SUBPARTITION '||V_PARTITIONNAME||'_101 VALUES (101),
                            SUBPARTITION '||V_PARTITIONNAME||'_102 VALUES (102),
                            SUBPARTITION '||V_PARTITIONNAME||'_103 VALUES (103),
                            SUBPARTITION '||V_PARTITIONNAME||'_104 VALUES (104),
                            SUBPARTITION '||V_PARTITIONNAME||'_105 VALUES (105),
                            SUBPARTITION '||V_PARTITIONNAME||'_106 VALUES (106),
                            SUBPARTITION '||V_PARTITIONNAME||'_107 VALUES (107),
                            SUBPARTITION '||V_PARTITIONNAME||'_108 VALUES (108),
                            SUBPARTITION '||V_PARTITIONNAME||'_109 VALUES (109),
                            SUBPARTITION '||V_PARTITIONNAME||'_111 VALUES (111),
                            SUBPARTITION '||V_PARTITIONNAME||'_113 VALUES (113),
                            SUBPARTITION '||V_PARTITIONNAME||'_114 VALUES (114))';
          END IF;      RESULT := 0;
          RETURN (RESULT);      /*EXCEPTION  WHEN OTHERS
             THEN  RETURN -1;*/
    END;
      

  2.   

    这个是ORACLE的限制.不要花费心思了.