Sql 如何动态分配变量

Sql 如何动态分配变量,sql,oracle,stored-procedures,plsql,oracle10g,Sql,Oracle,Stored Procedures,Plsql,Oracle10g,我已经编写了一个程序,执行得很慢,但是现在我的老板告诉我应该根据数据类型值进行pading,例如,empno number(4),而padding应该由4完成。但是在上面提到的代码中,我手动编写了值。现在,我的老板告诉我,我应该动态分配值,例如填充 (rec.SAL,9,'0')在这9个值中,应该直接从表中获取。因此,如果老板修改了表,那么上面的代码应该可以工作,我们不必再次编写代码 请帮帮我,我记得那些。不太清楚你(或你的老板/老师)在寻找什么,但我认为她在说: QL> desc

我已经编写了一个程序,执行得很慢,但是现在我的老板告诉我应该根据数据类型值进行pading,例如,empno number(4),而padding应该由4完成。但是在上面提到的代码中,我手动编写了值。现在,我的老板告诉我,我应该动态分配值,例如填充 (rec.SAL,9,'0')在这9个值中,应该直接从表中获取。因此,如果老板修改了表,那么上面的代码应该可以工作,我们不必再次编写代码


请帮帮我,我记得那些。不太清楚你(或你的老板/老师)在寻找什么,但我认为她在说:

    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;
    /
然后可以将其复制/粘贴到代码中,例如,这对于包含100列的表很有帮助。当然,您可以根据您的具体需要进行修改,可能(未经测试):


您的意思是希望始终将值填充到列允许的最大大小?假设它是一个整数,
user\u tab\u列。只要列定义为say
number(9)
,数据精度
将显示相关的
表名
列名
。如果它被定义为
number
,那么它将是空的,并且它将具有默认精度(38)。这就是你想要的吗;或者如何使用该值?这是您对这段代码提出的一系列问题之一。当你的老板给你安排这些练习时,你应该让他们帮你。你能帮我写我写的代码吗?但是如果你有任何想法,请告诉我
select column_name || ','
from all_tab_columns
where table_name = 'SOME_TABLE'
and owner = 'SOME_OWNER'
order by column_id;
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;