0

どのファイルが存在するかどうかを確認し、列の番号を確認するプログラムを返しました

create or replace procedure chkcsvfile
(P_UTLDIR VARCHAR2,
P_FILENAME  VARCHAR2,
P_tabnam   VARCHAR2
)
is
  P_fieldel varchar2(2):= ',';
    V1 VARCHAR2(32767) ;
   P_errlen number :=0;
   lv_a number;
   lv_b number;
   lv_c number;
   lv_d number;
   lv_check_file_exist boolean; 
   v_file utl_file.file_type;  

 cursor c1  is
  select count(*) from user_tables where TABLE_NAME =P_tabnam;

  cursor c2  is
  select count(*) from user_tab_columns where TABLE_NAME =P_tabnam;

begin

open c1;
fetch c1 into lv_c;
if lv_c = 0 then
dbms_output.put_line('table name is invalid : ' || P_tabnam);
end if;

--'test wheather file is  available or not'
dbms_output.put_line ('test wheather file is  available or not');
utl_file.fgetattr (P_UTLDIR,P_FILENAME, lv_check_file_exist, lv_a, lv_b );
if lv_check_file_exist then

dbms_output.put_line('file  ' ||P_FILENAME  ||'  exists');

v_file := utl_file.fopen(P_UTLDIR,P_FILENAME, 'R');

UTL_FILE.get_line (v_file ,V1,32767);

DBMS_OUTPUT.put_line ('V1 :' || V1);

if (REGEXP_like (V1, ',',1))
then
P_errlen  := P_errlen +1 ;
dbms_output.put_line ('errrooooooooooooooooooooooooooooooooooorr'); 
dbms_output.put_line (P_errlen );

end if;

end if;
if not lv_check_file_exist then
dbms_output.put_line('file ' ||  P_FILENAME  ||'  does not exist');
end if;
if lv_check_file_exist is null then
dbms_output.put_line('file check null');
end if;
if lv_check_file_exist is not null then
dbms_output.put_line('file check not null');
end if;
dbms_output.put_line('lv_a-->'||lv_a);
dbms_output.put_line('lv_b-->'||lv_b);

open c2;
fetch c2 into lv_d;
dbms_output.put_line ('No of columns in a table : ' || lv_d );

end;
/

今私の問題は、文字列内の「、」に一致する必要があり、その数が必要なことです。私はプログラムを書きましたが、特定の数がわかりません。

文字列のデータは以下の形式で与えられます

7839,KING      ,PRESIDENT,0000,17-nov-1981, 005000.00 ,000000.00,10,

助けてください よろしくお願いします

4

1 に答える 1

2

11g を使用しているため、regexp_count関数を使用できます。

select regexp_count('7839,KING      ,PRESIDENT,0000,17-nov-1981, 005000.00 ,000000.00,10,',',')
from dual
于 2012-06-06T05:57:00.100 に答える