需要帮助解决Pl / sql问题

时间:2015-06-04 11:16:51

标签: plsql

我正在尝试用随机数据填充数据库,但主键仍然是唯一的。我可以使用随机数据填充数据库,但现在我正在尝试解决主键问题。

运行此代码时出现错误。

set SERVEROUTPUT on
create or replace 
PROCEDURE fillDatabase(TableIn IN varchar2, Amount IN NUMBER) IS   
columnData varchar2(50);
columnNR   number(10);
str  varchar2(500);
sqlStatement varchar2(500);
l_ran_time  TIMESTAMP;
intlol    NUMBER(38);
prmname    varchar2(50);
prmtab    varchar2(50);
prmkey    number(10);
temp      number(30);
tempstr   varchar2(50);
lolnr     number(10);
strq     varchar2(50);

BEGIN

  lolnr := 1;
  select count(*) into columnNR 
  from user_tab_columns where table_name=TableIn;


  FOR counter IN 1..Amount
  LOOP
sqlStatement := 'insert into '|| TableIn ||' values ('; 
FOR counter2 IN 1..columnNR
  LOOP

    SELECT cols.table_name, cols.column_name into prmtab, prmname
    FROM all_constraints cons, all_cons_columns cols
    WHERE cols.table_name = TableIn
    AND cons.constraint_type = 'P'
    AND cons.constraint_name = cols.constraint_name
    AND cons.owner = cols.owner
    ORDER BY cols.table_name, cols.position;

    tempstr := 'select count(*) into temp from '|| prmtab;
    dbms_output.put_line('test');
    dbms_output.put_line(temp);
    EXECUTE IMMEDIATE tempstr;
    IF temp = 0 
    THEN
      strq := 'SELECT max(' || prmname || ') into prmkey from '|| prmtab || ' order by '|| prmname;
      dbms_output.put_line(strq);
      EXECUTE IMMEDIATE strq;
    END IF;

    select dbms_random.value(0, 20) into intlol from dual;
    select dbms_random.string('U', 20) into str from dual;

    SELECT SYSDATE + dbms_random.value(0, SYSDATE - SYSDATE+1) 
    INTO l_ran_time
    FROM dual;   

    Select DATA_TYPE INTO columnData
    FROM user_tab_columns 
    WHERE table_name= TableIn 
    AND COLUMN_ID = counter2;
    dbms_output.put_line(columnData);
    CASE 

      WHEN columnData = 'VARCHAR2' THEN sqlStatement := sqlStatement ||''''|| str ||''', ';
      WHEN columnData = 'NUMBER'  THEN sqlStatement := sqlStatement || intlol ||', ';
      WHEN columnData = 'TIMESTAMP(6)' THEN sqlStatement := sqlStatement ||''''|| l_ran_time ||''', ';
      ELSE sqlStatement := sqlStatement || NULL || ', ';

    END CASE;

  END LOOP;  
  sqlStatement := SUBSTR(sqlStatement, 0, LENGTH(sqlStatement) -2); 
  sqlStatement := sqlStatement || ')';
  dbms_output.put_line(sqlStatement);
  EXECUTE IMMEDIATE sqlStatement;


END LOOP; 

END fillDatabase;

你能帮助我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

使用模式

app.directive('customDirective', function() {
    return {
        restrict: 'E',
           scope : {
                data       :  "=data", ... 
           } , 
           templateUrl: function(element, attr) {
               // HTML file path 
           }, 
           link: function(scope, element, attrs){
               if(!data){
                   element.remove();
               }
           }
    }
 });

而不是

str := 'select x from t where...';
execute immediate str into var;