如何从输出中删除最后一个字符
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,
答案 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
或任何您喜欢的顺序排序。