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

Execute immediate 'alter table' error pl/sql

我有一个 table,我想创建它的副本。但我希望这个副本是动态的。首先 table 可能会改变。在 FOR 循环中,对于每个 i(1 除外),我想更改第二个 table 并添加一个名称为 "Col"+"i" 的列。示例:Col1、Col2、Col3。 调试时,一切正常,除了这一行:EXECUTE IMMEDIATE 'ALTER TABLE '||tab_name||' ADD Col'||i||' NUMBER(2)'; 抛出 2 个错误:"ORA-01403: no data found" 和 "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;
/

它非常适合我。

表格

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.

让我们检查一下table定义:

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>

你应该检查这个查询

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

异常 ORA-01403: no data found 表示 select 没有 return 行。检查 table second_table 是否存在,或者您可能已经在另一个模式中创建它并且现在可以在另一个模式中使用。还要检查 user_tab_columns

中的 coolumn SECOND_TABLE.FIRST_COL 的名称