ORA-14308: 分区绑定元素必须是以下之一:字符串、日期时间或间隔文字、数字或 NULL
ORA-14308: partition bound element must be one of: string, datetime or interval literal, number, or NULL
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;
/
它不应该抛出错误并且应该改变分区
INTERFACE_ID 是字符串文字。因此 in 需要用引号括起来。只是因为你使用的是动态 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很难,因为它将编译错误转化为运行时错误。要发现错误,我们需要像编译器一样思考。让自己轻松一点,并使用变量 assemble 可执行字符串。可以禁用变量,查看实际执行的语句,更容易调试:
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;
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;
/
它不应该抛出错误并且应该改变分区
INTERFACE_ID 是字符串文字。因此 in 需要用引号括起来。只是因为你使用的是动态 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很难,因为它将编译错误转化为运行时错误。要发现错误,我们需要像编译器一样思考。让自己轻松一点,并使用变量 assemble 可执行字符串。可以禁用变量,查看实际执行的语句,更容易调试:
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;