2017-02-15 4 views
0

DBMS_OUTPUT.CHARARR의 결과를 제공하는 DBMS_OUTPUT.GET_LINES를 사용할 때이를 varchar2로 변환하는 방법은 무엇입니까? DBMS_OUTPUT.GET_LINES를 사용하여 모든 DBMS_PUTLINE 문을 가져 와서 호출 프로그램에 문자열로 반환하려고합니다.DBMS_OUTPUT.GET_LINES를 VARCHAR2로 변환하는 방법은 무엇입니까?

데이터베이스 : 오라클 12C

PLSQL 버전 : 버전 11.0.6.1776

declare 
    -- Non-scalar parameters require additional processing 

    v_Data  DBMS_OUTPUT.CHARARR; 
    v_NumLines NUMBER; 
begin 
    -- Call the procedure 


    -- Procedure that will generate DMBS_OUTPUT.PUT_LINEs 
    executeProcFoo(); 

    v_NumLines := 1000; 
    DBMS_OUTPUT.GET_LINES(v_Data, v_NumLines); 

    FOR v_Counter IN 1..v_NumLines LOOP 
     --output putlines from get_lines 
     DBMS_OUTPUT.put_line(v_Data(v_Counter)); 
    END LOOP; 
end; 
+0

dbms_output.chararr'은 이미'varchar2'의 배열입니다. 'varchar2'로 변환하면 무엇을 의미합니까? 하나의 긴 문자열로 원하니? 또는 호출 프레임 워크와 더 호환되는 다른 콜렉션 유형으로이를 게시해야합니까? –

+0

하나의 긴 문자열로 예. 호출하는 Java 응용 프로그램에 결과를 하나의 문자열로 반환하고 싶습니다. – haju

+0

왜? 확실히 Java에는 배열이 있습니까? 그러나 어쨌든 배열을 반복하여 적절한 텍스트 변수에 추가하십시오. 나는 아직도 기술적 인 문제를 보지 않고있다. –

답변

0

이 시도 : 당신은 어떤 프로시 저나 함수에 v_var 다음 전달할 수 있습니다

DECLARE 
    -- Non-scalar parameters require additional processing 

    v_Data  DBMS_OUTPUT.CHARARR; 
    v_NumLines NUMBER; 

    TYPE v IS TABLE OF VARCHAR2 (1000) 
       INDEX BY BINARY_INTEGER; 

    v_var  v; 
BEGIN 
    -- Call the procedure 


    -- Procedure that will generate DMBS_OUTPUT.PUT_LINEs 
    DBMS_OUTPUT.PUT_LINE ('vvvv'); 
    DBMS_OUTPUT.put_line ('xxxxx'); 

    v_NumLines := 1000; 
    DBMS_OUTPUT.GET_LINES (v_Data, v_NumLines); 

    FOR v_Counter IN v_data.FIRST .. v_data.LAST 
    LOOP 
     --output putlines from get_lines 
     DBMS_OUTPUT.put_line (v_Data (v_Counter)); 
     v_var (v_counter) := v_data (v_counter); 
    END LOOP; 
END; 

.

+0

이 저장 프로 시저를 호출하는 Java에 단일 문자열을 반환하고자합니다. 이 경우 v의 테이블을 반복하여 varchar2를 빌드하면 반환되는 최종 문자열을 빌드 할 수 있습니까? – haju

+0

네, 그렇게 할 수 있습니다. –

2

주석에서 Java 애플리케이션에 DBMS_OUTPUT 버퍼를 가져 오는 편리한 방법을 찾고있는 것처럼 보입니다. SQL 형식을 Java 호환 배열로 게시하는 방법이 있지만 (저는 Java 개발자가 아니므로 dbms_output.get_lines에 오버로드가 발생하여 dbmsoutput_linesarray을 반환 할 수 있습니다.이 경우 더 쉽게 작업 할 수 있습니다. dbms_output.chararray), 참조 커서가 트릭을 할 수 있다고 생각났습니다.

그래서, 당신은 컬렉션으로 출력 버퍼를 반환하는 함수를 만들 수 있습니다 경우

create or replace function get_dbms_output 
    return dbmsoutput_linesarray 
as 
    l_output dbmsoutput_linesarray; 
    l_linecount number; 
begin 
    dbms_output.get_lines(l_output, l_linecount); 

    if l_output.count > l_linecount then 
     -- Remove the final empty line above l_linecount 
     l_output.trim; 
    end if; 

    return l_output; 
end get_dbms_output; 

지금 당신에게 표준을 제공한다

select column_value from table(get_dbms_output) 

등 정상적인 SQL 쿼리를 실행할 수 있습니다 참조 커서.

데모 :

SQL> set serveroutput off 
SQL> 
SQL> begin 
    2  dbms_output.enable; 
    3  dbms_output.put_line('This is a line'); 
    4  dbms_output.put_line('This is another line'); 
    5  dbms_output.put_line('This is the last line.'); 
    6 end; 
    7/

PL/SQL procedure successfully completed. 

SQL> select column_value from table(get_dbms_output); 

COLUMN_VALUE 
-------------------------------------------------------- 
This is a line 
This is another line 
This is the last line. 

3 rows selected. 

합니다 (set serveroutput off은 * SQL을 중지하는 것입니다 플러스 전화의 끝에서 dbms_output.get_lines 자신의 일을하고 할 수있는 아무것도 내 기능을 떠나는에서 dbms_output.enableset serveroutput off가 DBMS_OUTPUT을 비활성화하기 때문이다. 이것은 SQL * Plus의 데모 용도로만 사용되며 자바에서는 필요하지 않습니다.

+0

변수 유형이 column_value의 대상은 무엇입니까? – haju

+0

아, 좋은 지적입니다. 이제 varchar2 (32767)입니다. 오라클 12c를 사용하고 있고 확장 된 데이터 유형을 사용하지 않는 한 4000 바이트보다 긴 행에 몇 가지 문제가 발생할 수 있다고 생각합니다 (https://oracle-base.com/articles/12c/extended-data-types-12cR1)). –

+0

4001 문자 라인으로 테스트 한 결과, 클라이언트가 여전히 그 값을 거부하지 않았다면 다른 어떤 것으로는 실패했을 것이라는 의심이 들더라도,'ORA-24920 : 컬럼 크기가 클수록'실패했습니다. 어쩌면 내가 파이프 라인 된 함수를 만들 수 있고 각 줄을 확인하고 필요한 경우 나누기 때문에 실패하지는 않지만 더 많은 논리를 추가하지 않으면 일부 서식이 깨지고 일부 단어가 두 개로 나뉠 수 있습니다. –