从PHP使用的pl/sql脚本插入、删除、更新

从PHP使用的pl/sql脚本插入、删除、更新,php,oracle,plsql,Php,Oracle,Plsql,我通过一个PHP应用程序启动了一个pl/sql脚本,但我注意到,当脚本中出现插入、更新或删除时,脚本就会停止。如果我直接在sqldeveloper中使用此脚本,则没有问题 为了使用insert、delete、update,是否有特殊的操作? 谢谢 在我的php文件中: $query = "BEGIN ecrire_requete(:demande_id, :p_nom); END;

我通过一个PHP应用程序启动了一个pl/sql脚本,但我注意到,当脚本中出现插入、更新或删除时,脚本就会停止。如果我直接在sqldeveloper中使用此脚本,则没有问题

为了使用insert、delete、update,是否有特殊的操作? 谢谢

在我的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\u nbr\u执行
ecrire\u requete
调用

更新nbr\u执行过程中涉及到一个触发器,字段日期会随着fiel nbr\u执行自动更新。可能是扳机的声音吗

编辑:在隔离某些部分之后,我现在得到了这个错误:
ORA-04088:执行触发器时出错
。所以它确实来自触发器,看起来像这样:

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;
创建或替换
触发器BCN\u格式\u名称\u FICHIER\u BI
在BCN\u DEMANDE\u提取上插入或更新之前
将新引用为新
每行
声明
开始
如果插入,则
:新建。格式为“名称”FICHIER\u DONNEES:=“bcn”\uuuuuuuuuuuuuuuuuuuuuuuuuu.dat”;
:new.FORMAT_NOM_FICHIER_controlle:='bcn_uuuuuuuu_uuuu.ctr';
:new.FORMAT_NOM_FICHIER_JETON:=“bcn_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.jet”;
:new.FORMAT_NOM_FICHIER_ZIP:='bcn_uuuuuu_uuu';
:new.CREATED_AT:=TO_CHAR(SYSDATE,'DD/MM/YY');
:new.UPDATED_AT:=TO_CHAR(SYSDATE,'DD/MM/YY');
其他的
:new.UPDATED_AT:=TO_CHAR(SYSDATE,'DD/MM/YY');
如果结束;
结束;

这可能是一个日期格式问题

如果在
创建的和在更新的都是日期,那么=TO_CHAR(SYSDATE,'DD/MM/YY') 将SYSDATE转换为字符串,然后隐式地将字符串转换回日期。隐式日期转换 取决于每个客户端设置的NLS_日期_格式

您可能已经将SQLDeveloper设置为使用DD/MM/YY之类的东西,但PHP正在使用其他东西。如果你只是
要从SYSDATE中删除时间,应改用
TRUNC(SYSDATE)

停止是什么意思?您能显示一些代码吗?尝试调试查询并获取其显示的错误。回显您的查询。用PHPmyadmin或其他东西复制一下。从那里你可以看到什么部分不起作用。如果您正在寻找订单或某种订单,我会尽量避免在一个声明中包含所有3项内容。A) 它看起来不干净,而且B)代码会变得凌乱,可能无法工作。我已经尝试在sqldeveloper中回送和复制查询,并且脚本工作正常
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;