ORA-14308: элемент, связанный с разделом, должен быть одним из следующих элементов: строка, дата-время или литерал интервала, число или NULL - PullRequest
0 голосов
/ 27 июня 2019
CREATE OR REPLACE PROCEDURE pro_alter_partition(INTERFACE_ID VARCHAR2) 
    AS
    L_partition_name            VARCHAR2(100);
    L_subpartition_name            VARCHAR2(100);
    L_subpartition_inc            NUMBER;
    BEGIN

        SELECT MAX(partition_name), MAX(subpartition_name) 
            INTO L_partition_name, L_subpartition_name
                FROM dba_tab_subpartitions 
                    WHERE table_name = UPPER('jcff_int_inb_staging_data');

        dbms_output.put_line(L_subpartition_name);

        L_subpartition_inc := to_number(substr(L_subpartition_name,9))+1;
        L_subpartition_name := substr(L_subpartition_name,1,8)||L_subpartition_inc;

        dbms_output.put_line(L_subpartition_inc);
        dbms_output.put_line(L_subpartition_name);

        EXECUTE IMMEDIATE 'ALTER TABLE JDACUST.JCFF_INT_INB_STAGING_DATA
            MODIFY partition '||L_partition_name ||
                ' ADD subpartition '||L_subpartition_name||' values ('||INTERFACE_ID||')';

    END pro_alter_partition;
    /

Он не должен выдавать ошибку и должен изменить раздел

1 Ответ

1 голос
/ 27 июня 2019

INTERFACE_ID - строковый литерал. Поэтому необходимо заключать в кавычки. Только потому, что вы используете динамический SQL, вам нужно избегать их:

EXECUTE IMMEDIATE 'ALTER TABLE JDACUST.JCFF_INT_INB_STAGING_DATA
    MODIFY partition '||L_partition_name ||
        ' ADD subpartition '||L_subpartition_name||' values ('''||INTERFACE_ID||''')';

Динамический SQL сложен, потому что он превращает ошибки компиляции в ошибки времени выполнения. Чтобы обнаружить ошибки, мы должны думать как компилятор. Облегчи себя и используй переменную для сборки исполняемой строки. Вы можете отключить переменную, чтобы увидеть фактически выполненный оператор, который легче отлаживать:

stmt := 'ALTER TABLE JDACUST.JCFF_INT_INB_STAGING_DATA
        MODIFY partition '||L_partition_name ||
            ' ADD subpartition '||L_subpartition_name||' values ('''||INTERFACE_ID||''')';

dbms_output.put_line(stmt);

EXECUTE IMMEDIATE stmt;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...