Come posso stampare tutti i campi di una variabile di registrazione in PL/SQL. La variabile record ha molti campi, quindi c'è un modo migliore di stampare ogni campo? Anche provato SQL dinamico ma non ha aiutato.Stampa campi di record in PL/SQL
risposta
Se si tratta di un blocco PL/SQL in esecuzione in un IDE, è possibile utilizzare DBMS_OUTPUT per emettere i valori.
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_output.htm
Ad esempio:
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;
V'è di più per DBMS_OUTPUT modo da dare un'occhiata ai documenti dal link qui sopra.
In alternativa, è possibile scrivere i valori su un file utilizzando UTL_FILE.
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm
Speranza che aiuta ...
La variabile record che sto usando ha più di 50 campi. Quindi c'è un modo migliore di usare DBMS_OUTPUT.PUT_LINE per tutti i 50 campi? – Iban
Sulla Ollies uso di DBMS_OUTPUT, ma per passare in modo dinamico attraverso il cursore
istituito per il test
/*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 ;
/
*/
Blocco per mostrare il test (questo presuppone 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 ;
/
vi darà questo risultato
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 .
avevo fatto qualcosa di simile a questo per creare dinamicamente un file CSV utilizzando questi due link come fonti http://www.oracle-developer.net/display.php?id=505 http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:88212348059
seconda su cosa si sta andando, tuttavia, si può semplicemente volerlo eseguire in SQL Developer (o Toad) ed esportare la r isultati!
Questo davvero aiuta! Tuttavia, l'unico input che ho è una variabile Record. Non sarei in grado di interrogare su nessuna delle tabelle per formare un cursore. Ma conosco la tabella su cui è basato questo record, in quanto viene dichiarato utilizzando ROWTYPE. Quindi ho solo un record (riga) con molti campi da stampare. – Iban
@Iban, mancata quella parte, lasciami fare delle ricerche per vedere se è possibile e se è così, scusami! – Harrison
Grazie in anticipo! Anch'io ho provato usando l'SQL dinamico. Posso ottenere i nomi dei campi interrogando dba_tab_columns poiché conosco la tabella su cui si basa il record. Tuttavia, il record non rientra nell'ambito del blocco SQL dinamico in modo che si verifichino errori. – Iban
- 1. Controllare un record IS NOT NULL in plsql
- 2. Riflessione in PLSQL?
- 3. funzione di incremento in plsql
- 4. Concatenazione di raccolte in PLSQL
- 5. Oracle: ottenere riferimenti in PLSQL
- 6. Seleziona dall'array associativo PLSQL?
- 7. Ridefinire i campi di un record in Clojure
- 8. Posso rinominare i campi in una serie di record numpy
- 9. Come eseguire iterazioni sui campi dei record?
- 10. È possibile documentare i campi in un record in clojure?
- 11. Database - (righe o record, colonne o campi)?
- 12. valori di stampa di tutti i campi di una struttura
- 13. Stampa tutti i campi con AWK separati da OFS
- 14. come chiamare una funzione in funzione plsql
- 15. Significato del simbolo PLSQL "=>"
- 16. uguaglianza inferenza in F # record + con campi mutabili
- 17. Rails: come trovo() tutti i record univoci in determinati campi?
- 18. Convalida ad hoc per campi Record in Lift
- 19. Stampa un elenco di campi passati come una variabile
- 20. Copia di campi in OCaml
- 21. Aggiornamento modulo Apex tabellare con PLSQL
- 22. Ottieni l'elenco utenti LDAP utilizzando PLSQL
- 23. Contrassegna procedura/funzione PLSQL come obsoleto
- 24. JDBC PLSQL: come ottenere l'ultimo ID riga?
- 25. pattern matching su due record con gli stessi campi
- 26. Trova record duplicati in MongoDB
- 27. - Stampa quando modifiche di gruppo
- 28. plsql/cursors gestiscono l'eccezione e ritornano al flusso di esecuzione
- 29. Procudure PLSQL (Oracle) Confronto di una variabile nella clausola where
- 30. Oracle PLSQL truncate datetimes a blocchi di 15 minuti
Si sta tentando di stampare i nomi dei campi del database oi valori? – DOK
Sto tentando di stampare il Nome campo e il suo valore corrispondente. – Iban
Penso che quello che vuoi è usare un [cursore] (http://docs.oracle.com/cd/B14117_01/appdev.101/b10807/06_ora.htm#i36655). Sono con DOK ... vuoi stampare tutti i campi in un record senza stampare ogni campo? Potrebbe essere utile una formulazione più precisa della domanda. – Dallas