从PHP使用的pl/sql脚本插入、删除、更新
我通过一个PHP应用程序启动了一个pl/sql脚本,但我注意到,当脚本中出现插入、更新或删除时,脚本就会停止。如果我直接在sqldeveloper中使用此脚本,则没有问题 为了使用insert、delete、update,是否有特殊的操作? 谢谢 在我的php文件中:从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;
$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;