Oracle PL / SQL错误ORA-06512和ORA-00911给我带来了问题

时间:2013-05-24 22:23:26

标签: sql plsql oracle11g oracle-sqldeveloper

我有以下PL / SQL程序:

create or replace 
PROCEDURE DboOpdracht2(
  table_name_in IN VARCHAR2,
  amount_rows_in IN NUMBER)
IS
  insert_query VARCHAR2 (2000);
  --cursors voor tabel layout
  CURSOR table_cur IS
  SELECT * FROM User_tab_cols
  WHERE table_name = UPPER(table_name_in);

BEGIN
  FOR COUNT IN 1 .. amount_rows_in
  LOOP
  BEGIN
    insert_query := 'INSERT INTO ';
    insert_query := insert_query || UPPER(table_name_in);
    insert_query := insert_query || ' VALUES(';
    --loop voor elke cursor om te vullen
    FOR col IN table_cur
    LOOP
      --dbms_output.put_line(col.data_type);
      CASE col.data_type
      WHEN 'NUMBER' THEN
      insert_query := insert_query || ' dbms_random.value(0, (power(10,'||col.data_precision||')-1)/power(10,'||col.data_scale||'))';
      WHEN 'VARCHAR2' THEN
      insert_query := insert_query || ' dbms_random.string(''A'',' || col.data_length || ')';
      WHEN 'TIMESTAMP(6)' THEN
      insert_query := insert_query || ' ' || current_timestamp;
      ELSE
      insert_query := insert_query || ' NULL ';
      END CASE;
      --add comma
      insert_query := insert_query || ' ,';
    END LOOP;
    insert_query := SUBSTR(insert_query,1,LENGTH(insert_query)-1);
    insert_query := insert_query || ' );';
    dbms_output.put_line(insert_query);
    EXECUTE IMMEDIATE insert_query;
    insert_query := '';
    --EXCEPTION
    --WHEN OTHERS THEN
      --dbms_output.put_line('Exception! Something went wrong.');
      --insert_query:='';
    END;
  END LOOP;
  COMMIT;   
END;

尝试使用IN值运行它时:

(AUTEUR , 10)

它给我以下错误: ORA-00911:无效字符 ORA-06512:在“SYSTEM.DBOOPDRACHT2”,第38行 ORA-06512:第8行

在第38行,有一个打印件显示我在循环中生成的INSERT语句:

INSERT INTO AUTEUR VALUES( dbms_random.value(0, (power(10,10)-1)/power(10,0)) , dbms_random.string('A',64) , dbms_random.string('A',255) , dbms_random.string('A',255) , dbms_random.string('A',2048)  );

转储部分是,这个INSERT原样,工作正常!但是,无论如何,只要我添加以下行,就会出现整个过程的问题:EXECUTE IMMEDIATE...

知道为什么这会导致问题,而实际的字符串根本就没有问题吗?

提前致谢, 笑脸

1 个答案:

答案 0 :(得分:4)

尝试从行中的连接字符串中删除;字符:

insert_query := insert_query || ' );';

所以EXECUTE IMMEDIATE的查询不会以此结束:

insert_query := insert_query || ' )';