2014-09-25 38 views
0

我正在編寫一個存儲過程來更新表中的數據,我將傳遞一個字符串與新數據(col1='new values', col2='new 2 values')。但是當我編譯我的存儲過程時,出現錯誤: - 「缺少等號」。SQL過程中的更新語句錯誤

即使我嘗試以不同的方式(在proc中註釋代碼),但這也是一個錯誤。

CREATE OR REPLACE PROCEDURE "MY_UPDATE_PROC"(update_values IN VCHAR2,myid IN INT) 

sqlStmt VARCHAR2(1024); 

BEGIN 

UPDATE MY_TEST_TABLE SET update_values WHERE (TEST_Id = myid); 

--sqlStmt := 'UPDATE MY_TEST_TABLE SET ' || update_values || ' WHERE TEST_Id = ' ||myid ; 

-- EXECUTE sqlStmt; 

END; 
+0

'CHARVAR2'?它是什麼? – zaratustra 2014-09-25 08:48:00

回答

0

試試這個(未經測試):

CREATE OR REPLACE PROCEDURE "MY_UPDATE_PROC"(update_values IN VARCHAR2, myid IN NUMBER) AS 
    sqlStmt VARCHAR2(1024); 
BEGIN 
    sqlStmt := 'UPDATE MY_TEST_TABLE SET ' || update_values || ' WHERE TEST_Id = ' || myid; 
    EXECUTE IMMEDIATE sqlStmt; 
END; 
/

你的第一個參數的數據類型應該是VARCHAR2(也許只是一個在您的文章錯字)

+0

對不起,這是一個錯字。 – CrazyC 2014-09-25 07:05:01

0

簡單的更新語句的語法在甲骨文:

Update <table_name> 
    set <column_name> = some_value 
where <conditions..> 

您更新的聲明丟失= some_value你需要的部分d提供。

CREATE OR REPLACE PROCEDURE "MY_UPDATE_PROC"(P_update_values IN CHARVAR2, p_myid IN INT) 

BEGIN 

    UPDATE MY_TEST_TABLE 
    SET col1 = p_update_values 
    WHERE TEST_Id = p_myid; 

END; 
/

使用動態SQL,但在這種情況下,不要求:

CREATE OR REPLACE PROCEDURE "MY_UPDATE_PROC"(p_update_values IN VARCHAR2, p_myid IN NUMBER) AS 
    sqlStmt VARCHAR2(1024); 
BEGIN 
    sqlStmt := 'UPDATE MY_TEST_TABLE SET col1 = :a WHERE TEST_Id = :b'; 
    EXECUTE IMMEDIATE sqlStmt USING p_update_values, p_myid; 
END; 
/

事情要注意的是:

1)總是使用比對列名其他有意義的和不同的名字參數。

2)在上面的例子中,總是使用綁定變量:a和:b,以避免SQL注入並提高整體性能,如果您打算多次調用此過程。

+0

我的update_values將包含col1 ='Some Value',col2 ='Some Value'。有了這個,我不會爲場的數量而煩惱。來電者必須照顧它。 – CrazyC 2014-09-25 06:56:14

+0

當我使用建議的SQL(關鍵字使用),然後得到錯誤: 期待以下之一時遇到符號「=」:=,。,@ ... – CrazyC 2014-09-25 07:04:23

+0

@CrazyC:這是因爲你的參數「update_values」isn'單個值,它是一個完整的SET子句。在這種情況下,將它分配給綁定變量將不起作用。 – DirkNM 2014-09-25 07:08:29