2017-01-05 75 views
0

當我運行這個Netezza的存儲過程,我得到一個錯誤執行在Netezza的存儲過程即時不插入值表

屬性「SOME_VALUE」未找到

按要求我必須從一個表格(TABLE_A)獲取價值並插入另一個表格(TABLE_B)。

這是程序:

create or replace procedure my_proc() 
returns boolean 
execute as owner 
language NZPLSQL 
as 
BEGIN_PROC 
    declare rec RECORD ; 
BEGIN 
    for rec in SELECT * from TABLE_A loop 
    EXECUTE IMMEDIATE 
    'INSERT INTO TABLE_B(COLUMN_B) 
    values('||  rec.COLUMN_A_OFTABLE_A || ')'; 
END LOOP; 
END; 
END_PROC; 

execute my_proc() 

這裏下面,我能插入一個字符串。但我需要根據其他表插入不同的值,如上所述。

EXECUTE IMMEDIATE 'INSERT INTO TABLE_B(COLUMN_B) values(''Y'');'; 

回答

0

當建立一個字符串,你要運行EXECUTE IMMEDIATE對,你一定要小心,一切引用正確。在你的情況下,它認爲它需要將SOME_VALUE作爲屬性/列進行處理,並且它不能使用該名稱的任何列。

裹在的quote_nullable()的列引用,它會解釋你列和內容正確報價,逃避它。

create or replace procedure my_proc() 
returns boolean 
execute as owner 
language NZPLSQL 
as 
BEGIN_PROC 
    declare rec RECORD ; 
BEGIN 
    for rec in SELECT * from TABLE_A loop 
    EXECUTE IMMEDIATE 
    'INSERT INTO TABLE_B(COLUMN_B) 
    values('|| quote_literal(rec.COLUMN_A_OFTABLE_A) || ')'; 
END LOOP; 
END; 
END_PROC; 

你可以在the documentation here找到更多的信息。

注:我假設你已經在這個存儲過程來實現一些更復雜的邏輯,因爲按行遍歷行會非常非常慢於insert..select。通常是一個數量級。

+0

感謝您的回覆。是的,我必須比較TABLE_A的兩列,並基於結果我必須將數據插入TABLE_B。 – VivekT

+0

該解決方案適合您嗎?如果是這樣,請將其標記爲答案。如果沒有,讓我們知道出了什麼問題。 – ScottMcG