我尝试了以下存储过程,用于将一个表记录从一个模式表复制到另一个模式表。
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中的存储过程是否有任何问题。
答案 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提供从源表中进行选择的权限。您更喜欢哪一个是选择问题。我可能会使用第二个版本:为目标用户提供读取源数据的权限。