php - oci_execute() : OCI_SUCCESS_WITH_INFO: ORA-24344 using a trigger/sequence to auto increment an oracle table error

标签 php sql oracle triggers sequence

我正在使用序列和触发器来自动递增表中的列,但是我收到错误 - ORA-24344:成功但出现编译错误。

我正在使用这篇文章:How to create id with AUTO_INCREMENT on Oracle?它成功地用于我制作的另外两个带自动增量的表,但这里一定有一些我不熟悉的东西导致了错误。

更多编辑:感谢 Polppan,我们已经确定这可能不是 Oracle 问题,而是 OCI 与 PHP 问题。我正在使用:

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 语法错误或其他错误) 。

错误:

Notice: oci_execute(): OCI_SUCCESS_WITH_INFO: ORA-24344: success with compilation error in (...)

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

最佳答案

触发器无法理解 new.id,因为 idRT_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

关于php - oci_execute() : OCI_SUCCESS_WITH_INFO: ORA-24344 using a trigger/sequence to auto increment an oracle table error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25498293/

相关文章:

asp.net - 如何在 x64 中使用 WebDev.WebServer.exe (VS Web Server)?

oracle - 替换oracle中的无效字符(通过编辑dmp文件)

php - 防止 nicEdit 创建外部标签

php - 如何通过php从mysql数据库获取单个参数?

sql - 用另一个表的数据替换占位符值

sql - 检查 SELECT 中子查询的结果是否存在

sql - 日期字段文字与格式字符串不匹配

php - NULL 或 EMPTY 变量的问题

PHP将相同的xml对象键存储到不同的mysql表

sql - SQL Server中的更新自动化