如何将 sql 查询的结果保存到变量中,然后在脚本中使用它?
Posted
技术标签:
【中文标题】如何将 sql 查询的结果保存到变量中,然后在脚本中使用它?【英文标题】:How to save result from sql query to a variable and later use it in the script? 【发布时间】:2019-10-26 22:26:58 【问题描述】:我有以下脚本:
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】:也许您可以使用动态 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)
额外阅读,可能会为您澄清一些事情(替换与绑定变量)请参阅here。
【讨论】:
以上是关于如何将 sql 查询的结果保存到变量中,然后在脚本中使用它?的主要内容,如果未能解决你的问题,请参考以下文章