我有一个CREATE TABLE
语句,当我从一个匿名块执行它时,它可以正常工作,但是当我将相同的脚本放入包中定义的存储过程中时,会显示消息:
ORA-001031权限不足
我在匿名块中的语句(无错误):
DECLARE
v_start_date DATE;
v_end_date DATE;
v_statement VARCHAR2(1500);
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE tmp_TABLE_X';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
v_start_date := TO_DATE('2016/10/31 16:00:00', 'YYYY/MM/DD HH24:MI:SS');
v_end_date := TO_DATE('2016/11/30 15:59:59', 'YYYY/MM/DD HH24:MI:SS');
v_statement := 'CREATE TABLE tmp_TABLE_X AS (
SELECT o.ID, o.NAME, o.PARENT, o.START_DATE, o.END_DATE, o.EDIT_DATE
FROM MyTable o
WHERE o.PARENT IS NOT NULL AND o.START_DATE BETWEEN TO_DATE('''|| TO_CHAR(v_start_date, 'YYYY/MM/DD HH24:MI:SS') || ''',''YYYY/MM/DD HH24:MI:SS'')
AND TO_DATE(''' || TO_CHAR(v_end_date, 'YYYY/MM/DD HH24:MI:SS') || ''',''YYYY/MM/DD HH24:MI:SS'') )';
EXECUTE IMMEDIATE v_statement;
END;
我在存储过程中的语句(错误):
create or replace PACKAGE BODY PKG1 AS
/* Other definitions */
PROCEDURE LOAD_TMP_DATA(p_start_date IN VARCHAR2, p_end_date IN VARCHAR2)
IS
v_start_date DATE;
v_end_date DATE;
v_statement VARCHAR2(3000);
BEGIN
v_start_date := TO_DATE(p_start_date||' 16:00:00', 'YYYY/MM/DD HH24:MI:SS');
v_end_date := TO_DATE(p_end_date||' 15:59:59', 'YYYY/MM/DD HH24:MI:SS');
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE tmp_TABLE_X';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
v_start_date := TO_DATE('2016/10/31 16:00:00', 'YYYY/MM/DD HH24:MI:SS');
v_end_date := TO_DATE('2016/11/30 15:59:59', 'YYYY/MM/DD HH24:MI:SS');
v_statement := 'CREATE TABLE tmp_TABLE_X AS (
SELECT o.ID, o.NAME, o.PARENT, o.START_DATE, o.END_DATE, o.EDIT_DATE
FROM MyTable o
WHERE o.PARENT IS NOT NULL AND o.START_DATE BETWEEN TO_DATE('''|| TO_CHAR(v_start_date, 'YYYY/MM/DD HH24:MI:SS') || ''',''YYYY/MM/DD HH24:MI:SS'')
AND TO_DATE(''' || TO_CHAR(v_end_date, 'YYYY/MM/DD HH24:MI:SS') || ''',''YYYY/MM/DD HH24:MI:SS'') )';
EXECUTE IMMEDIATE v_statement;
END;
END;
我不明白为什么Oracle会显示此错误。
答案 0 :(得分:1)
要创建表,您需要“创建表”特权。您的用户可能通过角色拥有该特权。但是,从存储过程执行时,需要直接授予权限。
https://www.techrepublic.com/article/understanding-roles-in-oracle-stored-procedures/
答案 1 :(得分:0)
我认为您所做的完全错误。 Oracle不能那样工作。
如果您是我,我会CREATE TABLE TMP_TABLE_X
一次(不是PL / SQL!),并根据需要多次使用它。怎么样?
WHERE
子句插入新行您甚至可以在“普通”表或全局(或专用,取决于您使用的Oracle版本)临时表之间进行选择。
但是在PL / SQL中删除/创建/填充它吗?什么样的恶梦!不要那样做。