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

问题描述 投票:0回答:2

我有一个程序,我使用

all_objects
视图来获取其他所有者(架构)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;
oracle
2个回答
1
投票

trunc(to_date(创建, 'DD/MM/YYYY')) < trunc(TO_DATE(SYSDATE-60, 'DD/MM/YYYY'));

这是错误的。在 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@!),'DD/MM/YYYY')


0
投票

只是偶然发现了这个,因为我遇到了同样的问题,我想我会发布我发现的修复程序,希望将来能帮助其他人:AUTHID CURRENT_USER

忽略我糟糕的编码,举个例子:

CREATE OR REPLACE PROCEDURE pingu_adm.test_column_query (
    p_schema     IN VARCHAR2,
    p_table_name IN VARCHAR2
) AUTHID CURRENT_USER IS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Schema: ' || p_schema);
    DBMS_OUTPUT.PUT_LINE('Table Name: ' || p_table_name);

    -- Gather description information about the schema and table
    FOR column_info IN (
        SELECT column_name, data_type, data_length, data_precision, data_scale
        FROM all_tab_columns
        WHERE owner = p_schema
          AND table_name = p_table_name
    ) LOOP
        -- Output the column information
        DBMS_OUTPUT.PUT_LINE('Column Name: ' || column_info.column_name);
        DBMS_OUTPUT.PUT_LINE('Data Type: ' || column_info.data_type);
        DBMS_OUTPUT.PUT_LINE('Data Length: ' || column_info.data_length);
        DBMS_OUTPUT.PUT_LINE('Data Precision: ' || column_info.data_precision);
        DBMS_OUTPUT.PUT_LINE('Data Scale: ' || column_info.data_scale);
        DBMS_OUTPUT.PUT_LINE('-----------------------------');
    END LOOP;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END test_column_query;
/

© www.soinside.com 2019 - 2024. All rights reserved.