Как сохранить результат из SQL-запроса в переменную, а затем использовать его в скрипте? - PullRequest
0 голосов
/ 27 октября 2019

У меня есть следующий сценарий:

    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 

Что я здесь не так делаю? Разве это не число, которое можно использовать для определения размера varchar2? Любой другой способ добиться того же будет также оценен?

1 Ответ

1 голос
/ 27 октября 2019

Может быть, вы можете использовать динамический 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 ... MODIFY

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) 

Дополнительночтение, которое может прояснить для вас вещи (подстановка вместо переменных связывания), см. здесь .

...