如何从PHP ODBC函数使用Oracle序列

时间:2018-10-12 15:34:28

标签: php oracle odbc

尝试插入此问题时会产生我。使用未定义的常量SEQUENCE_ID_PROBLEMA-假定为SECUENCIA_ID_PROBLEMA

我不知道问题出在哪里,请帮忙。

我的Oracle序列:

<code>
CREATE SEQUENCE INFORMACION.SECUENCIA_ID_PROBLEMA
 START WITH 0
 MAXVALUE 9999999999999999999999999999
 MINVALUE 0
 NOCYCLE
 NOCACHE
 NOORDER;
</code>

我在PHP中的代码:

<code>
$sql = "INSERT INTO $tabla (ID_PROBLEMA, HORA_INICIO, PROBLEMA, CAUSA, 
      SOLUCION, HORA_FIN, ID_ASIGNACION) VALUES (?, ?, ?, ?, ?, ?, ?)"; 
$stmt = odbc_prepare($Conex, $sql); 
$success = odbc_execute($stmt,[SECUENCIA_ID_PROBLEMA.nextval,$HORA_INICIO,$PROBLEMA, $CAUSA,SOLUCION,sysdate, $ID_ASIGNACION] );
</code>

2 个答案:

答案 0 :(得分:0)

PHP和SQL是完全不同的语言,您得到的是由PHP解释器触发的PHP警告:

define('FOO', 3.1416);
echo FOO; // 3.1416
echo BAR; // Warning: Use of undefined constant BAR - assumed 'BAR' (this will throw an Error in a future version of PHP)

您的代码尝试将序列名称作为动态输入处理。您不能为此使用准备语句,因为准备语句的全部目的是防止这种情况的发生。如果确实需要,则需要使用纯字符串函数生成基本的SQL框架:

$table = 'PROBLEMA';
$sequence = 'SECUENCIA_ID_PROBLEMA';
$sql = "INSERT INTO $table (ID_PROBLEMA, HORA_INICIO, PROBLEMA, CAUSA, 
      SOLUCION, HORA_FIN, ID_ASIGNACION) VALUES ($sequence.nextval, ?, ?, ?, ?, ?, ?)";
INSERT INTO PROBLEMA (ID_PROBLEMA, HORA_INICIO, PROBLEMA, CAUSA, 
          SOLUCION, HORA_FIN, ID_ASIGNACION) VALUES (SECUENCIA_ID_PROBLEMA.nextval, ?, ?, ?, ?, ?, ?)

但是,您的代码也尝试向动态绑定变量提供固定的硬编码文本。我想知道这种额外的复杂性是否是有意的和必要的。具有相同的确切列名的不同表可能会引起代码气味:)

答案 1 :(得分:-1)

最后,您不能使用php中的序列。我所做的就是在Oracle Data Bae中创建一个触发器,以便当插入新行时执行触发器。

<code>
CREATE SEQUENCE INFORMACION.SECUENCIA_ID_PROBLEMA
 START WITH 0
 MAXVALUE 9999999999999999999999999999
 MINVALUE 0
 NOCYCLE
 NOCACHE
 NOORDER; 

CREATE TRIGGER problema_on_insert
 BEFORE INSERT ON PROBLEMA
 FOR EACH ROW
BEGIN
 SELECT SECUENCIA_ID_PROBLEMA.nextval
 INTO :new.ID_PROBLEMA
 FROM dual;
END;
</code>