无法在过程中使用all_object来获取其他Schema数据

时间:2015-04-08 09:58:01

标签: oracle

我有一个程序,我使用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;

1 个答案:

答案 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 将:

  • 首先使用 TO_CHAR
  • 将日期转换为字符串
  • 然后使用 TO_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;)