0
    QL> desc newemp
    Name                                      Null?    Type
    ----------------------------------------- -------- ----------------------------
    EMPNO                                     NOT NULL NUMBER(4)
    ENAME                                              VARCHAR2(10)
    JOB                                                VARCHAR2(9)
    MGR                                                NUMBER(4)
    HIREDATE                                           DATE
    SAL                                                NUMBER(7,2)
    COMM                                               NUMBER(7,2)
    DEPTNO                                    NOT NULL NUMBER(2)

declare
    empsfile utl_file.file_type;
    cursor empscur is
    select * from newemp;
    begin
    empsfile := utl_file.fopen('DIPRJDIR','EMPS.TXT','W');
    for rec in empscur
    loop
    --utl_file.put_line(empsfile,rec.EMPNO||rec.ENAME||rec.JOB||rec.MGR||rec.HIREDATE||rec.SAL||rec.COMM||rec.DEPTNO);
    utl_file.put_line(empsfile,lpad(rec.EMPNO,4,'0')||Rpad(rec.ENAME,10,' ')||Rpad(rec.JOB,9,' ')||Rpad(rec.MGR,4,'0')||Rpad(rec.HIREDATE,10,' ')||lpad(rec.SAL,9,'0')||Lpad(rec.COMM,9,'0')||Lpad(rec.DEPTNO,2,'0'));

    end loop;
    UTL_FILE.FCLOSE(empsfile );
    EXCEPTION
     WHEN OTHERS THEN
       DBMS_OUTPUT.PUT_LINE( 'ERROR -->' ||  SQLERRM);
    END;
    /

私は正しく実行するプログラムを作成しましたが、上司は、データ型の値に従ってパディングを行う必要があると言っています。たとえば、4でパディングするよりもempno番号(4)です。しかし、上記のコードでは、手動で値を記述しました。今、私の上司は、たとえばパディング中に値を動的に割り当てる必要があると言っています(rec.SAL、9、 '0')この9つの値はテーブルから直接取得する必要があります。したがって、上司が上記のコードよりもテーブルを変更した場合は、動作し、コードを再度記述する必要はありません。

pleqseは私を助けます

4

1 に答える 1

2

うーん、empno / deptno、覚えてるよ。あなた(またはあなたの上司/教師)が何を探しているのかよくわかりませんが、彼女は次のことについて話していると思います。

select column_name || ','
from all_tab_columns
where table_name = 'SOME_TABLE'
and owner = 'SOME_OWNER'
order by column_id;

次に、コードにコピーして貼り付けることができます。これは、たとえば100列のテーブルに役立ちます。もちろん、特定のニーズに合わせて変更することもできます。

select
  case
    when data_type = 'NUMBER' then
        'lpad(rec.' || column_name || ',4,''0'') ||'
    when data_type = 'VARCHAR2' then
        'rpad(rec.' || column_name || ',10,'' '') ||'
    when data_type = 'DATE' then
        'rpad(to_char(rec.' || column_name || ',''MM/DD/YYYY''),10,'' '') ||'
    else
        'rpad(rec.' || column_name || ',10,'' '') ||'
  end val
from all_tab_columns
where table_name = 'SOME_TABLE'
and owner = 'SOME_OWNER'
order by column_id;
于 2012-05-31T11:14:12.347 に答える