我有一个程序,我使用all_objects
视图来获取其他所有者(Schema)XYZ的对象。该过程不会返回预期的数据,但是当我单独运行查询(而不是通过过程)时,它确实返回数据。我猜它是一些许可问题。还不清楚。请帮忙。
create or replace PROCEDURE clearTables(in_parameter int, out_para out varchar) as
l_V_Sql long;
l_V_Sql2 long;
l_v_tab long;
CURSOR temp_Data IS
SELECT object_name FROM all_objects WHERE owner = 'XYZ' AND object_type = 'TABLE' AND created < SYSDATE-in_parameter;
file UTL_FILE.FILE_TYPE;
BEGIN
Open temp_Data;
file := UTL_FILE.FOPEN(UPPER('Test_dir'), 'Test_XYZ.txt', 'w');
LOOP
FETCH temp_Data INTO l_v_tab;
UTL_FILE.PUT_LINE(file, in_parameter);
-- dbms_output.put_line('inside');
EXIT WHEN temp_Data%notfound;
-- UTL_FILE.PUT_LINE(file,'outside');
UTL_FILE.PUT_LINE(file, l_v_tab);
l_v_sql := 'DROP TABLE XYZ.'||l_v_tab||' PURGE';
l_v_sql2 := 'DROP SEQUENCE XYZ.SEQ_'||l_v_tab;
EXECUTE IMMEDIATE l_v_Sql;
Begin
EXECUTE IMMEDIATE l_v_Sql2;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -2289 THEN
RAISE;
END IF;
END;
END LOOP;
UTL_FILE.FCLOSE(file);
CLOSE temp_Data;
out_para:= 'Drop Succeed';
EXCEPTION
WHEN OTHERS THEN
out_para:= ( l_v_tab ||' : '||SQLERRM);
CLOSE temp_Data;
-- END;
end clearTables;
答案 0 :(得分:1)
trunc(to_date(created,&#39; DD / MM / YYYY&#39;))&lt; trunc(TO_DATE(SYSDATE-60,&#39; DD / MM / YYYY&#39;));
这是错误的。在TO_DATE
上使用 DATE
将:
基于区域设置特定的NLS设置。所以,这是你代码中的一个错误。
您需要使用 TO_DATE 将字符串文字转换为DATE。
鉴于created_date
是DATE数据类型,您可以简单地将其视为:
created_date < SYSDATE - 60
查看在DATE列上使用TO_DATE时会发生什么:
SQL> EXPLAIN PLAN FOR
2 SELECT * FROM dual
3 WHERE to_date(SYSDATE, 'DD/MM/YYYY') > to_date(SYSDATE, 'DD/MM/YYYY') -1;
Explained.
SQL>
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
Plan hash value: 3752461848
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------
---------------------------------------------------
1 - filter(TO_DATE(TO_CHAR(SYSDATE@!),'DD/MM/YYYY')>TO_DATE(TO_CHAR(S
YSDATE@!),'DD/MM/YYYY')-1)
15 rows selected.
SQL>
它被转换为 TO_DATE(TO_CHAR(SYSDATE @!),&#39; DD / MM / YYYY&#39;)