【问题标题】:Oracle insert statement doesn't work when called from PHP code从 PHP 代码调用 Oracle 插入语句不起作用
【发布时间】:2016-11-09 21:33:39
【问题描述】:

我的 Oracle 12c 数据库中有一个存储过程,它从表中删除所有数据,然后将新数据插入到同一个表中。从 SQL Developer 调用时,存储过程按预期工作,但是,当我使用 PHP 代码调用该过程时,它只执行“删除”语句,而不执行插入。

我的存储过程:

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"];}

$result 不会抛出任何错误,$returnResult 正确返回文本字符串“in_loop10”。

删除语句执行没有问题,但插入部分不插入任何内容。 如果我从 SQL Developer 执行相同的存储过程,一切(删除和插入)都可以完美运行。

我认为问题可能出在插入语句中,尤其是“实现”部分,但我不确定。

我在这里不知所措,不知道为什么当我从 PHP 代码调用该过程时插入部分不起作用。任何帮助将不胜感激。

【问题讨论】:

  • 我修改了您的代码以对单字段表进行操作。它适用于我(Oracle 11g/PHP 7)。尝试简化您的 insert,直到它可以工作并从那里开始构建。

标签: php sql oracle stored-procedures oracle-call-interface


【解决方案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 运行 select,也许由于配置不同或其他原因,它实际上在该连接下没有返回任何结果。

【讨论】:

    猜你喜欢
    • 2012-05-05
    • 1970-01-01
    • 2016-09-11
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多