我正在尝试在过程中创建一个临时表:
\"
如果我将PROCEDURE pr_create_tmp_bp_table(fp_id NUMBER) IS
tbl_name CONSTANT VARCHAR2(20) := 'BP_TO_DELETE';
BEGIN
-- sanity checks removed for readablity
EXECUTE IMMEDIATE
'CREATE GLOBAL TEMPORARY TABLE ' || tbl_name || ' ' ||
'ON COMMIT PRESERVE ROWS AS ' ||
'SELECT * FROM infop_stammdaten.bp';
END;
块复制到SQL工作表,一切正常。所以我认为用户有权创建临时表。如果我从同一个SQL工作表中执行该过程,我得到
BEGIN.._END
第16行(Zeile 16)指向创建临时表的EXECUTE IMMEDIATE语句。
对我来说,这看起来用户在sql工作表中没有相同的权限,当它执行一个过程时,该过程也在它自己的模式中。
答案 0 :(得分:3)
您当前问题的答案是,您获得ORA-01031: insufficient privileges
,因为您的用户具有通过角色授予的CREATE TABLE权限:Oracle安全模型强制执行我们无法使用通过角色授予的权限的规则在PL / SQL中。因此,您需要DBA直接向用户授予CREATE TABLE权限。
或者你呢?
因为您尝试做的事情在Oracle中没有意义。在Oracle全局临时表中是永久结构;它只是暂时的数据。因此,正确的解决方案是使用普通的DDL脚本构建表一次,就像任何其他数据库对象一样。然后,您可以根据需要插入到全局临时表中。
您不是本网站上第一个犯这个错误的人(read this pertinent thread)。通常它是因为人们来自另一个数据库,例如SQL Server,它有一个名为"临时表"这实际上与Oracle的全局临时表不同。如果这是您的方案,那么您将对Oracle 18c新功能(称为私有临时表)感兴趣。这些与SQL Server临时表完全类似。 Find out more