2011-05-25 67 views
0

我正在開發一個項目,我的老闆給了我。我沒有太多經驗,但我必須學習它。這是關於Oracle DB 11g的,我使用SQLPlus和PL/SQL作爲查詢語言。Oracle PL/SQL分析查詢輸出,寫入文件

基本上對於每個查詢語句,我將需要腳本來解釋結果並輸出true/false到文件。

例如,

select id from sample_table where id=3; 

/**code needed that will do something like:**/ 
/**if(id=3), write to file TRUE, else, write to file FALSE**/ 

select salary from sample2 where id=5; 

/**similar code needed as above**/ 

select employee from sample3 where id=6; 

/** another TRUE or FALSE output to the file **/ 

我一直在使用DBMS_OUTPUT.PUT_LINE嘗試,但對如何直接從報表的查詢分析輸出不知道。將非常感謝任何幫助!

回答

1

如果從不同的表我將使用下面的選擇 - 如果相同的查詢正在與僅一個參數(如ID),用於可替換地,可以使用一個光標改變在這種情況下可以使用光標參數。

DECLARE 
    v_count PLS_INTEGER; 
BEGIN 
    SELECT COUNT(*) 
    INTO v_count 
    FROM sample_table 
    WHERE id=3; 

    CASE v_count 
     WHEN 0 THEN dbms_output.put_line('FALSE'); 
     ELSE dbms_output.put_line('TRUE'); 
    END CASE; 

END; 

它使用COUNT(*)作爲COUNT(*)仍然返回0,如果不存在任何記錄中的字段不算是很重要的。

編輯補充:光標相當於是

DECLARE 
    v_count PLS_INTEGER; 

    CURSOR count_cur(cp_id sample_table.id%TYPE) 
    IS 
     SELECT COUNT(*) 
     FROM sample_table 
     WHERE id = cp_id; 
BEGIN 
    OPEN count_cur(3); 
    FETCH count_cur INTO v_count; 
    CLOSE count_cur; 

    CASE v_count 
     WHEN 0 THEN dbms_output.put_line('FALSE'); 
     ELSE dbms_output.put_line('TRUE'); 
    END CASE; 

END; 

也有可用的測試上的光標,如光標%FOUND或光標%NOTFOUND可以訪問一次打開遊標。雖然如果你只是在測試一個記錄是否存在,可能會更冗長。

還要記住,如果你正在做一個SELECT INTO語句,除非你正在做COUNT(*),它總是會返回一條記錄,這是很好的形式來捕捉可能太多或者沒有行的異常。

+1

行使用COUNT(*),以檢查是否存在可以是一個更簡單的方法當涉及的表包含大量行時,開銷很大...... – 2011-05-25 11:50:23

+0

鑑於他所有的示例都使用ID進行測試,我做出了合理的假設,即將有索引 - 使其成爲純索引查找(索引唯一掃描)。額外的SORT AGGREGATE出現在我的解釋計劃中,而不是大量的開銷 – Chris 2011-05-26 09:05:04

+0

我沒有看到任何信息表明ID列是唯一的。如果它是唯一的,COUNT(*)僅僅是多餘的,但對性能確實無害。如果沒有,那麼我的第一個評論仍然存在。我會添加一個FIRST_ROWS(1)提示和一個ROWNUM = 1謂詞。 – 2011-05-26 10:23:21

1

基本上每個查詢語句,我 需要的腳本解釋 結果和輸出真/假的 文件

通過「真正的假」我想你的意思是:「真「如果返回1行或更多行,如果沒有行返回,則返回」false「。

你並不需要這樣的PL/SQL包裝,你可以把你所有的SQL語句到sqlplus中有一些設置和閥芯到一個文件中,是這樣的:

spool "my_tests.dat" 
set serveroutput off 
set echo off 
set head off 
set pagesize 60 
set linesize 80 
set feedback 1 

prompt This should return no rows 
select dummy from dual where 1=0; 

prompt This should return 1 row 
select sysdate from dual; 

prompt This should return 2 rows 
select sysdate from dual 
union 
select sysdate-1 from dual; 

prompt Complete 
spool off 

保存腳本到文件(「my_script.sql」),使用與腳本文件相同的目錄中的sqlplus登錄到Oracle,然後鍵入:@ my_script.sql

退出sqlplus並且您的輸出文件將與腳本文件位於同一目錄中。

每個語句後,你會看到「選擇無行」或「1列選擇」或「選擇2行」等

您還可以添加定時(上定時設定)和其他格式(標題等)。我把它留給你,檢查herehere某些選項。

這可能是這樣,而不是包裝所有SQL PL/SQL中,只是爲了得到一些基本的信息,如選擇