首页 > 解决方案 > 在 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;
}
 

标签: oracleplsqloracle12c

解决方案


似乎程序的所有者没有dbms_random通过直接授权获得对包的访问权限。如果insert语句在存储过程之外编译,则授权很可能是通过角色而不是通过直接授权。定义者的权限存储过程不能使用通过角色授予的权限,而只能使用直接授予用户的权限。您可以将该过程更改为调用者权限存储过程,该过程可以使用通过角色授予的权限,但这将要求该角色在调用该过程的每个会话中对调用者都是可用的。更有可能的是,您想要求您的 DBAdbms_random直接将访问权限授予过程所有者。


推荐阅读