首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >功能上的ORA-06550、PLS-00103、ORA-06512

功能上的ORA-06550、PLS-00103、ORA-06512
EN

Stack Overflow用户
提问于 2013-07-07 17:25:57
回答 1查看 5.6K关注 0票数 0

我不知道该怎么办。我编写了一个函数,没有错误地编译它,但是当我运行代码时,我得到了:

代码语言:javascript
复制
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

这是函数:

代码语言:javascript
复制
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;

编辑:

当我使用以下命令调用它时:

代码语言:javascript
复制
declare 
result musicians%rowtype;
begin
result := get_musician_fun(53); 
end;
/

我明白了:"anonymous block completed"

但在PHP中调用它时:

代码语言:javascript
复制
$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;

我得到了:

代码语言:javascript
复制
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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-07 21:07:25

我不是php专家,但是你想把oracle row对象放到php里。rowtype仅在oracle pl/sql代码中使用。

尝试这种方法

代码语言:javascript
复制
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;

然后在你的php上像csv一样分割结果。

  • 看看上面修改过的raise_application_error位代码。
  • 您最好在不使用存储过程的情况下查询数据库和提取行。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17510811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档