【问题标题】:Geting: Warning: oci_fetch(): ORA-24374: define not done before fetch or execute and fetch. despite having defined the names获取:警告:oci_fetch():ORA-24374:在获取或执行和获取之前定义未完成。尽管已经定义了名称
【发布时间】:2015-09-25 05:40:00
【问题描述】:

在阅读了所有手册后,我发现我仍然无法解决这个问题。

我有以下代码:

<?php

$token = 'number';
$secret = 'number';
$ID;

$conn = oci_connect('FITBIT', 'pass', '127.0.0.1/xe');
$stid = oci_parse($conn, 'BEGIN find_personsdevice_id(:token, :secret, :l_personsdeviceid); END;');
oci_bind_by_name($stid, ':token', $token);
oci_bind_by_name($stid, ':secret', $secret);
oci_bind_by_name($stid, ':l_personsdeviceid', $ID);

oci_define_by_name($stid, 'l_personsdeviceid', $ID);
oci_define_by_name($stid, ':token,', $token);
oci_define_by_name($stid, ':secret,', $secret);

oci_execute($stid);
oci_fetch($stid);
var_dump($stid);

?>

该程序正在运行,我用 sql developer 对其进行了测试,它给出了正确的结果。但是当我尝试在这个 PHP 脚本中调用它时,我收到以下消息:

警告:oci_fetch(): ORA-24374: 在获取或执行和获取之前定义未完成

我搜索了 ora 代码,发现了这个:

原因:应用程序没有定义 在发出 fetch 调用之前获取数据的输出变量或 通过在执行调用中指定非零行数来调用提取。 行动:发出 OCI 定义调用 要获取的列。

据我所知,我将 oci_fetch 命令放在了定义命令之后。那么我做错了什么?

PL/SQL 过程:

create or replace
procedure find_personsdevice_id(b_token in varchar2, b_secret in varchar2, l_personsdeviceid out number) as

/*author Ruben Jonkers
  project: FITBIT
  goal procedure: find ID by token and seccret
  date: 20-05-2015
  version:0.1
  adjustments:
*/


cursor c_personsdeviceid (b_token in varchar2:='', b_secret in varchar2:='') is
  select pde.id 
  from personsdevices pde,
       persons psn,
       groups grp,
       tokens tns
  where psn.id=pde.persons_id
  and pde.persons_id = psn.id
  and grp.tokens_id = tns.id
  and tns.token = b_token
  and tns.secret = b_secret;

  r_personsdeviceid c_personsdeviceid%rowtype;

begin
  open c_personsdeviceid (b_token, 
                          b_secret);
  fetch c_personsdeviceid into r_personsdeviceid;
    if c_personsdeviceid%found then
      l_personsdeviceid:=r_personsdeviceid.id;
    end if;
  close c_personsdeviceid;

end;

【问题讨论】:

  • 这些都是输出参数吗?作为第一步,我会尝试注释掉oci_define_by_name 的调用,看看这对你有什么作用。我也不认为您需要调用oci_fetch,因为您没有从游标中获取数据。 ???
  • 我添加了清除问题的过程 :) 也许我确实需要其他东西而不是 fetch。我可以尝试回显 $id 吗?
  • 啊,你是对的!事实上,我不需要获取,因为该号码已经存储在 $id 中!我真的需要学习如何更好地调试^^。我第一次从头开始创建一个 php/oracle 的东西。

标签: php database oracle oracle-call-interface


【解决方案1】:

消除oci_fetch() 调用实际上并没有解决最初为什么会发生此错误的问题。实际错误和此处ORA-24374: define not done before fetch 的描述似乎不正确,因为您的代码似乎确实定义了所有参数。

一个原因是你的程序只返回一个输出参数;它不会产生oci_fetch() 正在寻找的一组行,这些行通常在循环中调用。当你不需要 fetch 时,你也不需要oci_define_by_name() 调用。但为什么会产生如此无意义和误导性的错误,我不知道。

另一种可能性是驱动程序或数据库错误。您在/*...*/ 中的多行评论可能是triggering it。您应该使用 -- 将该块转换为单行 cmets 作为解决方法。确切的数据库版本也在这里相关。

【讨论】:

    【解决方案2】:

    原来我根本不需要 oci_fetch,因为结果已经存储在 $id 中!

    【讨论】:

      猜你喜欢
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多