2014-12-30 3 views
0

Oracle 및 저장 프로 시저를 처음 사용합니다. SQL Server 에서처럼 필드 이름이있는 레코드 집합을 extern 프로그램에 반환 할 수 있는지 여부를 알고 싶습니다. 나는 약간의 문서를 읽었지 만 나는 올바른 길을 가고 있는지 확신 할 수 없다. Sys_Refcursor를 사용할 때 한 필드 만 반환 할 수 있고 원하는만큼 많이 반환 할 수는 없습니다.필드 이름이있는 Oracle 저장 프로 시저 반환 레코드 집합

여러 필드 이름을 반환해야 하나의 입력 매개 변수가 있습니다. 프로그램의 문서에서

, 내가 SQL Server에 대한 예를하고 난 내 Oracle 저장 프로 시저에 대해 동일한을 가지고 싶다 : 나는 그렇게 할 수있는 방법을 제안는
Use 
Go 
Set Ansi_Nulls ON 
Go 
Alter Procedure 
    @InputLocation Varchar(255) 
As 
Begin 
    Set Nocount On; 
    select FirstName as '@FirstName', Company as '@Company' from dbo.company where Location = @InputLocation 
End 

이 있습니까? 추가 정보가 필요하시면 알려주세요. 감사.

/편집 :

내 샘플 코드 (작동 있는지 확인하기 위해 단지 출력을 생성하기위한 첫 번째 단계에서 입력 매개 변수를 사용하지 않고) : PL에 사용

create or replace 
PROCEDURE TEST_PROZEDUR1 (
    Input_Location IN Varchar2, 
    First_Name OUT SYS_Refcursor, 
    Company OUT Sys_Refcursor) IS 
BEGIN 
    open First_Name For Select FirstName from dbo.company; 
    open Company For Select Company from dbo.company; 
END TEST_PROZEDUR1; 
+0

'sys_refcursor'는 어떤 쿼리의 결과가 될 것입니다. 여기서 한 필드를 의미합니까? http://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets.php – Exhausted

+0

예를 들어 필드는 '@Firstname'과 '@Company'입니다 (Oracle에서는 : Firstname, : Company). 호출 프로그래머는 필드가있는 레코드 세트가 필요합니다. 만약 내가 그 중 하나를 반환하면 작동하지만, 둘 다 반환하면, 난 단지 내 코드에서 언급 한 첫 번째 얻을. SQL Developer에서 두 변수를 볼 수 있습니다. 이해할 수 있니? – triplus

+1

Plsql에 샘플 코드를 게시하면 – Exhausted

답변

0

프로그래밍 모델/SQL과 TSQL은 다릅니다. TSQL에서 레코드 세트를 반환 할 수있는 곳에서는 PL/SQL에서 커서를 반환합니다. 커서는 열리고 읽을 수있는 SQL 문의 포인터입니다. 단일 열 반환에 국한되지 않습니다.

DECLARE 
    cCursor  SYS_REFCURSOR; 
    strFirstname COMPANY.FIRSTNAME%TYPE; 
    strCompany COMPANY.COMPANY%TYPE; 
BEGIN 
    cCursor := GET_INPUT_LOCATION('SOMEWHERE OVER THE RAINBOW, INC.'); 

    FETCH cCursor 
    INTO strFirstname, 
     strCompany; 

    CLOSE cCursor; 
END; 

그러나, 나는 아마이 코딩하지 않을 : 같이 호출자가이 함수를 호출 할

CREATE OR REPLACE FUNCTION GET_INPUT_LOCATION(pinInput_location IN VARCHAR2(255)) 
    RETURN SYS_REFCURSOR 
IS 
    cCursor SYS_REFCURSOR; 
BEGIN 
    OPEN cCursor FOR 
    SELECT FIRSTNAME, 
      COMPANY 
     FROM COMPANY 
     WHERE LOCATION = pinInput_location; 

    RETURN cCursor; 
END GET_INPUT_LOCATION; 

: 대략, 위 TSQL 절차의 PL/SQL 상당 같은 일 것입니다 방법. COMPANY.LOCATION이 고유 한 경우에는 호출자가 완료 할 때 닫아야 할 커서를 기억해야 할 필요가있는 커서를 반환하는 데 많은 어려움을 겪습니다. 대신 출력 매개 변수를 사용하여 FIRSTNAME 및 COMPANY 필드를 반환합니다. 예 :

CREATE OR REPLACE PROCEDURE GET_INPUT_LOCATION 
    (pinInput_location IN VARCHAR2(255), 
    poutFirst_name OUT COMPANY.FIRSTNAME%TYPE, 
    poutCompany  OUT COMPANY.COMPANY%TYPE) 
IS 
    cCursor SYS_REFCURSOR; 
BEGIN 
    SELECT FIRSTNAME, 
     COMPANY 
    INTO poutFirst_name, 
     poutCompany 
    FROM COMPANY 
    WHERE LOCATION = pinInput_location; 
END GET_INPUT_LOCATION; 

공유하고 즐기십시오.

+0

고마워요. 이것은 정말로 많은 도움이되었습니다. 그러나 내 시스템조차도 지금은 접근 할 수 없습니다. 그냥 호기심과 미래의 문제. 테이블이 처음에 알려지지 않았 으면 어떤 방법으로 해결할 수 있습니까? 프로 시저에서 테이블을 결정한 다음 모든 "필드"를 넘겨 줄 필요가 있습니다. "필드"의 수는 테이블에서 무관합니다. – triplus

+0

[DBMS_SQL 설명서 읽기] (http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sql.htm#BABEDAHF). 행운을 빌어 요. –