Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有没有办法测试在SQL中修改表列是否会成功?

有没有办法测试在SQL中修改表列是否会成功?
EN

Stack Overflow用户
提问于 2015-06-03 08:17:34
回答 3查看 925关注 0票数 2

我有一个工具,可以对数据库应用很多更改。许多更改都涉及到修改列类型、大小等。是否有任何(可能是特定于Oracle的)方法预先告知给定的ALTER TABLE更改是否会成功,而不会因为值、函数索引等太长而失败?

对于非DDL修改,这很简单:启动一个事务,执行您的更改并回滚。答案可以从你是否得到一个异常中知道。但是,DDL修改不能成为事务的一部分,因此我不能在这里遵循相同的过程。

EN

回答 3

Stack Overflow用户

发布于 2015-06-03 08:42:13

是否有任何方法(可能是特定于Oracle的)提前告知给定的ALTER TABLE更改是否会成功,而不会因为值太长而失败

我要说的是,当您需要动态创建/修改数据库对象时,这不是一个好的设计。话虽如此,如果DDL失败,ORA-将与其关联。您需要重试所需的更改。修改表不是一件常规的事情,您只需创建一次表,然后只需在有业务需要时更改它,并且需要进行发布,以使应用程序不受影响。所以,我想知道在执行之前知道DDL是否成功会对您有什么帮助?如果你的工具正在做这些修改,那么你的工具应该以编程的方式处理它。在更改列之前,请检查列的类型和大小。

如果您使用外部脚本执行此操作,则需要构建您自己的逻辑。您可以使用像user_tab_columns这样的元数据视图来检查data_type、data_size、data_precision、data_scale等。

在发出SQLALTERSQL语句之前检查VARCHAR2数据类型大小的逻辑的一个小示例(出于演示目的,我用PL/执行此操作,您可以在脚本或工具中应用类似的逻辑):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.

好了,表被成功修改了,让我们检查一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> DESC t;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  VARCHAR2(20)

SQL>

我见过使用groovy脚本的应用程序很少,该脚本执行所有检查,并根据对data_type、data_size、data_precision、data_scale等的检查准备ALTER语句。

对于不同的检查,您需要添加更多的IF-ELSE块。这是增加VARCHAR2数据类型的大小的一个示例。您需要在减少列大小的同时引发exception,这取决于该列是否有任何现有的数据或not...and,等等...

您可以创建单独的函数来检查元数据并返回值。

例如,

数值类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE OR REPLACE FUNCTION is_numeric (i_col_name)...
<using the above logic>
IF v_type       ='NUMBER' THEN
<do something>
RETURN 1;

字符类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE OR REPLACE FUNCTION is_string (i_col_name)...
<using the above logic>
IF v_type       ='VARCHAR2' THEN
<do something>
RETURN 1;
票数 0
EN

Stack Overflow用户

发布于 2015-06-03 08:57:38

我想到了两种方法,但这两种方法都不能给你真正想要的东西。

第一个,我提到这纯粹是为了描述它是你真正想要的,而不是因为它是实用的,是编写一个工具来解析你的SQL脚本更改,并像Oracle一样对对象应用相同的规则,即alter table modify column -并检查列值是否没有超过新的长度。这是一项巨大的任务,当您考虑到更改将是级联/复合时,您也需要迎合这一点。我也不认为它会很快--如果您对一个x百万行的表上的一个非索引列进行了修改,那么该工具将需要扫描可能导致alter失败的数据。无论Oracle使用什么内部魔法来确定这一点,该工具都无法使用。

我使用的方法也不完全是您想要的,就是从生产环境中克隆一个数据库,并减少数据。我主要通过脚本来完成这项工作,这样我就可以进行控制,而不需要依赖特殊的权限/dba访问权限。然后,我针对此测试我的部署脚本,并迭代地执行此操作,直到我有一个干净的构建。我使用我构建的具有重新启动功能的部署框架,因此,如果在121的第63步部署失败,它会给我一个重试/跳过/中止选项,如果我中止它,它可以从失败的步骤重新启动。一旦我对我的开发版本感到满意,我就会在一个与生产同步的数据库上进行测试-这往往会解决数据和/或性能方面的问题。

现在,另一种可能的方法可能是查看闪回。我不确定flashback是否也能处理DDL,但如果它能处理DDL,并且假设在您的dev/test数据库上启用了它(一个很大的假设),那么这可能是一个值得探索的途径。

票数 0
EN

Stack Overflow用户

发布于 2015-06-03 11:59:28

试用我的工具CORT - www.softcraftltd.co.uk/cort

它是免费的,并且是开源的。也许你能找到你需要的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30614491

复制
相关文章
jupyter中运行pyspark
Python for Spark显然比Scala慢。然而,易于学习,并且受益于我最喜爱的库。在我看来,Python是大数据/机器学习领域中原型设计的完美语言。
Tim在路上
2020/08/04
2.4K0
IQKeyboardManager每次运行都会断点到Bug ID:#550
在Xcode9一打断点就会在IQKeyboardManager断点在//Loading IQToolbar, IQTitleBarButtonItem, IQBarButtonItem to fix
傅_hc
2018/07/04
5000
Java中的lambda每次执行都会创建一个新对象吗
之前写过一篇文章 Java中的Lambda是如何实现的,该篇文章中讲到,在lambda表达式执行时,jvm会先为该lambda生成一个java类,然后再创建一个该类对应的对象,最后执行该对象对应的方法,以此来执行我们写的lambda方法体。
KINGYT
2020/01/13
6.1K6
返回执行结果的任务队列:ExecutorCompletionService
有时候我们需要展示一些内容,如果等所有内容都加载完毕再展示这样反而会降低用户体验; 因为如果消耗时间长那么用户需要瞪着空白的页面,反而会失去兴趣; 所以我们希望加载一点资源显示一点,对于那么超过我们容忍范围还未加载完毕的资源我们应该 不再去加载,放弃本次加载或者显示一些默认结果 模拟: final Random r = new Random(); // 创建一个固定大小的线程池 ExecutorService es = Executors.newFixedThreadPool(
用户1215919
2018/02/27
1.3K0
try{}catch{}finally{}运行后的执行结果
1.以下执行结果? (1).代码 public class Demo { public static void main(String[] args) { System.out.println(getValue()); } public static int getValue(){ Scanner sc = new Scanner(System.in); System.out.println("输入一个数"); int
2020/10/23
8060
如何在应用程序中调用CMD并返回运行结果
要求做一个图形界面的应用程序,输入命令行的命令,在后台调用CMD程序执行该命令但不显示DOS命令行窗口,而且能实时显示运行的结果。哪位知道怎么处理?谢啦
用户3519280
2023/07/06
2830
Future,带返回执行结果的线程使用方式
FutureTask是Future的一种实现方式. private final int count; public Counter(int count) { this.count = count; } public void get() throws InterruptedException { // 假设执行一些耗时的操作 Thread.sleep(3000); System.out.println("counter:" + count); } long start = Sys
用户1215919
2018/02/27
1.1K0
在Java中为什么不同的返回类型不算方法重载?
方法重载是指在同一个类中,定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载。 比如以下 4 个 method 方法就可以称之为方法重载,如下代码所示:
磊哥
2022/01/20
3.4K0
在Java中为什么不同的返回类型不算方法重载?
「Python」函数返回值、嵌套调用、执行结果
在程序开发中,有时候会希望一个函数执行结束后,告诉调用者一个结果,一遍调用者针对具体的结果做后续的处理。
python自学网
2022/05/16
2.2K0
「Python」函数返回值、嵌套调用、执行结果
java中==、equals的不同AND在js中==、===的不同
       1.==操作符:首先,对于非基本数据类型的对象比较,相同内存中存储的变量的值是否相等,注意是相同内存地址的才可,并且数值相同(当然地址相同,值也一定相同)才会返回true.     但是,对于基本数据类型的比较(比如:int flot double等),值相同,"=="比较便会返回true.(这是编译的规则,当进行基本数据类型的比较时,会编译生成if_icmpne指令不会进行比较地址。而进行对象比较时,会生成if_icmpne指令,会比较地址。生成的指令都是不同的)。
洋仔聊编程
2019/01/15
4K0
GWAS分析中协变量的区分(性别?PCA?不同品种?)
plink进行GWAS分析时,协变量都要是数字协变量,因子协变量需要转化为dummy变量(哑变量)然后与数字协变量合并,通过--covar进行合并。
邓飞
2022/12/13
2K0
GWAS分析中协变量的区分(性别?PCA?不同品种?)
uniapp如何封装全局方法 并返回执行结果
在uniapp中你可以这样实现,你可以使用Promise对象来实现当全局公共方法执行完后执行调用者的逻辑。以下是一个简单的示例代码:
兔云小新LM
2023/05/25
3.3K0
uniapp如何封装全局方法 并返回执行结果
在python中运行MATLAB代码从而实现批量运算结果
在安装好python和matlab的电脑上,如果需要做一些流程化的内容,matlab这个方面不擅长,此时可以借助python来开发,
用户9925864
2023/09/05
5790
在python中运行MATLAB代码从而实现批量运算结果
C#对称加密(AES加密)每次生成的密文结果不同思路代码分享
思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量。 代码 public static string Encrypt(string plainText, string AESKey) { RijndaelManaged rijndaelCipher = new RijndaelManaged(); byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组
磊哥
2018/04/26
1.6K0
java 查看进程状态_java执行shell命令并返回结果
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/172503.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
8760
java 查看进程状态_java执行shell命令并返回结果
pyspark进行词频统计并返回topN
Part I:词频统计并返回topN 统计的文本数据: what do you do how do you do how do you do how are you from operator import add from pyspark import SparkContext def sort_t(): sc = SparkContext(appName="testWC") data = sc.parallelize(["what do you do", "how do you d
云海谷天
2022/08/09
6070
pyspark进行词频统计并返回topN
【Python】PySpark 数据处理 ② ( 安装 PySpark | PySpark 数据处理步骤 | 构建 PySpark 执行环境入口对象 )
命令 , 安装 PySpark , 安装过程中 , 需要下载 310 M 的安装包 , 耐心等待 ;
韩曙亮
2023/10/11
4930
【Python】PySpark 数据处理 ② ( 安装 PySpark | PySpark 数据处理步骤 | 构建 PySpark 执行环境入口对象 )
【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task
命令行输出结果 : 打开 CSDN 客户端 , 然后任意点击一篇博客进入 , 输入内容如下 ;
韩曙亮
2023/03/29
6K0
【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task
mybatis返回结果处理
当查询的记录条数是多条的时候,必须使用集合接收。如果使用单个实体类接收会出现异常。如果返回的是一条记录可以用集合接收
一个风轻云淡
2023/10/15
2310
mybatis返回结果处理
Python 技术篇-通过管道命令获取cmd执行的结果,获取os.system()、subprocess.Popen()执行命令返回的结果
正常的 os.system() 执行完后只会返回个执行状态值,返回的 0 表示执行成功,1 表示执行失败。 如果想要获取到执行后的结果集,就需要用到管道命令 os.popen(),然后用 read() 方法可以读到返回的结果。subprocess.Popen() 命令也可以获取返回的结果。
小蓝枣
2021/12/01
8.4K1
Python 技术篇-通过管道命令获取cmd执行的结果,获取os.system()、subprocess.Popen()执行命令返回的结果

相似问题

查询每次运行时都会返回不同的结果。

46

每次我运行的时候,Pyspark dataframe都返回不同的结果。

15

每次运行boost::thread都会产生不同的结果

10

每次运行RandomForestRegressor都会得到不同的结果

11

每次运行代码我都会得到不同的结果

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文