2011-07-06 3 views
1

sys_refcursor을 반환하는 프로 시저를 실행하려고하는데 with 명령을 사용하여 커서를 가져 오려고하지만 프로 시저를 실행할 때 오류가 발생합니다. 가능한가? 다음은 PROC은 다음과 같습니다sys_refcursor와 함께 내부 프로 시저와 함께 오라클 사용

create or replace 
procedure sp_proc(
    p_vl_skip in number, 
    p_vl_take in number, 
    tblresult out sys_refcursor) 
as 
    v_first_row number; 
    v_last_row number; 
begin 
    select p_vl_skip into v_first_row from dual; 
    select p_vl_skip + p_vl_take into v_last_row from dual; 

    open tblresult for 
    with tbl_relacao_rejeicoes as (
    select vl_value1, vl_value2, row_number() over (order by vl_value1 desc) vl_reg 
    from tb_table 
    order by vl_value1 desc) 
    select * 
    from tbl_relacao_rejeicoes 
    where vl_reg between v_first_row and v_last_row 
    order by cd_motivo_rejeicao vl_value1; 
end; 
/

그것은 어떤 로그없이 컴파일,하지만 난 그것을 실행할 때, 내가 얻을 :

OracleException: ORA-06550: line 1, column 7: 
PLS-00201: identifier 'TBL_RELACAO_REJEICOES' must be declared 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 
+0

어떤 버전의 데이터베이스를 사용합니까? –

+1

왜 사용하지 않습니까? =? –

+0

10R2 ... 죄송합니다. – Pascal

답변

2

두 번째 순서 :

cd_motivo_rejeicao의 vl_value1에 의해 순서;

은 유효하지 않습니다. "cd_motivo_rejeicao"는 선택하지 않은 어딘가에 있습니까? 그럴 경우 vl_value1과 쉼표 사이에 쉼표를 넣으십시오. 그렇지 않으면 제거하십시오. 또한 왜 WITH 절에서 첫 번째 ORDER BY를 얻었는지 잘 모르겠습니다 SELECT - 아무런 도움이되지 않습니까? 여하튼, 나는 두 번째 주문을 수정하여 실행하는 절차를 얻을 수있었습니다. 따라서 커서 내에서 WITH 절을 사용할 수 있습니다.

+0

그래 ... 정말 미안해 ... 내가 게시 한 명령은 실제로 잘못되었다. 내 코드에서 맞다. 문제는 내가 프로 시저 이름을 틀리게했다는 것입니다! sp_proc을 실행하는 대신 프로 시저 이름을 사용했습니다. 14 시간의 코딩 후에는 모든 라인이 흐려지는 경향이 있습니다. Tks 너무 많이! – Pascal