1

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

为了使用插入、删除、更新,有什么特别的事情要做吗?谢谢

 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;
4

1 回答 1

0

这可能是日期格式问题。

如果CREATED_ATUPDATED_AT都是日期,= TO_CHAR(SYSDATE,'DD/MM/YY') 则将 SYSDATE 转换为字符串,然后将字符串隐式转换回日期。隐式日期转换取决于每个客户端设置的 NLS_DATE_FORMAT。

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

于 2012-12-31T19:45:29.277 回答