2016-07-07 74 views
1

我在Oracle 12c數據庫中有一個存儲過程,它從表中刪除所有數據,然後將新數據插入到同一個表中。存儲過程在從SQL Developer調用時按預期工作,但是,當我使用PHP代碼調用過程時,它只執行「delete」語句,但不執行插入操作。從PHP代碼調用Oracle插入語句不起作用

我的存儲過程:

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; 

隨着「in_loop」的一部分,如果循環實際上是被循環我檢查,沒有發現問題存在,它正常的循環,循環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」。

刪除語句得到執行沒有問題,但插入部分不插入任何東西。 如果我從SQL Developer執行相同的存儲過程,一切(刪除和插入)都可以完美工作。

我認爲這個問題可能在插入語句中,特別是「物化」部分,但我不完全確定。

我在這裏不知所措,不知道爲什麼當我從PHP代碼調用過程時插入部分不工作。任何幫助將不勝感激。

+0

我修改了您的代碼以在單字段表上進行操作。它適用於我(Oracle 11g/PHP 7)。嘗試簡化你的'插入',直到它從那裏工作和建立起來。 – timclutton

回答

1

如果我猜,這是因爲

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

你看,sysdate已經date類型。使用此行,您可以使用連接默認的NLS設置將其隱式轉換爲varchar2,然後將其轉換回日期。如果PHP連接了除yyyy.mm.dd以外的NLS日期設置,則在嘗試轉換回來時,您將得到一個異常(不是這種情況)或不正確的日期。如果您只想要沒有時間的日期部分,請改爲使用trunc(sysdate)。此外,您可以簡單地分配給變量:current_day := trunc(sysdate);

如果這樣做不起作用,請嘗試直接從PHP運行選擇,也許實際上由於配置不同或其他原因返回結果。