繁体   English   中英

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

[英]How to save result from sql query to a variable and later use it in the script?

我有以下脚本:

    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 开发人员中给了我以下错误:

    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 

我在这里做错了什么? 不是可以用于给出varchar2大小的数字吗? 任何其他实现相同目标的方法也将受到赞赏?

也许您可以使用动态 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 

改变表...修改

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) 

附加阅读,可能会为您澄清一些事情(替换与绑定变量),请参见此处

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM