2017-01-16 124 views
-1

我收到以下错误:01735. 00000 - “无效的ALTER TABLE选项”

  1. 00000 - "missing right parenthesis"

当我执行我的程序:

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; 
+0

做'var_tabname',值'var_clname'或'var_defvalue'包含任何东西,他们不应该? – JonK

+0

我编辑我的问题,也许我以错误的方式调用过程? – NoName123

+0

当您的代码尝试调用名为MODIFY_COLUMN_NOT_NULL的过程时,为什么要向我们展示名为'ALTER_TABLE_COLUMN_NOT_NULL'的过程? – Andreas

回答

1

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

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

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

但是可能你想使这个通用,所以你需要编写一些更复杂的处理哪些测试目标列的数据类型,并适当地设置默认值。


"Can u give me a hint or any link how one can determine the datatype of a passed value in plsql?"

它不是通过值的问题,它的修改列的数据类型。您可以从您已经查询的USER_TAB_COLUMNS视图中获取该视图。

+0

你可以给我一个提示或任何链接如何可以确定在plsql传递值的数据类型? – NoName123

0

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

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