2013-12-09 67 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; 

然后你会知道动态命令有什么问题。