2013-12-09 71 views
1

您可以檢查並告訴我爲什麼出現錯誤嗎?它應該怎麼看?我不知道這裏有什麼問題。我需要在一個函數來創建一個表,並在同一個函數將數據插入到這個表:'立即執行'子句中的'插入'

create or replace 
function new_tab (pyt IN varchar2) return number 
IS 
a number; 
b varchar2(20); 
begin 
a:= ROUND(dbms_random.value(1, 3)); 
b:='example'; 

-- This works perfect 
execute immediate 'CREATE TABLE create_tmp_table'|| a ||'(i VARCHAR2(50))'; 

-- Here`s the problem 
execute immediate 'insert into create_tmp_table'||a|| 'values ('|| b ||')'; 

exception 
when others then 
dbms_output.put_line('ERROR-'||SQLERRM); 

return 0; 
end; 

我的結果是: ERROR-ORA-00926: missing VALUES keyword. Process exited.

哪裏錯了嗎?

+0

INSERT語句已經進入無關鍵字值或選擇。 VALUES子句或SELECT子查詢都必須遵循INSERT INTO子句。 – Aditya

+0

我在|| a ||後面看到字值。 –

回答

1

當您創建一個動態插入命令時,您必須按原樣創建它。所以,你缺少的是VARCHAR值單引號:

execute immediate 
    'insert into create_tmp_table'||a|| ' values ('''|| b ||''');'; 
                ^here  ^and here 

和良好的建議對這種類型的錯誤是做一些調試。在你的情況下,你可以創建一個varchar2變量並把你的插入它,然後你使用dbms_output.put_line這個變量。然後你將得到你的sql命令,你可以直接在你的數據庫上進行測試。例如:

declare 
    sqlCommand varchar2(1000); 
    --define a and b 
begin 
    --put some values in a and b 
    sqlCommand := 'insert into create_tmp_table'||a|| ' values ('''|| b ||''');'; 
    dbms_output.put_line(sqlCommand); 
end; 

然後你會知道動態命令有什麼問題。