如何将sql查询的结果保存到变量中,然后在脚本中使用它?

时间:2019-10-26 22:26:58

标签: sql oracle oracle11g oracle10g oracle-sqldeveloper

我有以下脚本:

    cl scr;
    variable l number;
    begin
      select max(length(name)) into :l from goodcustomer;
    end;
    /
    --print :l;
    alter table goodcustomer modify name varchar2(:l);

我试图将名称的长度属性修改为表中当前存在的名称的最大长度(为17)。上面的代码在sql Developer中给了我以下错误:

    Error report -
    SQL Error: ORA-00910: specified length too long for its datatype
    00910. 00000 -  "specified length too long for its datatype"
    *Cause:    for datatypes CHAR and RAW, the length specified was > 2000;
               otherwise, the length specified was > 4000.
    *Action:   use a shorter length or switch to a datatype permitting a
               longer length such as a VARCHAR2, LONG CHAR, or LONG RAW 

我在这里做错了什么? l是不是可以用来指定varchar2大小的数字吗? 任何其他实现相同目的的方式也会受到赞赏吗?

1 个答案:

答案 0 :(得分:1)

也许您可以使用动态SQL 。示例(Oracle 18c):

SQL> create table goodcustomer ( name varchar2( 4000 ) ) ;

Table created.

SQL> 
SQL> describe goodcustomer 
Name   Null?   Type             
NAME           VARCHAR2(4000)

插入一些名称

SQL> begin
  2    insert into goodcustomer values( 'shortestname' ) ;
  3    insert into goodcustomer values( 'l o n g e s tname' ) ;
  4  end ;
  5  /

PL/SQL procedure successfully completed.

SQL> select max( length( name ) ) from goodcustomer ;
  MAX(LENGTH(NAME)) 
                 17 

ALTER TABLE ...修改

SQL> declare
  2    l number := 0 ;
  3    sqlstr varchar2( 4000 ) := '' ;
  4  begin
  5    select max( length( name ) ) into l from goodcustomer ;
  6    sqlstr := 'alter table goodcustomer modify name varchar2( ' 
  7           || to_char( l ) 
  8           || ')' ;
  9    execute immediate sqlstr ;
 10  end ;
 11  /

PL/SQL procedure successfully completed.

-- The NAME column now: VARCHAR2( 17 )
SQL> describe goodcustomer
Name   Null?   Type           
NAME           VARCHAR2(17) 

其他阅读材料可能会为您弄清楚(替代变量还是绑定变量),请参见here