我尝试使用DBMS_SQL.PARSE解析此插入语句,但是出现“缺少逗号”错误。请帮助:(
'insert into ' || '"' || v_materie || '"' || ' (
nume,prenume,nr_matricol,valoare,data_notare) values(' ||
v_nume || ','||
v_prenume || ','||
v_nr_matricol || ','||
v_nota || ','||
v_dataNotare || ')'
答案 0 :(得分:1)
实际上生成插入字符串是非常糟糕的主意。 无论如何尝试。
'insert into ' || '"' || v_materie || '"' || ' (
nume,prenume,nr_matricol,valoare,data_notare) values(''' ||
v_nume || ''','''||
v_prenume || ''','''||
v_nr_matricol || ''','''||
v_nota || ''','''||
v_dataNotare || ''')'
您应该将值放在'字符中,但是因为生成字符串需要转义符号',所以您将得到'''
答案 1 :(得分:0)
正如@Giga指出的那样,由于字符串连接是构建sql语句,这是一个非常不好的主意。受到sql注入不仅危险,而且很丑陋,完全没有必要。您已经在使用dbms_sql来验证查询了-顺便说一句好主意-因此,为什么不考虑它来构建查询。因此,一路使用dbms_sql进行查询:
4967 or 5032 #it should be 4999 when i do print(len(gender_aux))
['female', 'male', 'male', ' ', 'male', 'male', 'male', 'male', 'male', ' ', 'male'...]
或者只是dbms_sql来验证查询,然后恢复以立即执行:
-- Setup
create table "Mat Val"
( nume integer
, prenume integer
, nr_matricol integer
, valoare integer
, data_notare integer
);
declare
k_materie_name varchar2(8) := 'Mat Val';
k_sql_base varchar2(1000) :=
'insert into "v_materie" (nume,prenume,nr_matricol,valoare,data_notare) values(:1,:2,:3,:4,:5)';
l_sql_stmt varchar2(1000);
l_dbms_cursor_ref integer;
l_rows_processed integer;
v_nume integer := 1;
v_prenume integer := 2;
v_nr_matricol integer := 3;
v_valoare integer := 4;
v_data_notare integer := 5;
begin
l_sql_stmt := replace(k_sql_base,'v_materie',k_materie_name);
dbms_output.put_line('Setting up dbms_sql processing for statement:' || chr(10) || l_sql_stmt);
l_dbms_cursor_ref:= dbms_sql.open_cursor;
dbms_sql.parse(l_dbms_cursor_ref,l_sql_stmt,DBMS_SQL.native);
-- set up bind variables with local variables
dbms_sql.bind_variable(l_dbms_cursor_ref, ':1', v_nume);
dbms_sql.bind_variable(l_dbms_cursor_ref, ':2', v_prenume);
dbms_sql.bind_variable(l_dbms_cursor_ref, ':3', v_nr_matricol);
dbms_sql.bind_variable(l_dbms_cursor_ref, ':4', v_valoare);
dbms_sql.bind_variable(l_dbms_cursor_ref, ':5', v_data_notare);
-- execute dynamic sql
l_rows_processed := dbms_sql.execute(l_dbms_cursor_ref);
dbms_output.put_line('Rows inserted to "' || k_materie_name || '" ==> ' || to_char(l_rows_processed));
dbms_sql.close_cursor(l_dbms_cursor_ref);
end ;
这两种方法 永远不要使用字符串连接构建SQL 。规划和使用绑定变量。它更安全,因为它消除了SQL注入,但是您的代码更简洁,实际上更容易编写(我总是需要先编写一个独立的语句来对其进行测试,然后再转换为绑定变量相对简单)。最终,如果同一条语句仅在值差异的情况下运行了多次,则它会更快,因为它避免了硬解析。