删除dbms_output.put_line中的最后一个字符

时间:2014-04-22 16:54:24

标签: sql oracle

如何从输出中删除最后一个字符

FOR v_rec IN (select COLUMN_NAME,DATA_TYPE from cols where table_name = 'RFI_ATCH_CHKLST_DTL') LOOP
   dbms_output.put_line('p' || v_rec.COLUMN_NAME || ',');
END LOOP;

输出

pRACD_REMARKS,
pRACD_NA_STS,
pRACD_VAL2_STS,
pRACD_VAL_STS,
pBCLI_CODE,
pBAI_CODE,
pRAH_ID,
pRACD_ID,

1 个答案:

答案 0 :(得分:2)

你不能直接 - 你无法控制写入缓冲区的内容。所以你不需要首先写它。一种方法是跟踪输出中的位置,本例中的列列表,如果不在最后一项上,则只添加逗号。使用分析row_number()函数可以用于此:

begin
  for v_rec in (
    select column_name,data_type,
      row_number() over (order by column_id desc) as rn
    from user_tab_cols
    where table_name = 'RFI_ATCH_CHKLST_DTL'
    order by column_id
  ) loop
    dbms_output.put('p' || v_rec.column_name);
    if v_rec.rn != 1 then
      dbms_output.put(',');
    end if;
    dbms_output.new_line;
  end loop;
end;
/

pRACD_REMARKS,
pRACD_NA_STS,
pRACD_VAL2_STS,
pRACD_VAL_STS,
pBCLI_CODE,
pBAI_CODE,
pRAH_ID,
pRACD_ID

rn伪列生成一个数字行计数器,在这种情况下按降序排列。这与列实际出现的顺序相反 - 两个order by子句使用相同的值column_id,其中一个是降序,另一个是升序:

select column_id, column_name,
  row_number() over (order by column_id desc) as rn
from user_tab_cols
where table_name = 'RFI_ATCH_CHKLST_DTL'
order by column_id;

 COLUMN_ID COLUMN_NAME                            RN
---------- ------------------------------ ----------
         1 RACD_REMARKS                            8 
         2 RACD_NA_STS                             7 
         3 RACD_VAL2_STS                           6 
         4 RACD_VAL_STS                            5 
         5 BCLI_CODE                               4 
         6 BAI_CODE                                3 
         7 RAH_ID                                  2 
         8 RACD_ID                                 1 

因此,当行计数器降至1时,您知道自己位于光标的最后一行,您可以使用该知识省略逗号。

您不必使用column_id,但它在这里可能很有用。只要两个子句使用相同的排序逻辑(但反之),您可以按column_name或任何您喜欢的顺序排序。