Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle pl/sql中使用insert语句创建过程_Oracle_Plsql_Oracle12c - Fatal编程技术网

在Oracle pl/sql中使用insert语句创建过程

在Oracle pl/sql中使用insert语句创建过程,oracle,plsql,oracle12c,Oracle,Plsql,Oracle12c,我正试图用这个insert语句创建一个过程,该语句在其他方面工作得很好,但是当我试图将这个insert查询合并到这个过程中时,它给了我下面的错误 Error(11,1): PL/SQL: SQL Statement ignored and Error(16,17): PL/SQL: ORA-00904: "DBMS_RANDOM"."VALUE": invalid identifier 为了在循环中复制10个月的数据,我需要运行这个proc 10个月,

我正试图用这个insert语句创建一个过程,该语句在其他方面工作得很好,但是当我试图将这个insert查询合并到这个过程中时,它给了我下面的错误

Error(11,1): PL/SQL: SQL Statement ignored and 
Error(16,17): PL/SQL: ORA-00904: "DBMS_RANDOM"."VALUE": invalid identifier
为了在循环中复制10个月的数据,我需要运行这个proc 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\u random
包的权限。如果
insert
语句在存储过程之外编译,则很可能是通过角色而不是直接授予。定义者权限存储过程不能使用通过角色授予的权限,只能使用直接授予用户的权限。您可以将该过程更改为调用方权限存储过程,该过程可以使用通过角色授予的权限,但这将要求调用该过程的每个会话中调用方都可以使用该角色。更可能的情况是,您希望要求DBA直接向过程所有者授予访问
dbms\u random
的权限。

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

请阅读-总结是,这不是一种向志愿者讲话的理想方式,可能会对获得答案产生反作用。请不要将此添加到您的问题中。请阅读-总结是,这不是解决志愿者问题的理想方式,可能会对获得答案产生反作用。请不要将此添加到您的问题中。谢谢Justin,您是对的,我要求DBA团队使用grant选项给予许可,它成功了。现在我面临另一个问题,我在proc中传递的日期,我想在DBAM_随机函数中使用,但它给我缺少表达式的错误。to_date(TRUNC)(DBMS_RANDOM.VALUE)(to_CHAR(date(开始日期),'J'),TO_CHAR(日期(结束日期),'J'),'J')@shweta-我不明白什么是
date(开始日期)
date(结束日期)
应该表示。没有
date
函数。您可以指
to_date
,但这只有在传入字符串时才有意义。您的过程声明表明您传入的是日期,因此将参数强制转换为相同的数据类型没有意义。再次感谢Justin:)我犯了一个愚蠢的错误,你说的没错,当我从函数中删除日期部分时,它接受了参数。正式来说,这是我的第一个存储过程,现在我要在这个过程中添加一个循环来运行它10个月,祝我好运:)谢谢Justin,你是对的,我请求DBA团队授予grant选项的权限,它成功了。现在我面临另一个问题,我在过程中传递的日期,我想在DBAM_随机函数中使用,但是它给了我缺少表达式的错误。TO_DATE(TRUNC(DBMS_RANDOM.VALUE)(TO_CHAR(DATE(Start_DATE),'J')、TO_CHAR(DATE(End_DATE),'J'))@shweta-我不明白
DATE(Start_DATE)
DATE(End_DATE)
应该代表什么。没有
日期
功能。您可以表示“截止日期”,但这只有在传入字符串时才有意义。您的过程声明表明您正在传递一个日期,因此将参数强制转换为相同的数据类型是没有意义的。再次感谢您Justin:)我犯了一个愚蠢的错误,您正确地提到了,当我从函数中删除日期部分时,它接受了参数。正式来说,这是我的第一个存储过程,现在我要在这个过程中添加一个循环来运行它10个月,祝我好运:)