执行立即'alter table'错误pl / sql

时间:2015-04-16 10:53:22

标签: database oracle plsql

我有一张桌子,我想创建它的副本。但我希望这个副本是动态的。第一张表可能会改变。在FOR LOOP中,对于每个i(1除外),我想改变第二个表并添加一个名为" Col" +" i"的列。示例:Col1,Col2,Col3。 在调试时,一切都没问题,除了这一行:EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)';抛出2个错误:" ORA-01403:没有找到数据"和" ORA-06512" 我究竟做错了什么?谢谢!

CREATE TABLE first_table (
id NUMBER(2,0) NOT NULL PRIMARY KEY,
col1 NUMBER(2,0) NOT NULL,
col2 NUMBER(2,0) NOT NULL,
col3 NUMBER(2,0) NOT NULL,
col4 NUMBER(2,0) NOT NULL,
col5 NUMBER(2,0) NOT NULL,
col6 NUMBER(2,0) NOT NULL,
col7 NUMBER(2,0) NOT NULL
);

CREATE TABLE second_table (
first_col NUMBER PRIMARY KEY
);

CREATE OR REPLACE PROCEDURE second_table
AS
nr_columns NUMBER(2);
tab_name VARCHAR2(20);
col_nam VARCHAR2(20) := 'COL';
BEGIN

SELECT COUNT (*)
INTO nr_columns
FROM user_tab_columns 
WHERE table_name='FIRST_TABLE';

SELECT table_name
INTO tab_name
FROM user_tab_columns
WHERE column_name ='FIRST_COL';

FOR i IN 1..NR_COLUMNS
LOOP

IF (i=1) THEN
EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' RENAME COLUMN FIRST_COL TO id';
ELSE
EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)';

END IF;
END LOOP;
END;
/

2 个答案:

答案 0 :(得分:3)

它非常适合我。

<强>表格

SQL> CREATE TABLE first_table (
  2  id NUMBER(2,0) NOT NULL PRIMARY KEY,
  3  col1 NUMBER(2,0) NOT NULL,
  4  col2 NUMBER(2,0) NOT NULL,
  5  col3 NUMBER(2,0) NOT NULL,
  6  col4 NUMBER(2,0) NOT NULL,
  7  col5 NUMBER(2,0) NOT NULL,
  8  col6 NUMBER(2,0) NOT NULL,
  9  col7 NUMBER(2,0) NOT NULL
 10  );

Table created.

SQL>
SQL> CREATE TABLE second_table (
  2  first_col NUMBER PRIMARY KEY
  3  );

Table created.

SQL>

<强>程序

SQL> CREATE OR REPLACE PROCEDURE p_second_table
  2  AS
  3    nr_columns NUMBER(2);
  4    tab_name   VARCHAR2(20);
  5    col_nam    VARCHAR2(20) := 'COL';
  6  BEGIN
  7    SELECT COUNT (*)
  8    INTO nr_columns
  9    FROM user_tab_columns
 10    WHERE table_name='FIRST_TABLE';
 11
 12    SELECT table_name
 13    INTO tab_name
 14    FROM user_tab_columns
 15    WHERE column_name ='FIRST_COL';
 16
 17    FOR i IN 1..NR_COLUMNS
 18    LOOP
 19      IF (i=1) THEN
 20        EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' RENAME COLUMN FIRST_COL TO id';
 21        dbms_output.put_line('if');
 22      ELSE
 23        EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)';
 24        dbms_output.put_line('else');
 25      END IF;
 26    END LOOP;
 27  END;
 28  /

Procedure created.

SQL>
SQL> sho err
No errors.
SQL>

我已添加 DBMS_OUTPUT ,以显示何时进入 IF-ELSE 阻止。

让我们测试,然后看看:

SQL> set serveroutput on
SQL> EXEC p_second_table;
if
else
else
else
else
else
else
else

PL/SQL procedure successfully completed.

让我们检查表格定义

SQL> desc second_table;
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------
 ID                                        NOT NULL NUMBER
 COL2                                               NUMBER(2)
 COL3                                               NUMBER(2)
 COL4                                               NUMBER(2)
 COL5                                               NUMBER(2)
 COL6                                               NUMBER(2)
 COL7                                               NUMBER(2)
 COL8                                               NUMBER(2)

SQL>

答案 1 :(得分:0)

您应该检查此查询

SELECT table_name
INTO tab_name
FROM user_tab_columns
WHERE column_name ='FIRST_COL';

异常ORA-01403: no data found表示select没有返回一行。检查表second_table是否存在,或者您是否已在另一个模式中创建它,现在可以在另一个模式中使用。同时在SECOND_TABLE.FIRST_COL

中查看coolumn user_tab_columns的名称