2016-07-07 7 views
1

오라클 12c 데이터베이스에 저장 프로 시저가있어 테이블에서 모든 데이터를 삭제 한 다음 같은 테이블에 새 데이터를 삽입합니다. 저장 프로 시저가 SQL Developer에서 호출 될 때 의도 한대로 작동하지만, PHP 코드로 프로 시저를 호출 할 때 "delete"문만 실행하고 삽입은 실행하지 않습니다. 내 저장 프로 시저PHP 코드에서 호출하면 오라클 삽입 문이 작동하지 않습니다.

: 루프가 실제로 반복되는 경우 내가 확인했다 "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에서 동일한 저장 프로 시저를 실행하면 모든 항목 (삭제 및 삽입)이 완벽하게 작동합니다.

문제는 삽입 문, 특히 "materialize"부분에있을 수 있지만 확실하지는 않습니다.

저는 여기에 손실이 있습니다. 왜 PHP 코드에서 프로 시저를 호출 할 때 삽입 부분이 작동하지 않는지 모릅니다. 어떤 도움이라도 대단히 감사하겠습니다. 내가 추측이 있다면

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

당신이 볼, sysdate 이미 date 유형이 때문에

+0

단일 필드 테이블에서 작동하도록 코드를 수정했습니다. 그것은 나를 위해 (오라클 11g/PHP 7) 작동합니다. 작업이 끝날 때까지'insert'를 단순화하고 거기에서 빌드하십시오. – timclutton

답변

1

, 그것은이다. 이 줄에서는 연결 기본 NLS 설정을 사용하여 varchar2로 암시 적으로 변환 한 다음 다시 날짜로 변환합니다. PHP가 yyyy.mm.dd이 아닌 NLS 날짜 설정과 연결되면 예외를 반환하거나 (이 경우가 아님) 변환하려고하면 잘못된 날짜가 표시됩니다. 시간이없는 날짜 부분 만 원하면 trunc(sysdate)을 대신 사용하십시오. 또한 변수에 간단히 할당 할 수 있습니다 : current_day := trunc(sysdate);

그래도 작동하지 않으면 PHP에서 직접 선택을 실행하십시오. 실제로 다른 구성 또는 다른 이유로 인해 연결에서 결과를 반환하지 않습니다.