我是Oracle的新手,但有MS SQL的经验。但是,在这种情况下,我必须使用Oracle。
我有一个网页,我可以在其中上传(简化(文档并输入文档的标题。此信息存储在两个表(Document_meta 和 Document_content(中。为此,我使用了两个插入语句
父插入:
INSERT INTO DOCUMENT (TITLE) VALUES (:title) RETURNING DOCUMENTID INTO :documentId
子插入:
INSERT INTO CONTENT (SEQ_VSL_DOCUMENT,DOCUMENT) VALUES (:documentId,:blob)
为此,我必须在 de DB 中使用触发器,以检索文档元表中插入数据的新 ID。
触发代码:
create or replace TRIGGER DOC_INS
BEFORE INSERT ON DOCUMENT_META
FOR EACH ROW
BEGIN
SELECT DOC_ID.nextval
INTO :NEW.DOCUMENTID
FROM dual;
END;
这行得通。但是现在我必须把它移到一个包里。所以我尝试创建一个包,但没有任何运气。
包头如下所示:
create or replace PACKAGE PKG_DOCUMENT AS
PROCEDURE insert_document(p_title VARCHAR2,p_content BLOB);
END PKG_DOCUMENT;
和身体像:
create or replace PACKAGE body PKG_DOCUMENT AS
PROCEDURE insert_document(p_title VARCHAR2,p_content BLOB) AS
BEGIN
INSERT INTO document_meta(TITEL) VALUES (p_title);
RETURNING DOCUMENTID INTO docId;
INSERT INTO document_content(content,document_id) VALUES (p_content,docId);
END insert_document;
END PKG_DOCUMENT;
但这不会编译,我收到错误:
Error(5,19): PLS-00103: Encountered the symbol "DOCUMENTID" when expecting one of the following: := . ( @ % ;
我不知道如何解决这个问题?是否可以像这样插入数据,或者我是否必须使用将数据插入父表中并返回新 Id 并在此插入子表中的函数?
任何帮助,不胜感激。我使用 Oracle 11c Express。
您的package body
中很少有问题,这些问题在以下代码中内联列出:
create or replace PACKAGE body PKG_DOCUMENT AS
PROCEDURE insert_document(p_title VARCHAR2,p_content BLOB) AS
docid document_meta.DOCUMENTID%type; -- this must be declared
BEGIN
INSERT INTO document_meta(TITLE) VALUES (p_title) --; -- removed semicolon and spelling of TITLE was incorrect
RETURNING DOCUMENTID INTO docId;
INSERT INTO document_content(content,document_id) VALUES (p_content,docId);
END insert_document;
END PKG_DOCUMENT;
干杯!!