我有一个程序,我使用
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;
trunc(to_date(创建, 'DD/MM/YYYY')) < trunc(TO_DATE(SYSDATE-60, 'DD/MM/YYYY'));
这是错误的。在 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@!),'DD/MM/YYYY')
只是偶然发现了这个,因为我遇到了同样的问题,我想我会发布我发现的修复程序,希望将来能帮助其他人: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;
/