"立即执行"子句中的"插入"



你能检查一下并告诉我为什么出错吗?它应该是什么样子?我不知道这里出了什么问题。我需要在一个函数中创建一个表,并在同一个函数中将数据插入该表:

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

相关内容

  • 没有找到相关文章

最新更新