你能检查一下并告诉我为什么出错吗?它应该是什么样子?我不知道这里出了什么问题。我需要在一个函数中创建一个表,并在同一个函数中将数据插入该表:
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.
错误在哪里?
在创建动态插入命令时,必须按原样创建。因此,缺少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;
然后您就会知道动态命令有什么问题。
execute immediate 'insert into TABLE'||a||' (COLUMN_NAME) values (:val)' using b;
这样,您就不必麻烦对值进行转义(SQL注入破解)并正确地转换类型。
http://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems017.htm