我通过PHP应用程序启动了一个pl/sql脚本,但是我注意到当脚本中有插入、更新或删除时,脚本停止了。如果我直接在sqldeveloper中使用此脚本,则没有问题。
要使用insert, delete, update是否需要做一些特别的事情?由于
procedure update_nbr_execution
(dem_id in number)
IS
BEGIN
UPDATE BCN_DEMANDE_EXTRACTION
SET nombre_execution = nvl(nombre_execution,0) + 1
WHERE id = dem_id;
END;
在我的php文件:
$query = "BEGIN
ecrire_requete(:demande_id, :p_nom);
END;";
$stid = oci_parse($conn, $query);
$tabvars = oci_new_collection($conn,'MYTABLETYPE');
oci_bind_by_name($stid, ':p_nom', $tabvars, -1, SQLT_NTY);
oci_bind_by_name($stid, ':demande_id', $_POST['demande_id']);
oci_execute($stid, OCI_DEFAULT);
update_nbr_execution
被ecrire_requete
调用。
在update_nbr_execution
中有一个触发器,字段日期自动更新为字段nbr_execution。它可能来自触发器吗?
编辑:隔离某些部分后,我现在得到这个错误:ORA-04088: error during execution of trigger
。所以它确实来自于这样的触发器:
create or replace
TRIGGER BCN_FORMAT_NOM_FICHIER_BI
BEFORE INSERT OR UPDATE ON BCN_DEMANDE_EXTRACTION
REFERENCING NEW AS NEW
FOR EACH ROW
DECLARE
BEGIN
if inserting then
:new.FORMAT_NOM_FICHIER_DONNEES:='bcn_<nom_lot>_<id demande>_<n° version>_<description>_<date>.dat';
:new.FORMAT_NOM_FICHIER_CONTROLE:='bcn_<nom_lot>_<id demande>_<n° version>_<date>.ctr';
:new.FORMAT_NOM_FICHIER_JETON:='bcn_<nom_lot>_<id demande>_<n° version>_<date>.jet';
:new.FORMAT_NOM_FICHIER_ZIP:='bcn_<nom_lot>_<id demande>_<n° version>_<date>';
:new.CREATED_AT:=TO_CHAR(SYSDATE,'DD/MM/YY');
:new.UPDATED_AT:=TO_CHAR(SYSDATE,'DD/MM/YY');
else
:new.UPDATED_AT:=TO_CHAR(SYSDATE,'DD/MM/YY');
end if;
END;
可能是日期格式的问题。
如果CREATED_AT
和UPDATED_AT
都是日期,则= TO_CHAR(SYSDATE,'DD/MM/YY')
将SYSDATE转换为字符串,然后隐式地将字符串转换回日期。隐式日期转换依赖于NLS_DATE_FORMAT,由每个客户端设置。
你可能有SQL开发者设置使用DD/MM/YY之类的东西,但PHP正在使用其他东西。如果你只是如果你想从SYSDATE中删除时间,你应该使用TRUNC(SYSDATE)
。