Php oci_execute():oci_SUCCESS_WITH_INFO:ORA-24344使用触发器/序列自动递增oracle表错误
我使用了一个序列和触发器来自动递增表中的一列,但是我得到了一个错误-ORA-24344:编译错误成功 我在使用这篇文章:它成功地为另外两个表工作,我制作了自动增量,但这里一定有我不熟悉的导致错误的东西 更多编辑:多亏了Polppan,我们确定这可能不是Oracle的问题,而是带有PHP的OCI问题。我正在使用:Php oci_execute():oci_SUCCESS_WITH_INFO:ORA-24344使用触发器/序列自动递增oracle表错误,php,sql,oracle,triggers,sequence,Php,Sql,Oracle,Triggers,Sequence,我使用了一个序列和触发器来自动递增表中的一列,但是我得到了一个错误-ORA-24344:编译错误成功 我在使用这篇文章:它成功地为另外两个表工作,我制作了自动增量,但这里一定有我不熟悉的导致错误的东西 更多编辑:多亏了Polppan,我们确定这可能不是Oracle的问题,而是带有PHP的OCI问题。我正在使用: oci_execute($sql); 如前所述(再次感谢Polppan的链接),EOL字符和oci_执行之间存在一些问题。那是11年前的事了,所以我不知道这个问题是否得到了解决,我也尝
oci_execute($sql);
如前所述(再次感谢Polppan的链接),EOL字符和oci_执行之间存在一些问题。那是11年前的事了,所以我不知道这个问题是否得到了解决,我也尝试过他的解决方案,但没有任何帮助。有人知道oci_执行和创建触发器是否存在其他问题吗
创建表:(工作)
创建序列:(works)
创建/替换触发器:(不工作)
编辑:根据请求显示准确的错误消息-(注意,我正在使用为以防万一而添加的OCI/Oracle在PHP.PHP标记中逐个查询执行这些查询,但非常确定这是Oracle语法错误或其他原因)
错误:
注意:oci_execute():oci_SUCCESS_WITH_INFO:ORA-24344:SUCCESS WITH
(…)中的编译错误
-我可以成功地执行前两个查询,并再次检查表,使其正常工作 触发器不理解
new.id
,因为RT\u文档中不存在id
你的扳机应该是
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
多亏了波尔潘
解决方案是删除EOL字符。(我确实试过了,但在没有意识到的情况下,删除了分号,这导致了相同的错误代码)
这毕竟是一个PHP错误。使用oci_execute,必须删除触发器中的下线字符:
$sql = "CREATE OR REPLACE TRIGGER ......."; //shortened for easy reading
$sql = str_replace(chr(13),'',$sql);
$sql = str_replace(chr(10),'',$sql);
oci_execute($sql);
我把它改成了那个,不幸的是,我仍然得到同样的错误。事实上,在以前的表创建中,我设法让它使用:new.id,即使我没有id列。大概是因为它是一个触发器,所以当我尝试插入该表时可能会出错,但我会在这篇文章开始工作后回去修复它。@CoreyThompson你能提供准确的错误消息吗?只是想提醒未来的读者,我原来的文章中有到:new.id
,但我编辑它,将显示到:new.documentID
,因为它没有引起错误。@CoreyThompson我想你正在尝试使用PHP代码执行sql语句,而不是从sqlplus或任何其他数据库工具。我(基本上)使用的是oci\u execute($statement)
(当然,有了一个正确的连接和一切——正如我所提到的,我可以创建表和序列。我检查了你的更新答案,我逐字逐句地得到了它,我一辈子都不明白为什么触发器不会创建。@Polppan Identity函数对12c来说是新的,但这里使用的触发器和序列是用于数据库的。)e-12c。(你的链接甚至多次指定了这一点)我在10g中尝试了你的代码,但它不起作用,抱怨id
不存在。正如你提到的,它需要是documentID(我现在已经改成了它)但我仍然得到了同样的错误:\n我不认为这是一个重复的问题,因为它更像是一个执行PHP触发代码的问题。因此,请重新打开这个问题。很高兴知道,经过多次寻找,您已经找到了解决方案。
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
$sql = "CREATE OR REPLACE TRIGGER ......."; //shortened for easy reading
$sql = str_replace(chr(13),'',$sql);
$sql = str_replace(chr(10),'',$sql);
oci_execute($sql);