2016-07-07 14 views
1

Oracle 12cデータベースにストアドプロシージャがあり、テーブルからすべてのデータを削除してから同じデータを新しいテーブルに挿入します。ストアード・プロシージャーは、SQL Developerから呼び出されたときに意図したとおりに機能しますが、PHPコードでプロシージャーを呼び出すときには、「削除」ステートメントのみを実行しますが、挿入は実行しません。私のストアドプロシージャPHPコードから呼び出されたときにOracleのinsert文が機能しない

:ループが実際にループしている場合、私はチェックしていた「in_loop」の部分で

create or replace procedure myProcedure(
returnResult out varchar2 
) 
is 
inc number; 
current_day date; 
begin 

inc := 0; 
select to_date(sysdate, 'yyyy.mm.dd') into current_day from dual; 

delete from TEMP_GRAFIKAI; 
commit; 

while inc < 10 
loop 
insert into TEMP_GRAFIKAI (NUO, IKI, JUST_DATE, NUO_TIME, IKI_TIME, STAFF_ID, STUN_ID, PROFESSION_ID, PLACE_ID) 
with t as (select /*+ materialize */ min(a.SCHEDULE_TIME) NUO, 
max(a.SCHEDULE_TIME) IKI, 
to_char(min(a.SCHEDULE_TIME), 'yyyy.mm.dd') JUST_DATE , 
to_char(min(a.SCHEDULE_TIME), 'hh24:mi') NUO_TIME, 
to_char(max(a.SCHEDULE_TIME), 'hh24:mi') IKI_TIME, 
b.ID STAFF_ID, e.ID STUN_ID, d.PROFESSION_ID, f.PLACE_ID 
from SCHEDULE_TIME a 
join STAFF b on a.TREATMENT_STAFF_ID = b.ID 
join COMPANY_PERSON c on c.STAFF_ID = b.ID and c.COMPANY_ID = 1 and c.STRUCTURE_UNIT_ID != 1 
join PROFESSION_TEXT d on a.TREATMENT_PROF_ID = d.PROFESSION_ID and d.LANG_DOVA_CODE = 'lt' 
join ORGANIZATION e on a.TREATMENT_STUN_ID = e.ID 
join PLACE_TEXT f on a.TREATMENT_PLACE_ID = f.PLACE_ID and f.LANG_DOVA_CODE = 'lt' 
join SCHEDULES g on a.SCHEDULE_ID = g.ID and g.SYS_DELETE_STATUS = 'N' 
where a.SCHEDULE_TIME > current_day+inc and a.SCHEDULE_TIME < current_day+1+inc 
and a.SYS_DELETE_STATUS = 'N' 
group by b.ID, e.ID, d.PROFESSION_ID, f.PLACE_ID) 
select t.NUO, t.IKI, t.JUST_DATE, t.NUO_TIME, t.IKI_TIME, t.STAFF_ID, t.STUN_ID, t.PROFESSION_ID, t.PLACE_ID from t 
; 
commit; 
inc := inc +1; 
returnResult:= 'in_loop'||to_char(inc); 
end loop; 

if returnResult != 'in_loop10' then 
returnResult := 'ok'; 
end if; 

end; 

が、そこに何の問題も見つからなかったが、それが適切にループを10回ループします。

私のPHPコード:

$dbhandle = oci_connect($user, $password, $host, "AL32UTF8"); 

$proc = oci_parse($dbhandle, "call myProcedure(:returnResult)"); 
oci_bind_by_name($proc, ":returnResult", $returnResult, 50); 
$result = oci_execute($proc); 

if (!$result) {$e = oci_error($proc); $err = 'err:'.$e["message"];} 

$結果がエラーをスローしませんが、$ returnResultは適切にテキスト文字列 "in_loop10" を返します。

Deleteステートメントは問題なく実行されますが、挿入部分には何も挿入されません。 SQL Developerから同じストアド・プロシージャを実行すると、すべて(削除と挿入)が完全に機能します。

私は問題が挿入ステートメント、特に "マテリアライズ"パート内にあるかもしれないと思っていますが、私は正確にはわかりません。

私はここで迷っています。私はPHPコードからプロシージャを呼び出すと、なぜ挿入部分が機能しないのでしょうか。どんな助けでも大歓迎です。私は推測していた場合は

+0

私はあなたのコードを変更して、単一フィールドのテーブルで操作しました。それは私のために働く(Oracle 11g/PHP 7)。 'insert'を簡単にして、それがうまく動作するまで試してください。 – timclutton

答えて

1

は、それがsysdateはすでにdateタイプを持っている、あなたが見るので

select to_date(sysdate, 'yyyy.mm.dd') into current_day from dual; 

のです。この行では、接続のデフォルトNLS設定を使用して暗黙的にvarchar2に変換し、それを元に戻します。 PHPがyyyy.mm.dd以外のNLSの日付設定に接続した場合、変換するときに例外(この場合ではない)または不正な日付が返されます。時間のない日付部分だけが必要な場合は、代わりにtrunc(sysdate)を使用してください。また、変数に代入するだけでよい:current_day := trunc(sysdate);

これはうまくいかない場合は、PHPから直接selectを実行してみてください。おそらく、異なる設定や他の何らかの理由で実際にはその接続の結果を返しません。

関連する問題