创建表,然后从另一个表中将数据插入新表

时间:2015-07-09 07:42:19

标签: plsql

我创建了一个表名emp_inforamtion,检查表是否存在于数据库中,如果没有,则创建表,然后将bank表中的数据插入emp_information表。

DECLARE
  ncount NUMBER;
  v_sql  VARCHAR2(4000);
  CURSOR c1
  IS
    SELECT bank_code,
      center_code,
      bank_name,
      logo
    FROM bank
    WHERE bank_code ='607143';
BEGIN
  SELECT COUNT(1) INTO ncount FROM tab WHERE tname LIKE '%EMP_INFORMATION%';
  IF (ncount <= 0) THEN
    DBMS_OUTPUT.PUT_LINE (ncount || 'count');
    BEGIN
      v_sql :=' CREATE TABLE EMP_INFORMATION  
(    
emp_id         VARCHAR2(3),    
emp_name       VARCHAR2(20),    
emp_salary     VARCHAR2(3),    
emp_department VARCHAR2(3)  
)';
      EXECUTE immediate v_sql;
      COMMIT;
      BEGIN
        FOR i IN c1
        LOOP
          INSERT
          INTO EMP_INFORMATION
            (
              emp_id,
              emp_name,
              emp_salary,
              emp_department
            )
            VALUES
            (
              i.bank_code,
              i.bank_name,
              i.center_code,
              i.logo
            );
        END LOOP;
      END;
    END;
  END IF;
  end;
/

执行上述光标后发现以下错误:

  

ORA-06550:第30行,第16列:PL / SQL:ORA-00942:表或视图不存在
  ORA-06550:第29行,第11列:PL / SQL:忽略SQL语句

1 个答案:

答案 0 :(得分:1)

在匿名块中使用execute immediate创建表时,请使用execute immediate将数据插入其中。

DECLARE
  ncount NUMBER;
  v_sql  VARCHAR2(4000);
  CURSOR c1
  IS
    SELECT bank_code,
      center_code,
      bank_name,
      logo
    FROM bank
    WHERE bank_code ='607143';
BEGIN
  SELECT COUNT(1) INTO ncount FROM tab WHERE tname LIKE '%EMP_INFORMATION%';
  IF (ncount <= 0) THEN
    DBMS_OUTPUT.PUT_LINE (ncount || 'count');
    BEGIN
      v_sql :=' CREATE TABLE EMP_INFORMATION  
                (    
                  emp_id         VARCHAR2(3),    
                  emp_name       VARCHAR2(20),    
                  emp_salary     VARCHAR2(3),    
                  emp_department VARCHAR2(3)  
                )';
      EXECUTE IMMEDIATE v_sql;
      BEGIN
        FOR i IN c1
        LOOP
          EXECUTE IMMEDIATE 'INSERT
          INTO EMP_INFORMATION
            (
              emp_id,
              emp_name,
              emp_salary,
              emp_department
            )
            VALUES
            (
              :a,
              :b,
              :c,
              :d
            )' using i.bank_code, i.bank_name, i.center_code, i.logo;
        END LOOP;
      END;
    END;
  END IF;
  end;
/
相关问题