正在获取:警告:oci_fetch():ORA-24374:在获取或执行并获取之前定义未完成。尽管已经定义了名称
Geting: Warning: oci_fetch(): ORA-24374: define not done before fetch or execute and fetch. despite having defined the names
阅读了我能找到的所有手册后,我仍然无法解决这个问题。
我有以下代码:
<?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 开发人员一起对其进行了测试,它给出了正确的结果。但是当我尝试在此 PHP 脚本中调用它时,我收到以下消息:
警告:oci_fetch():ORA-24374:在获取或执行并获取之前定义未完成
我用 google 搜索了 ora 代码,发现了这个:
原因:应用程序没有定义
在发出获取调用之前获取数据的输出变量或
通过在执行调用中指定非零行计数来调用提取。
行动:发布 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_fetch 因为结果已经存储在 $id!
消除 oci_fetch()
调用实际上并没有解决最初为什么会出现此错误的原始问题。实际错误和此处的描述 ORA-24374: define not done before fetch
似乎不正确,因为您的代码似乎确实定义了所有参数。
一个原因是你的程序只有returns一个输出参数;它不会生成 oci_fetch()
正在寻找的一组行,这些行通常在循环中调用。当您不需要获取时,您也不需要 oci_define_by_name()
调用。但是为什么会产生这样一个毫无意义和误导性的错误,我不知道。
另一种可能性是驱动程序或数据库错误。您在 /*...*/
中的多行注释可能是 triggering it。作为解决方法,您应该使用 --
将该块转换为单行注释。确切的数据库版本也与此相关。
阅读了我能找到的所有手册后,我仍然无法解决这个问题。
我有以下代码:
<?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 开发人员一起对其进行了测试,它给出了正确的结果。但是当我尝试在此 PHP 脚本中调用它时,我收到以下消息:
警告:oci_fetch():ORA-24374:在获取或执行并获取之前定义未完成
我用 google 搜索了 ora 代码,发现了这个:
原因:应用程序没有定义 在发出获取调用之前获取数据的输出变量或 通过在执行调用中指定非零行计数来调用提取。 行动:发布 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_fetch 因为结果已经存储在 $id!
消除 oci_fetch()
调用实际上并没有解决最初为什么会出现此错误的原始问题。实际错误和此处的描述 ORA-24374: define not done before fetch
似乎不正确,因为您的代码似乎确实定义了所有参数。
一个原因是你的程序只有returns一个输出参数;它不会生成 oci_fetch()
正在寻找的一组行,这些行通常在循环中调用。当您不需要获取时,您也不需要 oci_define_by_name()
调用。但是为什么会产生这样一个毫无意义和误导性的错误,我不知道。
另一种可能性是驱动程序或数据库错误。您在 /*...*/
中的多行注释可能是 triggering it。作为解决方法,您应该使用 --
将该块转换为单行注释。确切的数据库版本也与此相关。