Gok*_*kul 2 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;
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误消息:
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
Run Code Online (Sandbox Code Playgroud)
请帮助我如何设置权限,并请告诉我在oracle中我的存储过程是否有任何问题.
您不需要存储过程,也不需要光标.这是很多更有效地用一个语句来做到这一点.
编辑为ARCHIVE_ID列生成唯一值,您应该创建一个序列:
CREATE SEQUENCE SEQ_ARCHIVE_ID;
Run Code Online (Sandbox Code Playgroud)
然后在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;
Run Code Online (Sandbox Code Playgroud)
如果您确实希望在存储过程中使用它,可以将上述语句放在一个中.但是你绝对应该摆脱使用游标的慢行逐行插入.您提交每条记录的事实会使情况更糟.
关于你的错误:
ORA-01031:权限不足
简单地表示执行过程的用户无权从源表中进行选择,或者用户没有插入目标表的权限.您需要确保已经提供了必要的GRANT.
如果您以用户身份登录,则DEV_ARCHIVE可以运行:
GRANT INSERT ON BRIC_ARCHV TO DEV_SWIMLANE2;
Run Code Online (Sandbox Code Playgroud)
为用户DEV_SWIMLANE2提供插入目标表的权限.
或者,如果您以DEV_SWIMLANE2身份登录,则可以运行:
GRANT SELECT ON billing_record_invoiced_code TO DEV_ARCHIVE;
Run Code Online (Sandbox Code Playgroud)
为用户DEV_ARCHIVE提供从源表中进行选择的权限.您更喜欢哪一个是选择问题.我可能会使用第二个版本:为目标用户提供读取源数据的权限.