2013-07-07 25 views
0

무엇을해야할지 모르겠습니다. 나는 함수를 썼다 오류없이 그것을 컴파일하지만이 코드를 실행하면 다음 내가 가지고 :이 기능입니다ORA-06550, PLS-00103, ORA-06512 on function

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; 

를 내가 얻을 : 나는 어떤 PHP는 전문가는 아니지만 그러나 당신은 PHP로 오라클 행 개체를 가져 오기 위해 노력하고

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 
+0

SQL 개발자로부터. 또한 PHP 스크립트에서이 함수를 호출하여 같은 오류가 발생했습니다. –

+0

SQL 개발자는 Ctrl-F10 (실행)을 사용합니다. 기본 코드는 어떻게 볼 수 있습니까? –

+0

@YoniLevy :'PHP'는 잘 모르겠지만 오류 진술을 보면, PHP 쪽에서 올바른 것을 가져 오지 않는다고 생각합니다. PHP에서 테이블 음악가의 변수를 선언하고 반복 할 필요가 있다고 생각합니다. 링크가 도움이 되길 바랍니다. [link] (http://stackoverflow.com/questions/14055397/recover-a-table-of-varchar2-from-a-pl-sql-function-in-php) –

답변

0

. 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 비트가됩니다.
  • 데이터베이스를 쿼리하고 저장 프로 시저없이 행을 반입하는 것이 좋습니다.
+0

나는 또한 rowtype을 oracle 밖에서 사용할 수 없다는 것을 알았 기 때문에 커서로 처리하기로 결정했습니다. 어쨌든 당신의 대답이 효과가 있으므로 받아 들일 것입니다. 감사 –