2017-01-16 123 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)');