Oracle PL/SQL Анализ вывода запросов, запись в файл

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

Решение

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

В основном для каждого оператора запроса мне понадобится скрипт для интерпретации результатов и вывода в файл значений 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 просто для получения некоторой базовой информации, такой как выбранные строки

Другие вопросы по тегам