同志们又有个问题想问问,就是这个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 --存在则删除数据
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;