2012-01-03 19 views
5

Làm cách nào để in tất cả các trường của một biến bản ghi trong PL/SQL. Biến bản ghi có nhiều trường để có cách nào tốt hơn so với in từng trường? Cũng đã thử sql động nhưng không giúp đỡ.In các trường Bản ghi trong PL/SQL

+0

Bạn đang cố gắng in ra tên trường cơ sở dữ liệu hoặc các giá trị? – DOK

+1

Tôi đang cố gắng in Tên trường và giá trị tương ứng của nó. – Iban

+0

Tôi nghĩ rằng những gì bạn muốn là sử dụng một [con trỏ] (http://docs.oracle.com/cd/B14117_01/appdev.101/b10807/06_ora.htm#i36655). Tôi với DOK ... bạn muốn in tất cả các trường trong một bản ghi mà không in từng trường? Từ ngữ chính xác hơn của câu hỏi có thể hữu ích. – Dallas

Trả lời

0

Nếu đó là một khối PL/SQL mà bạn đang chạy trong một IDE thì bạn có thể sử dụng một pinch DBMS_OUTPUT để xuất các giá trị.

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_output.htm

Ví dụ:

SET SERVEROUTPUT ON 

DECLARE 
    -- Define the record 
    TYPE test_rectype IS RECORD (
     field1 NUMBER, 
     field2 VARCHAR2 
    ); 
    -- Define a variable for the record 
    test_rec TEST_RECTYPE; 
BEGIN 
    -- Populate the record 
    test_rec.field1 := 1; 
    test_rec.field2 := 'my value'; 
    -- Enable the DBMS_OUTPUT 
    DBMS_OUTPUT.enable(1000000); 
    -- Send the output to the buffer 
    DBMS_OUTPUT.put_line('Field1: '||test_rec.field1||', Field2: '||test_rec.field2); 
END; 

Có nhiều hơn để DBMS_OUTPUT vì vậy hãy xem xét các tài liệu từ các liên kết ở trên.

Hoặc, bạn có thể ghi các giá trị vào tệp bằng cách sử dụng UTL_FILE.

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm

Hy vọng nó sẽ giúp ...

+1

Biến bản ghi mà tôi đang sử dụng có hơn 50 trường. Vì vậy, có cách nào tốt hơn bằng cách sử dụng DBMS_OUTPUT.PUT_LINE cho tất cả 50 trường? – Iban

6

xây dựng trên Ollies sử dụng DBMS_OUTPUT, nhưng đối với tự động đi qua các con trỏ

thiết lập cho thử nghiệm

/*create table temp (aa varchar2(50) , bb number , cc date) ; 

insert into temp (aa,bb,cc) 
    select chr(level+100) , level, sysdate+level 
    from dual 
    connect by level < 15 ; 
/
*/ 

Chặn để hiển thị thử nghiệm (giả định 11g)

set serveroutput on 
declare 
    l_cur SYS_REFCURSOR ; 

    PROCEDURE CursorOutput(
          p_refcursor  IN OUT SYS_REFCURSOR 
         ) 
    AS 
     l_desc   DBMS_SQL.DESC_TAB ; 
     l_cols   BINARY_INTEGER ; 
     l_cursor  BINARY_INTEGER ; 
     v_varchar2  VARCHAR2(4000) ; 
     v_number  NUMBER ; 
     v_date   DATE ; 
     l_data   varchar2(32767) ; 
     l_columnValue VARCHAR2(32767) ; 
     l_processedRows Number := 0; 
    BEGIN 

     /* Convert refcursor "parameter" to DBMS_SQL cursor... */ 
     l_cursor := DBMS_SQL.TO_CURSOR_NUMBER(p_refcursor); 
     /* Describe the cursor... */ 
     DBMS_SQL.DESCRIBE_COLUMNS(l_cursor, l_cols, l_desc); 

     /* Define columns to be fetched. We're only using V2, NUM, DATE for example... 
     for a complete list of the col_types this link is accessible. 
     http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements2a.htm#45504 
     http://forums.oracle.com/forums/thread.jspa?threadID=912475 
     if not a usable type, will throw new exception 
     */ 
     FOR i IN 1 .. l_cols LOOP 
      IF l_desc(i).col_type = 2 THEN 
       DBMS_SQL.DEFINE_COLUMN(l_cursor, i, v_number); 
      ELSIF l_desc(i).col_type = 12 THEN 
       DBMS_SQL.DEFINE_COLUMN(l_cursor, i, v_date); 
      ELSif l_desc(i).col_type = 01 or l_desc(i).col_type = 96 then 
       DBMS_SQL.DEFINE_COLUMN(l_cursor, i, v_varchar2, 4000); 
      else 
       --raise an exception if the user's query contains a datatype not (yet) supported by this procedure 
       RAISE_APPLICATION_ERROR(-20000, 'Invalid Data Type for conversion to delimited file. {' || l_desc(i).col_name || '}'); 
      END IF; 
      END LOOP; 


     /* -- print out the column names if desired 
      FOR i IN 1 .. l_cols LOOP 
        dbms_output.put_line('** ' || l_desc(i).col_name) ; 
      END LOOP; 
     */ 

     /* Fetch all data... */ 
     WHILE DBMS_SQL.FETCH_ROWS(l_cursor) > 0 LOOP 
      dbms_output.put_line('LINE: ' || l_processedRows || ''); 
      FOR i IN 1 .. l_cols LOOP 
       if l_desc(i).col_type = 12 THEN --we are in a date 
        DBMS_SQL.COLUMN_VALUE(l_cursor, i, v_date); 
        v_varchar2 := to_char(v_date , 'dd-MON-yyyy') ; 
       elsif l_desc(i).col_type = 2 THEN --we are in a number 
        DBMS_SQL.COLUMN_VALUE(l_cursor, i, v_number); 
        v_varchar2 := to_char(v_number) ; 
       else --treat it as a string (should be varchar2,char,etc) 
        DBMS_SQL.COLUMN_VALUE(l_cursor, i, v_varchar2); 
        IF v_varchar2 IS NOT NULL THEN 
         v_varchar2 := '"' || v_varchar2 || '"' ; 
         ELSE 
         v_varchar2 := ''; 
        END IF ; 
       end if ; 
       dbms_output.put_line(l_desc(i).col_name || '=>' || v_varchar2) ; 
      END LOOP; 
      l_processedRows := l_processedRows + 1 ; 
      END LOOP; 

      dbms_sql.close_cursor(l_cursor); 
      dbms_output.put_line('I found and processed ' || l_processedRows || ' rows .'); 

    END; 

begin 
     open l_cur for select * from temp; 

     CursorOutput(p_refcursor => l_cur) ; 

end ; 
/

sẽ cung cấp cho bạn kết quả này

LINE: 0 
AA=>"e" 
BB=>1 
CC=>04-JAN-2012 
LINE: 1 
AA=>"f" 
BB=>2 
CC=>05-JAN-2012 
LINE: 2 
AA=>"g" 
BB=>3 
CC=>06-JAN-2012 
LINE: 3 
AA=>"h" 
BB=>4 
CC=>07-JAN-2012 
LINE: 4 
AA=>"i" 
BB=>5 
CC=>08-JAN-2012 
LINE: 5 
AA=>"j" 
BB=>6 
CC=>09-JAN-2012 
LINE: 6 
AA=>"k" 
BB=>7 
CC=>10-JAN-2012 
LINE: 7 
AA=>"l" 
BB=>8 
CC=>11-JAN-2012 
LINE: 8 
AA=>"m" 
BB=>9 
CC=>12-JAN-2012 
LINE: 9 
AA=>"n" 
BB=>10 
CC=>13-JAN-2012 
LINE: 10 
AA=>"o" 
BB=>11 
CC=>14-JAN-2012 
LINE: 11 
AA=>"p" 
BB=>12 
CC=>15-JAN-2012 
LINE: 12 
AA=>"q" 
BB=>13 
CC=>16-JAN-2012 
LINE: 13 
AA=>"r" 
BB=>14 
CC=>17-JAN-2012 
I found and processed 14 rows . 

Tôi đã làm một cái gì đó tương tự như sau để tự động xây dựng một tập tin csv sử dụng hai liên kết này như là nguồn http://www.oracle-developer.net/display.php?id=505 http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:88212348059

Tuỳ về những gì bạn đang làm, tuy nhiên, bạn có thể chỉ muốn chạy nó trong SQL Developer (hoặc Toad) và xuất r esults!

+0

Điều này thực sự hữu ích! Tuy nhiên, đầu vào duy nhất tôi có là biến Record. Tôi sẽ không thể truy vấn trên bất kỳ bảng nào để tạo thành một con trỏ. Nhưng tôi biết bảng mà bản ghi này dựa trên nó được khai báo bằng ROWTYPE. Vì vậy, tôi chỉ có một bản ghi (hàng) với nhiều trường để in. – Iban

+0

@Iban, bỏ lỡ phần đó, hãy để tôi nghiên cứu để xem liệu điều đó có thể thực hiện được không và nếu thế thì - xin lỗi về điều đó! – Harrison

+0

Cảm ơn bạn trước! Tôi cũng đã thử bằng cách sử dụng SQL động. Tôi có thể lấy tên trường bằng cách truy vấn dba_tab_columns như tôi biết bảng mà bản ghi dựa trên đó. Tuy nhiên, bản ghi nằm ngoài phạm vi trong khối sql động để nó bị lỗi. – Iban

Các vấn đề liên quan