PLSQL缺少逗号

时间:2020-05-01 17:53:53

标签: sql oracle plsql

我尝试使用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 || ')'

2 个答案:

答案 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注入,但是您的代码更简洁,实际上更容易编写(我总是需要先编写一个独立的语句来对其进行测试,然后再转换为绑定变量相对简单)。最终,如果同一条语句仅在值差异的情况下运行了多次,则它会更快,因为它避免了硬解析。