我正在使用序列和触发器基本上自动递增表中的列,但是我收到错误 - ORA-24344:编译错误成功。
我正在使用这个帖子:How to create id with AUTO_INCREMENT on Oracle?并且它成功地用于其他两个表格,我自己做了增量,但是这里必须有一些东西我不熟悉导致错误。
更多编辑:感谢Polppan我们已经确定这可能不是Oracle问题,而是带有PHP问题的OCI。我正在使用:
oci_execute($sql);
如上所述here(再次感谢Polppan的链接),EOL字符与oci_execute之间存在一些问题。这是11年前,所以我不知道是否已修补,我确实尝试了他的解决方案,但它没有帮助。有谁知道oci_execute和创建触发器是否还有其他问题?
创建表:(工作)
CREATE TABLE RT_documents (
documentID INT NOT NULL,
reviewID varchar2(20) NOT NULL,
file_location CLOB NOT NULL,
version NUMBER(*,3) NOT NULL,
CONSTRAINT RT_documents_pk PRIMARY KEY (documentID)
)
创建序列:(作品)
CREATE SEQUENCE rt_documents_seq
创建/替换触发器:(不起作用)
CREATE OR REPLACE TRIGGER rt_documents_bir
BEFORE INSERT ON RT_documents
FOR EACH ROW
BEGIN
SELECT RT_documents_seq.NEXTVAL
INTO :new.documentID
FROM dual;
END;
编辑:请求的确切错误消息 - (注意,我正在使用PHP中的OCI / Oracle执行这些逐个查询。添加PHP标记以防万一,但很确定这是一个oracle语法错误或其他) 。
错误:
注意:oci_execute():OCI_SUCCESS_WITH_INFO:ORA-24344:成功与 (...)
中的编译错误
- 我可以成功执行前两个查询,并进行双重检查,表格就在那里,因此它可以正常工作。
答案 0 :(得分:2)
触发器无法理解new.id
,因为id
表格中不存在RT_documents
。
你的触发器应该是
CREATE OR REPLACE TRIGGER rt_documents_bir
BEFORE INSERT
ON RT_documents
FOR EACH ROW
BEGIN
SELECT RT_documents_seq.NEXTVAL INTO :new.documentID FROM DUAL;
END;
更新
SELECT * FROM v$version;
Oracle Database 10g Enterprise Edition
CREATE TABLE RT_documents
(
documentID INT NOT NULL,
reviewID VARCHAR2 (20) NOT NULL,
file_location CLOB NOT NULL,
version NUMBER (*, 3) NOT NULL,
CONSTRAINT RT_documents_pk PRIMARY KEY (documentID)
);
Table created.
CREATE SEQUENCE rt_documents_seq;
Sequence created.
CREATE OR REPLACE TRIGGER rt_documents_bir
BEFORE INSERT
ON RT_documents
FOR EACH ROW
BEGIN
SELECT RT_documents_seq.NEXTVAL INTO :new.documentID FROM DUAL;
END;
/
Trigger created.
INSERT INTO RT_documents (reviewID, file_location, version)
VALUES ('test', 'test', 1);
1 row created.
SELECT * FROM RT_documents;
DOCUMENTID REVIEWID FILE_LOCATION
VERSION
---------- -------------------- -------------------------------------------
-------------------------------- ----------
1 test test
1
答案 1 :(得分:2)
感谢Polppan。
解决方案是删除EOL字符。 (我确实尝试了这个,但没有意识到,删除了分号,这导致了相同的错误代码)
毕竟这是一个PHP错误。使用oci_execute,您必须删除触发器中的EOL字符:
$sql = "CREATE OR REPLACE TRIGGER ......."; //shortened for easy reading
$sql = str_replace(chr(13),'',$sql);
$sql = str_replace(chr(10),'',$sql);
oci_execute($sql);