2015-01-15 3 views
1

Я запускаю некоторую процедуру Oracle с помощью курсора и получаю вывод в файле журнала через dbms_output.put_line.Перерыв строки в dbms_output.put_line

Что я хотел бы сделать, это разбить строку на имя_сервера, возможно ли это с помощью dbms_output.put_line?

В настоящее время он перечисляет все вместе, что не выглядит аккуратным.

Также имеется идентификатор сервера как 1234.9 или 1234.88, можно ли установить numformat как 999.99? как-то я не могу сделать col server_id for 999.99 в рамках процедуры.

create procedure proc (vServer IN VARCHAR2, vServerID IN NUMBER) 

IS 
CURSOR curTable 
IS 

SELECT server_name, server_id 
FROM tab1 
WHERE server_name = vServer 
and server_id = vServerID; 

BEGIN 

FOR rec1 IN curTable 
LOOP 

dbms_output.put_line(rec1.server_name || ' '|| rec1.server_id); 

END LOOP; 

END proc; 

Sample Требуемая мощность:

S1 1234 
S1 1234 
S1 1234 

S2 5678 
S2 5678 
+0

Есть ли причина, что вы делаете это в PL/SQL, а не как простой SQL commad - с SQL * Plus команд форматирования, возможно, ? –

+0

Я согласен, а также предложил простой SQL, но для многопользовательского доступа он должен быть в процедуре. – homer

+0

Не уверен, что я понимаю, что вы имеете в виду ... Но также вы передаете одно имя и идентификатор сервера, так как вы будете получать разные серверы на выходе? –

ответ

2

Выполнение перерыва на server_id only имеет смысл, если вы укажете этот столбец как порядок сортировки. Затем вам нужно самостоятельно закодировать логику разломов. Кроме того, вы можете использовать TO_CHAR для форматирования номера по своему усмотрению.

Вот код, который должен делать то, что вы хотите:

create procedure proc (vServer IN VARCHAR2, vServerID IN NUMBER) 

IS 
CURSOR curTable 
IS 

SELECT server_name, server_id 
FROM tab1 
WHERE server_name = vServer 
and server_id = vServerID 
ORDER BY server_id ; 

l_last_server_id tab1.server_id%TYPE := 0; 

BEGIN 

FOR rec1 IN curTable 
LOOP 

-- Test for break: 
IF last_server_id != rec1.server_id THEN 
    -- Break detected: 
    dbms_output.put_line('---'); -- DBMS_OUTPUT will not print a blank line. 
END IF ; 

dbms_output.put_line(rec1.server_name || ' '|| TO_CHAR(rec1.server_id,'999.99'); 

l_last_server_id := rec1.server_id ; 

END LOOP; 

END proc; 
+0

K, не знаю, почему это не работает для меня. Я предоставляю schemaname.tab1.server, а также пробовал без schemaname, но до сих пор не повезло. Пользователь, который запускает запрос, может получить доступ к таблице tab1, принадлежащей другому пользователю. 'l_last_server_id schemaname.tabl1.sever_id% TYPE: = 0;' также возможно ли использовать lpad с TO_CHAR? 'to_char (lpad (rec1.server_id, '999.99', 7))' – homer

+0

Хорошо, теперь он работает, я пытался напечатать пустую строку, чтобы она не сработала изначально. Как мы можем использовать lpad и to_char вместе? – homer

+0

«DBMS_OUTPUT не печатает пустую строку» неверно; клиент может его подавить.В SQL * Plus, если вы выполняете 'set serveroutput в формате wrapped', а не по умолчанию' word_wrapped', вы увидите пустую строку, а также пробелы. [Читать дальше] (http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve040.htm#sthref2164). Но вы также можете использовать 'dbms_output.new_line'. –

1

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

... 
    last_server_name tab1.server_name%type; 

BEGIN 

    FOR rec1 IN curTable 
    LOOP 
    if last_server_name is not null 
     and rec1.server_name != last_server_name then 
     dbms_output.new_line; 
    end_if; 

    dbms_output.put_line(rec1.server_name 
     || ' '|| to_char(rec1.server_id, '99990.00')); 

    last_server_name := rec1.server_name; 
    END LOOP; 

END proc; 

вы можете использовать to_char() внутри dbms_output вызова с любой моделью формат подходит - вы делаете в implit CONVER в любом случае; или в курсоре, если вы не указали идентификатор в виде числа в цикле.

Помните, что вы увидите только результат, если ваш клиент настроен для него - например, set serveroutput on. Вы не можете в целом полагаться на это, поэтому неплохо использовать dbms_output в реальном коде для чего угодно, кроме отладки.

И, как указал Скотт К., вам нужно заказать результаты своего курсора для этого, поэтому добавьте order by server_name в запрос курсора. Кроме того, вы все равно ищете одно имя и идентификатор сервера, поскольку вы фильтруете по vServer и vServerID, поэтому ваш исходный запрос не может производить ваш исходный результат в любом случае ...

+0

Да, вероятно, примерный запрос не был лучшим примером при фильтрации с помощью vServerName, я принимаю другое значение, чтобы перечислить все серверы, но для того, чтобы сохранить его простым, я использовал имя ServerName, но забыл, что принимаю это с параметром IN. Я проверю это с вашим предложением. – homer

Смежные вопросы