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;
/
我写了一个正常执行的程序,但现在我的老板告诉pading应该根据数据类型值进行,例如empno number(4),而不是填充应该由4.But在上面提到的代码中我手动编写价值。现在我的老板告诉我,我应该在填充时动态分配值,例如 这9个值中的(rec.SAL,9,'0')应该直接从table中获取。所以如果boss改变了表,那么代码也应该工作,我们不必再写代码了。
请帮助我
答案 0 :(得分: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;