因为数据量过大导致数据文件自增达到上限,需要添加数据文件。但不想每次满了之后再手动添加,所以建了一个bigfile tablespace想把表都迁过去。表也比较多,而且需要保留数据不能删表重建,就打算使用存储过程进行迁移。
在编写完存储过程后,执行发现它没有对任何一张符合条件的数据表进行迁移,甚至for循环都没进去。一再尝试后发现是存储过程中执行的那个查询条件没有查询到数据。
那么问题来了,我将该段查询语句复制出来直接执行是能查到数据的,但在存储过程中却不行。求解惑
测试发现,存储过程查询的数据量和直接使用语句查询的存在差异
create PROCEDURE DBA_TEST
AS
E_PARM_ERROR EXCEPTION;
E_DATE_ERROR EXCEPTION;
E_TABLESPACE_CYCLE EXCEPTION;
V_NUM_OF_TABLES NUMBER(10);
BEGIN
DBMS_OUTPUT.PUT_LINE('[INFO] BEGIN AT ' || TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'));
----------------------------------------------------------------------------
-- CONVERT TO PARTITION TABLE
----------------------------------------------------------------------------
select count(*) into V_NUM_OF_TABLES from ALL_TABLES;
DBMS_OUTPUT.PUT_LINE(V_NUM_OF_TABLES);
V_NUM_OF_TABLES := 0;
FOR T IN (SELECT distinct owner FROM ALL_TABLES
)
LOOP
DBMS_OUTPUT.PUT_LINE(T.OWNER);
BEGIN
V_NUM_OF_TABLES := V_NUM_OF_TABLES + 1;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLCODE=' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('SQLERRM=' || SQLERRM);
ROLLBACK;
RAISE;
END;
COMMIT;
END LOOP;

DBMS_OUTPUT.PUT_LINE('[INFO] TOTAL ' || TO_CHAR(V_NUM_OF_TABLES) || ' TABLES PROCESSED.');
DBMS_OUTPUT.PUT_LINE('[INFO] END AT ' || TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'));
END DBA_TEST;
/
定位到存储过程中在哪个位置,逻辑没有按预期执行呢?