01735. 00000 - "无效的ALTER TABLE选项"

时间:2017-01-16 16:50:43

标签: oracle plsql dynamic-sql

我收到以下错误:

  
      
  1. 00000 - "错过右括号"
  2.   

当我执行我的程序时:

  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;

2 个答案:

答案 0 :(得分:1)

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

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

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

但是你可能想要使它成为通用的,所以你需要编写一些更复杂的处理来测试目标列的数据类型并适当地格式化默认值。

  

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

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

答案 1 :(得分:0)

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

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