1

Can you check this and tell me why I've got an error, please? How should it look? I have no idea what's wrong here. I need to create a table in a function, and in the same function insert data into this table:

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;

My result is: ERROR-ORA-00926: missing VALUES keyword. Process exited.

Where is the mistake?

4

2 回答 2

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;

然后你就会知道动态命令出了什么问题。

于 2013-12-09T19:09:52.743 回答
0

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

于 2013-12-10T19:04:51.003 回答