ORA-06550、PLS-00103、ORA-06512 函数
Posted
技术标签:
【中文标题】ORA-06550、PLS-00103、ORA-06512 函数【英文标题】:ORA-06550, PLS-00103, ORA-06512 on function 【发布时间】:2013-07-07 09:25:56 【问题描述】:我不知道该怎么办。我写了一个函数,编译它没有错误,但是当我运行我得到的代码时:
ORA-0650: line 3, column 14:
PLS-00103: Encountered the symbol "/" when expecting one of the following:
:= . ( @ % ; not null range default character
ORA-06512: at line 58
Vendor code 6550
这是函数:
create or replace
FUNCTION "GET_MUSICIAN_FUN"
(
i_mus_id IN musicians.id%type
)
RETURN musicians%ROWTYPE
AS
o_mus_rec musicians%ROWTYPE;
BEGIN
SELECT m.id, m.first_name, m.last_name, m.born, m.died , m.picture_path, m.bio
INTO o_mus_rec
FROM musicians m
WHERE id = i_mus_id;
RETURN o_mus_rec;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20005, 'Found nothing.');
WHEN TOO_MANY_ROWS THEN
RAISE_APPLICATION_ERROR(-20006, 'Found too many.');
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20007, 'Cannot get musician.');
END GET_MUSICIAN_FUN;
编辑:
当我调用它时:
declare
result musicians%rowtype;
begin
result := get_musician_fun(53);
end;
/
我明白了:"anonymous block completed"
但是当从 php 调用它时:
$con = oci_connect("yoni", "yoni", "//localhost/xe");
$s = oci_parse($con, "begin :rc := GET_MUSICIAN_FUN(53); end;");
$rc = oci_new_cursor($con);
oci_bind_by_name($s, ":rc", $rc, -1, OCI_B_CURSOR);
oci_execute($s); // line 41
oci_execute($rc, OCI_DEFAULT);
oci_fetch_all($rc, $res, null, -1, OCI_FETCHSTATEMENT_BY_ROW); // line 43
return $res;
我明白了:
Warning
: oci_execute(): ORA-06550: line 1, column 14:
PLS-00382: expression is of wrong type
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored in... on line 41
Warning
: oci_fetch_all(): ORA-24338: statement handle not executed in... on line 43
【问题讨论】:
来自 SQL 开发人员。我还从 PHP 脚本中调用了该函数,给出了同样的错误。 在 SQL 开发人员中,我使用 Ctrl-F10(运行)。如何查看底层代码? @YoniLevy: 我不知道PHP
,但是看看你的错误声明,我认为你在 PHP 端没有正确获取它,我认为你需要在你的表音乐家中声明一个变量php 并对其进行迭代。请找到链接希望它有所帮助。link
【参考方案1】:
我不是 php 专家,但您尝试将 oracle 行对象提取到 php 中。 rowtype 仅在 oracle pl/sql 代码中使用。
试试这个方法
create or replace function get_musician_fun( i_mus_id in musicians.id%type)
return varchar2
as
musician_row varchar2(32000);
begin
select m.id||','|| m.first_name||','|| m.last_name||','|| m.born||','|| m.died ||','|| m.picture_path||','|| m.bio
into o_mus_rec
from musicians m
where id = i_mus_id;
return musician_row;
exception
when no_data_found then
raise_application_error(-20005,'found nothing.');
when too_many_rows then
raise_application_error(-20006,'found too many.');
when others then
raise_application_error(-20007,'cannot get musician.');
end get_musician_fun;
并像 csv 一样在您的 php 上拆分结果。
查看修改后的raise_application_error
位上面的代码。
您可能会更好地查询数据库并获取行
没有存储过程。
【讨论】:
我还发现rowtype不能在oracle之外使用,所以我决定用游标来做。无论如何,您的答案会起作用,所以我会接受。谢谢以上是关于ORA-06550、PLS-00103、ORA-06512 函数的主要内容,如果未能解决你的问题,请参考以下文章
ORA-06550、PLS-00103、ORA-06512 函数
无法解决 ora-06550 pls-00103 查询中的错误
oracle - PLS-00103 & ORA -06550 关于程序
ORA-06550 第 10 行,第 41 列:PLS-00103:在预期以下情况之一时遇到符号“,”: