2

我尝试使用以下存储过程将一个表记录从一个模式表复制到另一个模式表。

CREATE OR REPLACE PROCEDURE ARCHIVE_DATA
AS
cursor C_BRIC_EXTRACT
is
select pend_date, pend_note, record_id, suspense_cd, suspense_date from DEV_SWIMLANE2.billing_record_invoiced_code;
BEGIN
FOR C_EXTRACT_BRIC_REC IN C_BRIC_EXTRACT
LOOP
 BEGIN 
  INSERT INTO
   DEV_ARCHIVE.BRIC_ARCHV(SUSPENSE_CD,RECORD_ID,SUSPENSE_DATE,PEND_DATE,PEND_NOTE)
  VALUES
   (C_EXTRACT_BRIC_REC.SUSPENSE_CD, C_EXTRACT_BRIC_REC.RECORD_ID, C_EXTRACT_BRIC_REC.SUSPENSE_DATE, C_EXTRACT_BRIC_REC.PEND_DATE, C_EXTRACT_BRIC_REC.PEND_NOTE);  
  COMMIT;
 END; 
END LOOP;
END;

但我收到以下错误消息:

17:20:27  [CREATE - 0 row(s), 0.000 secs]  [Error Code: 1031, SQL State: 42000]  ORA-01031: insufficient privileges
 17:20:27  [BEGIN - 0 row(s), 0.000 secs]  [Error Code: 6550, SQL State: 65000]  ORA-06550: line 8, column 159:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   ;
 17:20:27  [COMMIT - 0 row(s), 0.293 secs]  Command processed. No rows were affected
 17:20:28  [END - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]  ORA-00900: invalid SQL statement
 17:20:29  [END - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]  ORA-00900: invalid SQL statement
 17:20:29  [END - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]  ORA-00900: invalid SQL statement

请帮助我如何设置权限,也请让我知道我在 oracle 中的存储过程是否有任何问题。

4

1 回答 1

5

您不需要存储过程,也绝对不需要游标。使用单个语句执行此操作效率更高

编辑为 ARCHIVE_ID 列生成唯一值,您应该创建一个序列:

 CREATE SEQUENCE SEQ_ARCHIVE_ID; 

然后在插入语句中使用它:

INSERT INTO DEV_ARCHIVE.BRIC_ARCHV 
   (ARCHIVE_ID, SUSPENSE_CD, RECORD_ID, SUSPENSE_DATE, PEND_DATE, PEND_NOTE)
select seq_archive_id.nextval, 
       suspense_cd, 
       record_id, 
       suspense_date, 
       pend_date, 
       pend_note
from DEV_SWIMLANE2.billing_record_invoiced_code;
COMMIT;

如果您确实想将其放在存储过程中,则可以将上述语句放在一起。但是您绝对应该使用游标摆脱缓慢的逐行插入。您提交每条记录的事实使情况变得更糟。

关于您的错误:

ORA-01031: 权限不足

仅仅意味着执行您的过程的用户没有从源表中选择的权限,或者该用户没有插入目标表的权限。您需要确保已提供必要的 GRANT。

如果您以用户身份登录,则DEV_ARCHIVE可以运行:

GRANT INSERT ON BRIC_ARCHV TO DEV_SWIMLANE2;

授予用户 DEV_SWIMLANE2 插入目标表的权限。

或者,如果您以 DEV_SWIMLANE2 身份登录,您可以运行:

GRANT SELECT ON billing_record_invoiced_code TO DEV_ARCHIVE;

授予用户 DEV_ARCHIVE 从源表中选择的权限。你更喜欢哪一个是一个选择问题。我可能会使用第二个版本:授予目标用户读取源数据的权限。

于 2013-09-11T12:25:09.230 回答