J'ai une question à propos de la mise en file d'attente des résultats de mon programme. Mon exemple de script SQL ressemble à ceci.
whenever sqlerror exit failure rollback
set heading off
set arraysize 1
set newpage 0
set pages 0
set feedback off
set echo off
set verify off
declare
ab varchar2(10) := 'Raj';
cd varchar2(10);
a number := 10;
c number;
d number;
begin
c := a+10;
select ab,c into cd,d from dual;
end;
SPOOL
select cd,d from dual;
SPOOL OFF
EXIT;
Le script ci-dessus ne fonctionne pas, mais je veux faire quelque chose comme ceci où, au début du bloc final, nous calculons certaines valeurs et je veux spouler ces résultats.
Merci.
Cela spoulera la sortie du bloc anonyme dans un fichier appelé output_<YYYYMMDD>.txt
situé à la racine du lecteur C: du PC local: <YYYYMMDD>
étant la date du jour:
SET SERVEROUTPUT ON FORMAT WRAPPED
SET VERIFY OFF
SET FEEDBACK OFF
SET TERMOUT OFF
column date_column new_value today_var
select to_char(sysdate, 'yyyymmdd') date_column
from dual
/
DBMS_OUTPUT.ENABLE(1000000);
SPOOL C:\output_&today_var..txt
DECLARE
ab varchar2(10) := 'Raj';
cd varchar2(10);
a number := 10;
c number;
d number;
BEGIN
c := a+10;
--
SELECT ab, c
INTO cd, d
FROM dual;
--
DBMS_OUTPUT.put_line('cd: '||cd);
DBMS_OUTPUT.put_line('d: '||d);
END;
SPOOL OFF
SET TERMOUT ON
SET FEEDBACK ON
SET VERIFY ON
Prompt
PROMPT Done, please see file C:\output_&today_var..txt
Prompt
J'espère que ça aide...
MODIFIER:
Après votre commentaire pour afficher une valeur pour chaque itération d'un curseur (je réalise que chaque valeur sera la même dans cet exemple, mais vous devriez obtenir le résumé de ce que je fais):
BEGIN
c := a+10;
--
FOR i IN 1 .. 10
LOOP
c := a+10;
-- Output the value of C
DBMS_OUTPUT.put_line('c: '||c);
END LOOP;
--
END;
Avec bobine:
set heading off
set arraysize 1
set newpage 0
set pages 0
set feedback off
set echo off
set verify off
variable cd varchar2(10);
variable d number;
declare
ab varchar2(10) := 'Raj';
a number := 10;
c number;
begin
c := a+10;
select ab,c into :cd,:d from dual;
end;
SPOOL
select :cd,:d from dual;
SPOOL OFF
EXIT;
Mettre en file d'attente à partir d'un bloc BEGIN
END
est assez simple. Par exemple, si vous devez spouler le résultat de deux tables dans un fichier, utilisez simplement le for loop
. Un exemple de code est donné ci-dessous.
BEGIN
FOR x IN
(
SELECT COLUMN1,COLUMN2 FROM TABLE1
UNION ALL
SELECT COLUMN1,COLUMN2 FROM TABLEB
)
LOOP
dbms_output.put_line(x.COLUMN1 || '|' || x.COLUMN2);
END LOOP;
END;
/