Stored procedures Oracle—将表数据从一个模式复制到另一个模式

Stored procedures Oracle—将表数据从一个模式复制到另一个模式,stored-procedures,oracle11g,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

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

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

您不需要存储过程,也不需要光标。使用单个语句执行此操作的效率要高得多

编辑要为存档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 INSERT ON BRIC_ARCHV TO DEV_SWIMLANE2;
GRANT SELECT ON billing_record_invoiced_code TO DEV_ARCHIVE;
为用户DEV_SWIMLANE2授予插入目标表的权限

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

GRANT INSERT ON BRIC_ARCHV TO DEV_SWIMLANE2;
GRANT SELECT ON billing_record_invoiced_code TO DEV_ARCHIVE;

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

实际上,我有一个名为ARCHIVE\u ID的列,它在BRIC\u ARCHV表中设置为NOTNULL。如何在ARCHIVE_ID列中为每个要插入的记录增加值。错误为“错误代码:1400,SQL状态:23000]ORA-01400:无法将空值插入(“开发存档”。“BRIC存档”。“存档ID”)”