2011-12-21 27 views
7

Tôi có một câu hỏi về cách phân tích kết quả của chương trình. Kịch bản lệnh sql mẫu của tôi trông như thế này.Cách tạo tập tin spool oracle sql spool

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; 

Đoạn mã trên không có tác dụng, nhưng tôi muốn làm điều gì đó như thế này trong khối bắt đầu, chúng tôi tính toán một số giá trị và tôi muốn đánh dấu các kết quả đó.

Cảm ơn.

Trả lời

15

này sẽ ống chỉ đầu ra từ khối vô danh thành một tập tin gọi là output_<YYYYMMDD>.txt nằm trong thư mục gốc của máy tính C ở địa phương: lái xe nơi <YYYYMMDD> là ngày hiện tại:

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 

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

EDIT:

Sau khi bình luận của bạn để ra giá trị cho mỗi lần lặp của một con trỏ (tôi nhận thấy mỗi giá trị sẽ vẫn giữ nguyên trong ví dụ này, nhưng bạn sẽ nhận được các ý chính về những gì tôi đang làm):

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; 
+0

Điều gì sẽ xảy ra nếu có con trỏ trong khối và vòng lặp nằm bên trong đầu tiên. Giống như 'vòng lặp c: = a + 10; chọn c thành: d từ kép; kết thúc vòng lặp; kết thúc; SPOOL chọn: d từ kép; SPOOL OFF EXIT; ' Vì vậy, bây giờ nó sẽ cung cấp cho tất cả các kết quả hoặc người nào khác sản lượng cuối cùng được lưu trữ trong: d. Làm thế nào để spool nếu có một vòng lặp. – user987900

+1

Bạn có thể sử dụng DBMS_OUTPUT trong vòng lặp con trỏ để xuất ra giá trị tại mỗi lần lặp của con trỏ. Xem chỉnh sửa .. – Ollie

+0

Hi Ollie, tôi có thêm một câu hỏi nữa. Đoạn mã trên hoạt động tốt khi tôi chạy từ SQL * plus. Nhưng, tôi có một kịch bản lệnh shell để gọi tập lệnh SQL này và chuyển đầu ra thành tệp văn bản. Tôi đã đăng ký kịch bản lệnh shell trong các ứng dụng Oracle và khi tôi gửi yêu cầu từ các ứng dụng để chạy. Nó cho thấy bình thường và chạy nhưng nó không bao giờ được hoàn thành. Do, tôi phải thực hiện bất kỳ thay đổi nào đối với kịch bản trên khi gọi từ một kịch bản lệnh shell. – user987900

2

Với ống chỉ:

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; 
+0

Điều gì sẽ xảy ra nếu có một con trỏ trong khối và nó lặp lại bên trong đầu. Giống như 'vòng lặp c: = a + 10; chọn c thành: d từ kép; vòng lặp kết thúc; kết thúc; SPOOL chọn: d từ kép; SPOOL OFF EXIT; ' Vì vậy, bây giờ nó sẽ cung cấp cho tất cả các kết quả hoặc người nào khác sản lượng cuối cùng được lưu trữ trong: d. Làm thế nào để spool nếu có một vòng lặp. – user987900

+0

Sẽ không hoạt động theo cách đó. Bạn có thể spool SQL selects, chứ không phải PL/SQL. Đối với đầu ra trong mã pl/sql, bạn có thể sử dụng gói dbms_output, như Ollie đã chỉ ra. –

+0

Cảm ơn sự giúp đỡ của bạn Florin .. – user987900

-3

Để thực hiện một tập tin spool trong PLSQL Đến File-> New-> cửa sổ lệnh -> dán của bạn số-> thực thi. Đã đến thư mục và bạn sẽ tìm thấy tập tin.

0

Để ống chỉ từ một khối BEGINEND khá đơn giản. Ví dụ, nếu bạn cần phải spool kết quả từ hai bảng vào một tập tin, sau đó chỉ cần sử dụng for loop. Mã mẫu được đưa ra dưới đây.

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; 
/
Các vấn đề liên quan