2013-12-09 16 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

Вкладыш заявление был введен без ключевого слова VALUES или SELECT. Либо предложение 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; 

Тогда вы узнаете, что не так с динамической командой.