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 服务器中有以下脚本来更改列以允许 nullnot 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 中的等效项 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

sql server的sql语句怎么判断一个字段是不是为空

系统函数

按日期透视 DateTime 字段

MySQL联表查询

PL/SQL 过程动态传递值

ORA-00907: 过程返回表缺少右括号