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