ORA-001031从存储过程执行语句时权限不足

时间:2019-05-16 10:54:16

标签: oracle plsql oracle12c

我有一个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会显示此错误。

2 个答案:

答案 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中删除/创建/填充它吗?什么样的恶梦!不要那样做。