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

时间:2014-08-26 04:53:38

标签: php sql oracle triggers sequence

我正在使用序列和触发器基本上自动递增表中的列,但是我收到错误 - 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:成功与   (...)

中的编译错误

- 我可以成功执行前两个查询,并进行双重检查,表格就在那里,因此它可以正常工作。

2 个答案:

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