是否有任何(可能是特定于 Oracle 的)方法来提前判断给定的 ALTER TABLE 更改是否会成功,并且不会因为值太长而失败
当您需要即时创建/修改数据库对象时,我会说这不是一个好的设计。话虽如此,如果 DDL 失败,则会与 ORA-error 相关联。您需要重试所需的更改。修改一个表不是一件普通的事情,你创建一个表,然后你只会在有业务需要并且需要发布版本时才修改它,以便应用程序不受影响。所以,我想知道如何在执行之前知道 DDL 是否成功?如果您的工具正在进行这些修改,那么您的工具应该以编程方式处理它。在更改之前检查列的类型和大小。
如果您使用外部 脚本 来执行此操作,那么您需要构建自己的逻辑。您可以使用 user_tab_columns 等元数据视图来检查 data_type、data_size、data_precision、data_scale 等。
在发出 ALTER 语句之前检查 VARCHAR2 数据类型大小的逻辑小示例(出于演示目的,我在 PL/ SQL,您可以在脚本或工具中应用类似的逻辑):
SQL> CREATE TABLE t (A VARCHAR2(10));
Table created.
SQL> DESC t;
Name Null? Type
----------------------------------------- -------- ----------------------------
A VARCHAR2(10)
SQL> SET serveroutput ON
SQL> DECLARE
2 v_type VARCHAR2(20);
3 v_size NUMBER;
4 new_size NUMBER;
5 BEGIN
6 new_size:= 20;
7 SELECT data_type,
8 data_length
9 INTO v_type,
10 v_size
11 FROM user_tab_columns
12 WHERE table_name='T';
13 IF v_type ='VARCHAR2' THEN
14 IF new_size > v_size THEN
15 EXECUTE IMMEDIATE 'ALTER TABLE T MODIFY A '||v_type||'('||new_size||')';
16 DBMS_OUTPUT.PUT_LINE('Table altered successfully');
17 ELSE
18 DBMS_OUTPUT.PUT_LINE('New size should be greater than existing data size');
19 END IF;
20 END IF;
21 END;
22 /
Table altered successfully
PL/SQL procedure successfully completed.
好的,所以表已经成功修改,让我们检查一下:
SQL> DESC t;
Name Null? Type
----------------------------------------- -------- ----------------------------
A VARCHAR2(20)
SQL>
我见过很少有应用程序使用 groovy 脚本,它会根据对 data_type、data_size、data_precision、data_scale 等的检查进行所有检查并准备 ALTER 语句。
对于不同的检查,您需要添加更多 IF-ELSE 块。这是增加VARCHAR2 数据类型的大小 的一个示例。您需要在减小列大小的同时引发异常,具体取决于该列是否有任何现有数据...等等.. .
您可以创建单独的函数来检查元数据并返回一个值。
例如,
数值类型:
CREATE OR REPLACE FUNCTION is_numeric (i_col_name)...
<using the above logic>
IF v_type ='NUMBER' THEN
<do something>
RETURN 1;
字符类型:
CREATE OR REPLACE FUNCTION is_string (i_col_name)...
<using the above logic>
IF v_type ='VARCHAR2' THEN
<do something>
RETURN 1;