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 に依存します。

DD/MM/YY などを使用するように SQL Developer を設定している可能性がありますが、PHP は別のものを使用しています。SYSDATE から時刻を削除するだけの場合は、TRUNC(SYSDATE)代わりに使用する必要があります。

于 2012-12-31T19:45:29.277 に答える