Php oci_execute():oci_SUCCESS_WITH_INFO:ORA-24344使用触发器/序列自动递增oracle表错误

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年前的事了,所以我不知道这个问题是否得到了解决,我也尝

我使用了一个序列和触发器来自动递增表中的一列,但是我得到了一个错误-ORA-24344:编译错误成功

我在使用这篇文章:它成功地为另外两个表工作,我制作了自动增量,但这里一定有我不熟悉的导致错误的东西

更多编辑:多亏了Polppan,我们确定这可能不是Oracle的问题,而是带有PHP的OCI问题。我正在使用:

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);