2014-11-08 6 views
-1

Oracle에 익숙하며이 문제가 발생했습니다. 절차에 넣을 때 Oracle Statement가 작동하지 않습니다.

는이 같은 절차 생성 :

CREATE OR REPLACE PROCEDURE getArt 
as 
begin 
    select ar.artTitle, ar.artContent, ar.DateCreated, ar.artCategory, ac.accName 
     from hng_art ar 
      join HNG_ACCOUNTS ac 
      on ar.accNo = ac.accNo 
    order by ar.artNo desc 
end getArt; 

내가 독립적으로 SELECT 문을 실행하려고하고 일했다. 그러나, 내가 그것을 절차에 넣었을 때. 나는 일하지 않았다. "GETART"에 대한

오류

ERROR at line 4: PL/SQL: SQL Statement ignored 
ERROR at line 4: PL/SQL: ORA-00933: SQL command not properly ended 
ERROR at line 5: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:  ; 

당신에게

답변

4

몇 가지 오류를 감사 : 다음은 오류입니다.

현재 컴파일러는 select 문 뒤에 세미콜론이 누락되었다는 사실에 반대합니다. PL/SQL의 모든 구문은 세미콜론으로 끝나야합니다.

일단 수정하면 저장 프로 시저가 select 문을 단순히 실행할 수 없기 때문에 오류가 발생합니다. 결과와 함께 뭔가를해야합니다. 쿼리가 항상 정확히 한 행을 반환한다는 것을 알고 있다면 일부 로컬 변수를 선언하고 select into을 사용하여 해당 변수를 채울 수 있습니다. 그러나 귀하의 쿼리가 1 행 이상을 반환 할 수도 있습니다. 프로 시저에 for 루프를 작성하고 결과를 반복하며 행을 사용하여 작업을 수행 할 수 있습니다. 또는 OUT 매개 변수가 SYS_REFCURSOR 인 프로 시저를 선언하고 쿼리에 대한 커서를 연 다음 해당 커서를 호출자에게 반환 할 수 있습니다. 12.1 또는 그 이후 버전 인 경우 오라클은 약간의 문법적 설탕을 도입하여 프로 시저가 OUT 매개 변수를 선언하지 않고 결과를 반환 할 수 있지만 실제로 상황이 아닌 것으로 짐작하고 있습니다.

구문 론적으로, 당신은 다음과 같이 할 수 있습니다.

CREATE OR REPLACE PROCEDURE getArt(p_rc OUT sys_refcursor) 
as 
begin 
    open p_rc 
    for 
    select ar.artTitle, ar.artContent, ar.DateCreated, ar.artCategory, ac.accName 
     from hng_art ar 
      join HNG_ACCOUNTS ac 
      on ar.accNo = ac.accNo 
    order by ar.artNo desc; 
end getArt; 

그러나 이것은 합법적이지만, 특히 관용적 인 것은 아닙니다. select 문을 실행중인 코드가있는 경우 일반적으로 저장 프로 시저가 아닌보기를 만드는 것이 훨씬 더 합리적입니다. 결과를 반환하기 전에 많은 양의 PL/SQL 처리를 수행하는 경우 파이프 라인 된 테이블 함수가 적합 할 수 있습니다.

+0

보기를 전환했는데 저에게 효과적이었습니다. 조언 해 주셔서 감사합니다. 더 공부하겠습니다. – hngdev