IF COL_LENGTH('EMP_NUM','EMPLOYEE') 不为 NULL - ORACLE 中的等效项 [关闭]
Posted
技术标签:
【中文标题】IF COL_LENGTH(\'EMP_NUM\',\'EMPLOYEE\') 不为 NULL - ORACLE 中的等效项 [关闭]【英文标题】:IF COL_LENGTH('EMP_NUM','EMPLOYEE') IS NOT NULL - EQUIVALENT IN ORACLE [closed]IF COL_LENGTH('EMP_NUM','EMPLOYEE') 不为 NULL - ORACLE 中的等效项 [关闭] 【发布时间】:2021-07-08 15:39:10 【问题描述】:我在 SQL 服务器中有以下脚本来更改列以允许 null 到 not null。
Oracle 11g 或更高版本中的等效语法是什么?
IF COL_LENGTH('EMP_NUM','EMPLOYEE') IS NOT NULL
ALTER TABLE EMPLOYEEALTER COLUMN EMP_NUMnumeric(10,0) NOT NULL;
【问题讨论】:
“我已经研究过,但没有找到任何东西” 我搜索的 first result 看起来很有希望。那篇文章怎么看不懂? (注意,我没用过Oracle,也不知道T-SQL和PL/SQL在语法上的区别)。 @Larnu 如果我在不检查现有列的情况下运行 alter 命令。我收到如下错误报告 - ORA-01442: column to be modified to NOT NULL is already NOT NULL "要修改为 NOT NULL 的列已经不是 NULL"... 那你不明白怎么办;对我来说看起来很清楚。 @Larnu 你如何检查和跳过脚本?那是我的问题。我不想更改已经不是空的列,我想更改允许空的列。您如何为此编写 oracle 语句? 【参考方案1】:在 Oracle 中,您必须使用动态 SQL,因为您无法在 PL/SQL 中按原样执行 DDL。为什么选择 PL/SQL?因为IF-THEN-ELSE
是 PL/SQL,而不是 SQL。
假设这是您的 PL/SQL 过程的一部分,那么您会
if col_length('EMP_NUM', 'EMPLOYEE') is not null then
execute immediate 'alter table employee modify emp_num not null';
end if;
这是ALTER
部分。但是,由于 Oracle 没有 COL_LENGTH 功能(据我所知,也没有类似的功能),您必须自己做。这是一个例子:
列允许空值的表:
SQL> create table employee (emp_num number);
Table created.
检查Null?
列 - 为空,所以是的 - 它允许空值。
SQL> desc employee;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_NUM NUMBER
查询数据字典以查找列的长度:
SQL> select data_length from user_tab_columns
2 where table_name = 'EMPLOYEE'
3 and column_name = 'EMP_NUM';
DATA_LENGTH
-----------
22
最后,你未来的 PL/SQL 过程:
SQL> declare
2 l_len number;
3 begin
4 select data_length
5 into l_len
6 from user_tab_columns
7 where table_name = 'EMPLOYEE'
8 and column_name = 'EMP_NUM';
9
10 if l_len is not null then
11 execute immediate 'alter table employee modify emp_num not null';
12 end if;
13 end;
14 /
PL/SQL procedure successfully completed.
SQL> desc employee;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_NUM NOT NULL NUMBER
SQL>
如您所见,Null?
列现在包含NOT NULL
,这意味着ALTER TABLE
已成功执行。
此外,您甚至可以创建自己的函数来查询列的数据长度,然后在您的过程中使用它:
SQL> create or replace function col_length(par_table in varchar2, par_column in varchar2)
2 return number
3 is
4 retval user_tab_columns.data_length%type;
5 begin
6 select data_length
7 into retval
8 from user_tab_columns
9 where table_name = par_table
10 and column_name = par_column;
11 return retval;
12 end;
13 /
Function created.
SQL> select col_length('EMPLOYEE', 'EMP_NUM') from dual;
COL_LENGTH('EMPLOYEE','EMP_NUM')
--------------------------------
22
SQL>
最后:
SQL> drop table employee;
Table dropped.
SQL> create table employee (emp_num number);
Table created.
SQL> begin
2 if col_length('EMPLOYEE', 'EMP_NUM') is not null then
3 execute immediate 'alter table employee modify emp_num not null';
4 end if;
5 end;
6 /
PL/SQL procedure successfully completed.
SQL> desc employee;
Name Null? Type
----------------------------------------- -------- ----------------------------
EMP_NUM NOT NULL NUMBER
SQL>
【讨论】:
以上是关于IF COL_LENGTH('EMP_NUM','EMPLOYEE') 不为 NULL - ORACLE 中的等效项 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章