SQL dbms_output.put_line форматирование - PullRequest
0 голосов
/ 21 февраля 2020

Мне бы хотелось, чтобы это было так, когда вы делаете запрос на выборку из таблицы (например, столбцы). Я добавил символы табуляции для имен столбцов, но сделал это между именами и статусами, смещая некоторые статусы спроса, потому что имя слишком длинное. Когда выводится dbms, он делает это:

Product Name            Demand Status
------------            -------------
Pro Ski Pole High Demand
Water Bottle High Demand
Intermediate Ski Pole Low Demand
Tire Pump Low Demand
Bicycle Helmet Low Demand
Beginner's Ski Boot Low Demand
Intermediate Ski Boot High Demand
Beginner's Ski Pole Low Demand
Road Bicycle Low Demand
Bicycle Tires Low Demand
Mountain Bicycle Low Demand
Pro Ski Boot Low Demand

Вот код:

declare
STATUS VARCHAR(25);
cursor product_cursor is
SELECT PRODUCT_NAME, COUNT(*) AS DEMAND_STATUS
FROM PRODUCT FULL JOIN ORDER_DETAILS 
ON PRODUCT.PRODUCT_ID = ORDER_DETAILS.PRODUCT_ID
GROUP BY PRODUCT_NAME;
product_row product_cursor%rowtype;
begin
UPDATE PRODUCT
SET PRICE = PRICE - 0
WHERE
    (SELECT COALESCE(MIN(ORDER_ID), 0) 
    FROM ORDER_DETAILS
     WHERE ORDER_DETAILS.PRODUCT_ID = PRODUCT.PRODUCT_ID) =
    (SELECT COALESCE(MAX(ORDER_ID), 0) 
    FROM ORDER_DETAILS
     WHERE ORDER_DETAILS.PRODUCT_ID = PRODUCT.PRODUCT_ID);
dbms_output.put_line('Product Name'||CHR(9)||CHR(9)||CHR(9)||'Demand Status');
dbms_output.put_line('------------'||CHR(9)||CHR(9)||CHR(9)||'-------------');
open product_cursor;
loop
fetch product_cursor into product_row;
exit when product_cursor%notfound;
if PRODUCT_ROW.DEMAND_STATUS < 2 THEN
STATUS := 'Low Demand';
else
STATUS := 'High Demand';
end if;
dbms_output.put_line(PRODUCT_ROW.PRODUCT_NAME||' '||STATUS);
end loop;
close product_cursor;
end;

1 Ответ

4 голосов
/ 21 февраля 2020

Вам, вероятно, лучше вообще не использовать вкладки, а вместо этого делать:

dbms_output.put_line(rpad('Product Name', 51)||'Demand Status');
dbms_output.put_line(rpad('------------', 51)||'-------------');
...
dbms_output.put_line(rpad(PRODUCT_ROW.PRODUCT_NAME, 51)||STATUS);

, где 51 обозначает максимальное название продукта, которое вы на самом деле ожидаете, которое я угадал на 50 произвольно, плюс один для пробела.

Если вы хотите, чтобы столбец с названием продукта полностью подчеркивался, вы можете сделать:

dbms_output.put_line(rpad('Product Name', 51)||'Demand Status');
dbms_output.put_line(rpad('-', 50, '-')||' '||'-------------');
...
dbms_output.put_line(rpad(PRODUCT_ROW.PRODUCT_NAME, 51)||STATUS);

Использование dbms_output для всего, кроме отладки, может позже вызвать головную боль, так что это может лучше просто вернуть product_cursor клиенту и позволить этому отобразить его; что-то вроде (при условии SQL* Plus или аналогичное):

var rc refcursor

declare
product_row product_cursor%rowtype;
begin
UPDATE PRODUCT
SET PRICE = PRICE - 0
WHERE
    (SELECT COALESCE(MIN(ORDER_ID), 0) 
    FROM ORDER_DETAILS
     WHERE ORDER_DETAILS.PRODUCT_ID = PRODUCT.PRODUCT_ID) =
    (SELECT COALESCE(MAX(ORDER_ID), 0) 
    FROM ORDER_DETAILS
     WHERE ORDER_DETAILS.PRODUCT_ID = PRODUCT.PRODUCT_ID);

  open :rc for (
    SELECT PRODUCT_NAME,
      CASE WHEN COUNT(*) < 2 THEN 'Low Demand' ELSE 'High Demand' END AS STATUS
    FROM PRODUCT FULL JOIN ORDER_DETAILS 
    ON PRODUCT.PRODUCT_ID = ORDER_DETAILS.PRODUCT_ID
    GROUP BY PRODUCT_NAME;
end;
/

print rc

Не очевидно, почему вы здесь используете PL / SQL вообще; Вы можете просто использовать два SQL оператора:

UPDATE PRODUCT
SET PRICE = PRICE - 0
WHERE
    (SELECT COALESCE(MIN(ORDER_ID), 0) 
    FROM ORDER_DETAILS
     WHERE ORDER_DETAILS.PRODUCT_ID = PRODUCT.PRODUCT_ID) =
    (SELECT COALESCE(MAX(ORDER_ID), 0) 
    FROM ORDER_DETAILS
     WHERE ORDER_DETAILS.PRODUCT_ID = PRODUCT.PRODUCT_ID);

SELECT PRODUCT_NAME,
  CASE WHEN COUNT(*) < 2 THEN 'Low Demand' ELSE 'High Demand' END AS STATUS
FROM PRODUCT FULL JOIN ORDER_DETAILS 
ON PRODUCT.PRODUCT_ID = ORDER_DETAILS.PRODUCT_ID
GROUP BY PRODUCT_NAME;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...