Oracle PL / SQL Анализ вывода запросов, запись в файл - PullRequest
0 голосов
/ 25 мая 2011

Я работаю над проектом, который мне дал мой начальник.У меня нет большого опыта, но я должен изучить его.Это касается 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, но не имею представления о том, как напрямую анализировать выходные данные операторов запроса.Буду очень признателен за любую помощь!

Ответы [ 2 ]

1 голос
/ 25 мая 2011

В основном для каждого оператора запроса мне потребуется скрипт для интерпретации результатов и вывода в файл значений true / false

Под "true false" я предполагаю, что вы имеете в виду: "True«если возвращается 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"), войти в Oracle, используя sqlplus из того же каталога, что и файл скрипта, и набрать: @ my_script.sql

Выход из sqlplus и ваш выходной файл будут находиться в том же каталоге, что и файл сценария.

После каждого оператора вы увидите «не выбрано ни одной строки» или «выбрана 1 строка» или«Выбрано 2 строки» и т. Д.

Вы также можете добавить время (установить время) и другое форматирование (заголовки и т. Д.).Я оставлю это вам, проверьте здесь и здесь для некоторых опций.

Это может быть более простой способ сделать это, чем завернуть все вашиSQL внутри PL / SQL просто для получения некоторой базовой информации, такой как выбранные строки

1 голос
/ 25 мая 2011

Если вы выбираете из разных таблиц, я бы использовал следующее - в качестве альтернативы можно использовать курсор, если один и тот же запрос используется только с изменяющимся параметром (например, 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 (*), который гарантированно всегда возвращает запись, то это хорошая форма, чтобы перехватить возможное слишком большое количество исключений или исключений из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...