oracle - 在 Oracle pl/sql 中使用插入语句创建过程
问题描述
我正在尝试使用此插入语句创建过程,否则该过程可以正常工作,但是当尝试将此插入查询合并到过程中时,它给了我以下错误
Error(11,1): PL/SQL: SQL Statement ignored and
Error(16,17): PL/SQL: ORA-00904: "DBMS_RANDOM"."VALUE": invalid identifier
我需要运行这个 proc 10 个月才能循环复制 10 个月的数据,但我被困在第一步,并且 proc 没有被编译。
{
create or replace PROCEDURE datareplicationProcedure
(Start_date IN Date, End_date IN Date) AS
BEGIN
`insert statement`
insert into SAM_CDS.transactions
(TENANT_CD,TRANSACTION_KEY, BATCH_ID ,ACCT_CURR_AMOUNT, BATCH_DATE_TIME,DAY_SK,WEEK_SK, MONTH_SK )
(
Select A.TENANT_CD, A.TRANSACTION_KEY,A.BATCH_ID,A.acct_curr_amount,A.BATCH_DATE_TIME,D.DAY_SK,D.WEEK_SK, D.MONTH_SK
from (
( select TENANT_CD,'TRANSACTION_'||(DBMS_RANDOM.string('x',10))as TRANSACTION_KEY,BATCH_ID,acct_curr_amount ,
TO_DATE( TRUNC( DBMS_RANDOM.VALUE(TO_CHAR(DATE '2021-07-01','J'),TO_CHAR(DATE '2021-07-31','J'))),'J') BATCH_DATE_TIME
from SAM_CDS.transactions where batch_date_time
between to_date('04-FEB-19') and to_Date('05-FEB-19')
)A
left outer join
(select * from SAM_CDS.DAY where DATETIME between Start_date and End_date)D
on D.DATETIME=A.BATCH_DATE_TIME )
);
END datareplicationProcedure;
}
解决方案
似乎程序的所有者没有dbms_random
通过直接授权获得对包的访问权限。如果insert
语句在存储过程之外编译,则授权很可能是通过角色而不是通过直接授权。定义者的权限存储过程不能使用通过角色授予的权限,而只能使用直接授予用户的权限。您可以将该过程更改为调用者权限存储过程,该过程可以使用通过角色授予的权限,但这将要求该角色在调用该过程的每个会话中对调用者都是可用的。更有可能的是,您想要求您的 DBAdbms_random
直接将访问权限授予过程所有者。
推荐阅读
- python - django-storage with S3: TypeError: a bytes-like object is required, not 'str'
- google-apps-script - 使用其 url 从 G-Drive 将 pptx 上传到 Google 协作平台
- c - sh: 1: 语法错误:未终止的带引号的字符串 -- Shellcode
- python - 如何在函数python pandas中传递矢量数据帧和循环
- php - 当我运行这个 php 代码时,它报告一个错误:未定义的偏移量
- excel - 对整列运行宏
- c - C 编程 - 过滤数组
- probability - 通过反应堆屏蔽的中子
- flutter - 列出附近开启蓝牙的手机(flutter_blue 包)
- javascript - 仍在为此苦苦挣扎...为什么我不能在鼠标移出工作时淡出?