Oracle - 将表数据从一个模式复制到另一个模式

时间:2013-09-11 11:53:53

标签: stored-procedures oracle11g

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

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中的存储过程是否有任何问题。

1 个答案:

答案 0 :(得分:5)

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

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

 CREATE SEQUENCE SEQ_ARCHIVE_ID; 

然后在insert语句中使用它:

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提供从源表中进行选择的权限。您更喜欢哪一个是选择问题。我可能会使用第二个版本:为目标用户提供读取源数据的权限。