0

私はこのようなものをコーディングしようとしています

CREATE OR REPLACE PROCEDURE EMAIL_TABLE (errbuf         OUT      VARCHAR2,
                       retcode        OUT      NUMBER
                      ) is
cursor head is
select column_name
from all_tab_columns a
where table_name= 'EMP'
order by column_id;         

cursor line is
select column_name
from all_tab_columns a
where table_name= 'EMP'
order by column_id; 

count3 number;
count4 number;
lines1 varchar2(3000) := '';  
lines2 varchar2(3000) := '';            
count1 number;
count2 number;
header1 varchar2(3000) := '';
header2 varchar2(3000) := '';
BEGIN
count2 := 0;
select count(1)
into count1
from all_tab_columns a
where table_name= 'EMP';
FOR I IN head LOOP
 count2 := count2+1;
 IF count2 != count1 THEN
 header1 := header1||'"'||i.column_name||'"'||',' ;
 ELSIF count1 = count2 THEN
 header1 := header1||'"'||i.column_name||'"' ;
 END IF;
END LOOP;
header2 := header1;

count4 := 0;
select count(1)
into count3
from all_tab_columns a
where table_name= 'EMP';
FOR I IN line LOOP
count4 := count4+1;
 IF count4 = 1 THEN
  lines1 := lines1||''''||'"'||''''||'||'||i.column_name ;
 ELSIF count4 != count3 THEN
  lines1 := lines1||'||'||''''||'"'||','||'"'||''''||'||'||i.column_name;
 ELSIF count3 = count4 THEN
  lines1 :=        lines1||'||'||''''||'"'||','||'"'||''''||'||'||i.column_name||'||'||''''||'"'||'''' ;
 END IF;
END LOOP;
 lines2 := lines1;

FND_FILE.PUT_LINE(fnd_file.output, header2);
EMAIL_TABLE2(lines2);
END;

/

CREATE OR REPLACE PROCEDURE EMAIL_TABLE2(abc in varchar2) is
 xyz varchar2(1000);
 cursor lines is
 select abc a from EMP;  -- This is not working
BEGIN
  for i in lines loop
    FND_FILE.PUT_LINE(fnd_file.output,i.a);
  end loop;
END; 

/

上記は並行プログラムとして登録され、fnd_file.pu_lineはo || req_numebr||.outに作成されます。このファイルをメールに添付して郵送します。

Outfileは次のようになります。

 "NAME","EMP_ID","DEPT","SAL"

 "JOHN","101","IT","10000"
 "ROB","102","SALES","8000"

最初の行はall_tab_columnsのヘッダーであり、行はパラメーターとして渡されるテーブルの行です。

plzは、上記が機能するかどうか、またはそれ以外の方法でそれを行う方法があるかどうかを知らせてくれます。ありがとう

4

1 に答える 1

0

まず、最初に結果をカウントするよりも、最後のコンマを削除する方が簡単です。

FOR I IN head LOOP
 header1 := header1||'"'||i.column_name||'"'||',';
END LOOP;

header1 := SUBSTR(header1, 1, LENGTH(header1)-1);

次に、列リストを動的に作成して使用する場合は、EMAIL_TABLE2プロシージャで参照カーソル()を使用する必要があります。SYS_REFCURSOR

CREATE OR REPLACE PROCEDURE EMAIL_TABLE2(abc in varchar2) is
 xyz varchar2(1000);
 lines SYS_REFCURSOR;
 l_query varchar2(4000);
BEGIN
  l_query := 'select '||abc||' a from EMP';  
  open lines for l_query;
  loop
      fetch lines INTO xyz;
      exit when lines%NOTFOUND;
      FND_FILE.PUT_LINE(fnd_file.output,xyz);
  end loop;
END; 

参照カーソルの詳細については、http ://www.orafaq.com/node/63を参照してください。

于 2012-06-06T07:17:14.377 に答える