Oracle 重命名分区(如果存在)

Oracle rename partition if exists

我需要创建一个语句,可以 运行 仅当特定分区名称存在时才重命名分区,如果不存在则继续执行其他代码。

basic command  = ALTER TABLE TEST RENAME PARTITION P1 TO P2:

我看了以下内容,但还没有想出解决办法

一个选项是将 ALTER TABLE 包含在它自己的 BEGIN-END 块中,并带有适当的异常处理部分。我的有点愚蠢(当其他人时,嗯?);随意重写它以使其有意义 - 它只是为了展示如何去做。

所以:如果 ALTER TABLE 失败,它会引发一些错误;它将被捕获、处理,代码将继续执行。

begin
  begin
    execute immediate 'alter table test rename partition p1 to p2';
  exception
    when others then 
      -- ignore errors
      null;
  end;

  -- continue to execute other code
  ...
end;

这取决于您的要求,但基本程序是这样的:

DECLARE
    PARTITION_DOES_NOT_EXIST EXCEPTION;
    PRAGMA EXCEPTION_INIT(PARTITION_DOES_NOT_EXIST, -2149); 
BEGIN

    BEGIN
        EXECUTE IMMEDIATE 'ALTER TABLE TEST RENAME PARTITION P1 TO P2';
    EXCEPTION 
        WHEN PARTITION_DOES_NOT_EXIST THEN NULL;
    END;

    ... ohter commands
END;

您可以检查分区是否存在于 table USER_TAB_PARTITIONS:

DECLARE
  v_p1_exists AS NUMBER;
  v_p2_exists AS NUMBER;
BEGIN
  SELECT COUNT(*)
    INTO v_p1_exists
    FROM user_tab_partitions
   WHERE table_name = 'TEST'
     AND partition_name = 'P1';
  SELECT COUNT(*)
    INTO v_p2_exists
    FROM user_tab_partitions
   WHERE table_name = 'TEST'
     AND partition_name = 'P2';
   IF (v_p1_exists <> 0) AND (v_p2_exists = 0) THEN
     EXECUTE IMMEDIATE 'ALTER TABLE TEST RENAME PARTITION P1 TO P2';
   END;
END;