【发布时间】:2020-06-14 00:43:35
【问题描述】:
我正在创建一个存储过程以从对象存储中的存储桶中获取数据并将其加载到表中。但我在创建 SP 时收到错误 ORA-00904。知道有什么问题吗?
create or replace procedure watcher_load
is
v_exists varchar2(1) := 'F';
CURSOR c_filelist is
select replace(regexp_substr(OBJECT_NAME ,'[^_]*(_|$)',1,2), '_', '' )
object_name,
bytes
from DBMS_CLOUD.LIST_OBJECTS('user_cred','https://objectstorage.oraclecloud.com/n/bunge/bingo_subside/o/')
where object_name like '20%_%_bingo_hourly_res.json';
begin
FOR i in c_filelist
LOOP
select 'T' into v_exists from watcher_table where filename = i.object_name;
if v_exists != 'T' then
insert into watcher_table (region, filename, bytes)
values (i.region, i.object_name, i.bytes);
end if;
END LOOP;
commit;
end watcher_load;
/
PROCEDURE WATCHER_LOAD 错误:
LINE/COL ERROR
-------- -----------------------------------------------------------------
6/9 PL/SQL: SQL Statement ignored
9/15 PL/SQL: ORA-00904: "DBMS_CLOUD"."LIST_OBJECTS": invalid
identifier
17/4 PL/SQL: SQL Statement ignored
17/65 PL/SQL: ORA-00904: "I"."FILENAME": invalid identifier
17/65 PLS-00364: loop index variable 'I' use is invalid
19/9 PL/SQL: SQL Statement ignored
20/39 PLS-00364: loop index variable 'I' use is invalid
20/41 PL/SQL: ORA-00984: column not allowed here
【问题讨论】:
-
您可以访问 DBMS_CLOUD 包吗?您能与 Oracle 管理员核实一下吗?根据 oracle - 注意:要使用 ADMIN 以外的用户运行 DBMS_CLOUD 子程序,您需要向该用户授予 EXECUTE 权限。例如,以 ADMIN 身份运行以下命令以授予 adwc_user 权限:Link here-docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/…
-
是的,用户有权访问 DBMS_CLOUD 包。我可以运行可以从此命令返回行的查询,但存储过程出错。
-
@koushiksinharoy 实际上已修复它:)。非常奇怪,不确定用户如何使用 dbms_cloud 运行查询,但对于存储过程,用户需要对包的显式权限。感谢您的帮助!
-
@belve - 用户以前可能只有通过角色授予的权限,默认情况下在存储的 PL/SQL 中不尊重这些权限。在此处寻找有关 AUTHID 的答案。
-
很高兴它有帮助。请将答案标记为正确答案...
标签: sql oracle stored-procedures plsql