01735. 00000 - “无效的 ALTER TABLE 选项”

Posted

技术标签:

【中文标题】01735. 00000 - “无效的 ALTER TABLE 选项”【英文标题】:01735. 00000 - "invalid ALTER TABLE option" 【发布时间】:2017-01-16 16:50:43 【问题描述】:

我收到以下错误:

    00000 - “缺少右括号”

当我执行我的程序时:

  CREATE OR REPLACE PROCEDURE ALTER_TABLE_COLUMN_NOT_NULL(
    var_tabname   IN VARCHAR2,
    var_clname    IN VARCHAR2,
    var_defvalue  IN VARCHAR2 )
IS
  l_isnull VARCHAR2(1);
BEGIN
  SELECT isnull INTO l_isnull FROM USER_TAB_COLUMNS  
  WHERE TABLE_NAME = var_tabname AND COLUMN_NAME  = var_clname;

  IF l_isnull = 'Y' THEN
    EXECUTE IMMEDIATE 'ALTER TABLE ' || var_tabname   ||
             ' MODIFY COLUMN (' || var_clname  ||
             ' DEFAULT ' || var_defvalue || ' NOT NULL)';
  END IF;
END;

我知道根据错误,缺少右括号。我尝试了很多方法来重写它,但我无法修复它。

我正在按以下方式执行我的程序:

  BEGIN
     ALTER_TABLE_COLUMN_NOT_NULL('FIRSTNAME', 'PRICE', '-');
  END;

【问题讨论】:

var_tabnamevar_clnamevar_defvalue 的值是否包含不应包含的内容? 我编辑了我的问题,也许我以错误的方式调用程序? 当您的代码尝试调用名为MODIFY_COLUMN_NOT_NULL 的过程时,为什么要向我们展示一个名为ALTER_TABLE_COLUMN_NOT_NULL 的过程? @Andreas Sry 这是一个错字,虽然只是在 *** 中,但代码仍然无法正常工作 所以你的字符串连接最终构建了语句ALTER TABLE FIRSTNAME MODIFY COLUMN (PRICE DEFAULT - NOT NULL),你想知道为什么它会因为invalid ALTER TABLE option而失败? DEFAULT - 绝对是错误的。 --- 顺便说一句,你真的有一个名为FIRSTNAME 的表和一个名为PRICE 的列吗? 【参考方案1】:

编写动态 SQL 很难,因为编译错误会变成运行时错误。

在这种情况下,我认为问题在于MODIFY COLUMN 的语法错误。只是MODIFY

您的默认'-' 也可能会遇到一些问题。如果price 是一个将失败的数字,因为- 是一个无效数字。如果price 是一个字符串,您需要使用附加引号来转义传递的值。

但可能您希望使其通用,因此您需要编写一些更复杂的处理来测试目标列的数据类型并适当地格式化默认值。


“你能给我一个提示或任何链接如何确定plsql中传递值的数据类型吗?”

重要的不是传递的值,而是修改列的数据类型。您可以从您已经在查询的 USER_TAB_COLUMNS 视图中获取它。

【讨论】:

你能给我一个提示或任何链接如何确定 plsql 中传递值的数据类型吗?【参考方案2】:

打印您的查询以确保其书写正确

  DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || var_tabname   || ' MODIFY COLUMN (' || var_clname  || ' DEFAULT ' || var_defvalue || ' NOT NULL)');

【讨论】:

以上是关于01735. 00000 - “无效的 ALTER TABLE 选项”的主要内容,如果未能解决你的问题,请参考以下文章

29283. 00000 - “无效的文件操作”

hadoop中的SUCCESS和part-r-00000文件是啥

0xc00000ba失败怎么办?

12703. 00000 - “不支持此字符集转换”

01403. 00000 - “未找到数据”

WebAssembly:(f32.const nan:0x200000)表示0x7fa00000或0x7fe00000