0

私は上司から与えられたプロジェクトに取り組んでいます。あまり経験がありませんが、学ばなければなりません。Oracle DB 11g に関するもので、クエリ言語として SQLPlus と 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 を使用してみましたが、クエリ ステートメントからの出力を直接分析する方法がわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

1

基本的に、クエリステートメントごとに、結果を解釈して true/false をファイルに出力するスクリプトが必要です。

「true false」とは、1 行以上が返された場合は「True」、行が返されなかった場合は「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 にログインし、次のように入力します。

sqlplus を終了すると、出力ファイルはスクリプト ファイルと同じディレクトリになります。

各ステートメントの後に、「行が選択されていません」、「1 行が選択されています」、「2 行が選択されています」などと表示されます。

タイミング (タイミングをオンに設定) やその他のフォーマット (タイトルなど) を追加することもできます。それはあなたに任せます。ここここでいくつかのオプションを確認してください。

これは、選択された行などの基本的な情報を取得するためだけにすべての SQL を PL/SQL 内にラップするよりも、より簡単な方法です。

于 2011-05-25T11:53:04.950 に答える
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(*) は 0 を返すため、フィールドでカウントしないで COUNT(*) を使用することが重要です。

追加する編集: カーソルに相当するものは

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;

また、カーソルが開かれるとアクセスできるcursor%FOUNDやcursor%NOTFOUNDなどのカーソルで使用できるテストもあります。ただし、レコードが存在するかどうかをテストするだけの場合は、より詳細になる可能性があります。

また、SELECT INTO ステートメントを実行している場合は、常にレコードを返すことが保証されている COUNT(*) を実行していない限り、行が多すぎる、または行がないという例外をキャッチすることをお勧めします。

于 2011-05-25T10:06:51.513 に答える