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
Trả lời
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 ...
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
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!
Đ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
@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
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
- 1. Kiểm tra bản ghi IS NOT NULL trong plsql
- 2. Mảng trong mệnh đề mệnh đề IN() trong PLSQL
- 3. buộc slf4j in các bản ghi theo thứ tự
- 4. Các trường "phụ thuộc" của Haskell trong một bản ghi?
- 5. Phản ánh trong PLSQL?
- 6. Bản ghi Magento in nội dung mảng
- 7. Truy cập các trường bản ghi Delphi qua. hoặc^
- 8. Tạo các trường tùy chọn trên bản ghi Clojure?
- 9. Tìm tất cả các bản ghi có trường phi nil?
- 10. Kết hợp các bộ sưu tập trong PLSQL
- 11. Tìm bản ghi có trường ngày trong 24 giờ qua
- 12. Cập nhật một trường trong tất cả các bản ghi trong elasticsearch
- 13. Chọn từ mảng PLSQL Associative?
- 14. in phần còn lại của các trường trong awk
- 15. Trong FsCheck, cách tạo bản ghi thử nghiệm với các trường không âm?
- 16. Phân loại các bản ghi trong Java
- 17. Cách đơn giản nhất để in ra nội dung của trường văn bản trong SQL Server
- 18. cách gọi hàm trong hàm plsql
- 19. Haskell xem xét tên và loại trường của bản ghi
- 20. Ghi đè các trường hoặc thuộc tính trong lớp con
- 21. Bộ chọn bản ghi trong các Loại Lớp của Haskell
- 22. Đường ray: Làm cách nào để tìm() tất cả các bản ghi duy nhất trong các trường nhất định?
- 23. Auto môi trường ghi nhãn trong AUCTeX
- 24. pymongo: xóa các bản ghi thanh lịch
- 25. sắp xếp một danh sách các bản ghi trong Python
- 26. Tìm các bản ghi có hai bản ghi cụ thể trong một bảng khác
- 27. MySQL chậm khi xóa các bản ghi trong bảng lớn
- 28. PLSQL Procudure (Oracle) So sánh một biến trong mệnh đề
- 29. Javascript: Ghi đè CHỈ các trường hiện có trong một đối tượng với các trường khác trong
- 30. In các bản BigIntegers rất lớn
Bạn đang cố gắng in ra tên trường cơ sở dữ liệu hoặc các giá trị? – DOK
Tôi đang cố gắng in Tên trường và giá trị tương ứng của nó. – Iban
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