尝试插入此问题时会产生我。使用未定义的常量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>
答案 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>